📄 database_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>database.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.18 -->
<center>
<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center>
<hr><h1>database.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< DATABASE.H >----------------------------------------------------*--------*</span>
00002 <span class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</span>
00003 <span class="comment">// (Main Memory Database Management System) * /\| *</span>
00004 <span class="comment">// * / \ *</span>
00005 <span class="comment">// Created: 20-Nov-98 K.A. Knizhnik * / [] \ *</span>
00006 <span class="comment">// Last update: 23-Dec-98 K.A. Knizhnik * GARRET *</span>
00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>
00008 <span class="comment">// Database management</span>
00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>
00010
00011 <span class="preprocessor">#ifndef __DATABASE_H__</span>
00012 <span class="preprocessor"></span><span class="preprocessor">#define __DATABASE_H__</span>
00013 <span class="preprocessor"></span>
00014 <span class="preprocessor">#include "class.h"</span>
00015 <span class="preprocessor">#include "reference.h"</span>
00016 <span class="preprocessor">#include "file.h"</span>
00017
00018 BEGIN_FASTDB_NAMESPACE
00019
00023 <span class="preprocessor">#ifdef DISKLESS_CONFIGURATION</span>
00024 <span class="preprocessor"></span><span class="comment">// In diskless confiuration database can not be reallocated</span>
00025 <span class="keyword">const</span> size_t dbDefaultInitDatabaseSize = 32*1024*1024;
00026 <span class="preprocessor">#else</span>
00027 <span class="preprocessor"></span><span class="keyword">const</span> size_t dbDefaultInitDatabaseSize = 1024*1024;
00028 <span class="preprocessor">#endif</span>
00029 <span class="preprocessor"></span>
00033 <span class="keyword">const</span> size_t dbDefaultInitIndexSize = 512*1024;
00034
00038 <span class="keyword">const</span> size_t dbDefaultExtensionQuantum = 4*1024*1024;
00039
00043 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> dbMaxParallelSearchThreads = 64;
00044
00045 <span class="keyword">const</span> <span class="keywordtype">int</span> dbDefaultParallelScanThreshold = 1000;
00046 <span class="keyword">const</span> <span class="keywordtype">int</span> dbDefaultPollInterval = 100*1000; <span class="comment">// milliseconds</span>
00047 <span class="keyword">const</span> <span class="keywordtype">int</span> dbOpenPollInterval = 1000; <span class="comment">// milliseconds</span>
00048 <span class="keyword">const</span> <span class="keywordtype">int</span> dbWaitReadyTimeout = 60*1000; <span class="comment">// milliseconds</span>
00049 <span class="keyword">const</span> <span class="keywordtype">int</span> dbWaitStatusTimeout = 60*1000; <span class="comment">// milliseconds </span>
00050 <span class="keyword">const</span> <span class="keywordtype">int</span> dbRecoveryConnectionAttempts = 3;
00051 <span class="keyword">const</span> <span class="keywordtype">int</span> dbStartupConnectionAttempts = 60;
00052 <span class="keyword">const</span> <span class="keywordtype">int</span> dbReplicationWriteTimeout = 60*1000; <span class="comment">// milliseconds </span>
00053 <span class="keyword">const</span> <span class="keywordtype">int</span> dbMaxAsyncRecoveryIterations = 1000;
00054 <span class="keyword">const</span> <span class="keywordtype">int</span> dbTableHashSize = 1009;
00055
00059 <span class="keyword">enum</span> dbInternalObject {
00060 dbTableRow,
00061 dbPageObjectMarker,
00062 dbTtreeMarker,
00063 dbTtreeNodeMarker,
00064 dbHashTableMarker,
00065 dbHashTableItemMarker,
00066 dbRtreeMarker,
00067 dbRtreePageMarker,
00068
00069 dbInternalObjectMarker = 7 <span class="comment">// mask for internals object markers</span>
00070 };
00071
00072 <span class="keyword">const</span> offs_t dbFreeHandleMarker = (offs_t)1 << (<span class="keyword">sizeof</span>(offs_t)*8 - 1);
00073
00074 <span class="keyword">const</span> size_t dbAllocationQuantumBits = 4;
00075 <span class="keyword">const</span> size_t dbAllocationQuantum = 1 << dbAllocationQuantumBits;
00076 <span class="keyword">const</span> size_t dbPageBits = 12;
00077 <span class="keyword">const</span> size_t dbPageSize = 1 << dbPageBits;
00078 <span class="keyword">const</span> size_t dbIdsPerPage = dbPageSize / <span class="keyword">sizeof</span>(oid_t);
00079 <span class="keyword">const</span> size_t dbHandlesPerPage = dbPageSize / <span class="keyword">sizeof</span>(offs_t);
00080 <span class="keyword">const</span> size_t dbHandleBits = 1 + <span class="keyword">sizeof</span>(offs_t)/4; <span class="comment">// log(sizeof(offs_t))</span>
00081 <span class="keyword">const</span> size_t dbBitmapSegmentBits = dbPageBits + 3 + dbAllocationQuantumBits;
00082 <span class="keyword">const</span> size_t dbBitmapSegmentSize = 1 << dbBitmapSegmentBits;
00083 <span class="keyword">const</span> size_t dbBitmapPages = 1 << (dbDatabaseOffsetBits-dbBitmapSegmentBits);
00084 <span class="keyword">const</span> size_t dbDirtyPageBitmapSize = 1 << (dbDatabaseOidBits-dbPageBits+dbHandleBits-3);
00085 <span class="keyword">const</span> size_t dbDefaultSelectionLimit = 2000000000;
00086
00087 <span class="keyword">const</span> <span class="keywordtype">int</span> dbBMsearchThreshold = 512;
00088
00089 <span class="keyword">const</span> <span class="keywordtype">char</span> dbMatchAnyOneChar = <span class="charliteral">'_'</span>;
00090 <span class="keyword">const</span> <span class="keywordtype">char</span> dbMatchAnySubstring = <span class="charliteral">'%'</span>;
00091
00092 <span class="keyword">const</span> <span class="keywordtype">int</span> dbMaxReaders = 64; <span class="comment">// maximal number of readers concurrently accessing the database</span>
00093
00097 <span class="keyword">enum</span> dbPredefinedIds {
00098 dbInvalidId,
00099 dbMetaTableId,
00100 dbBitmapId,
00101 dbFirstUserId = dbBitmapId + dbBitmapPages
00102 };
00103
<a name="l00107"></a><a class="code" href="classdbHeader.html">00107</a> <span class="keyword">class </span><a class="code" href="classdbHeader.html">dbHeader</a> {
00108 <span class="keyword">public</span>:
00109 offs_t size; <span class="comment">// database file size</span>
00110 int4 curr; <span class="comment">// current root</span>
00111 int4 dirty; <span class="comment">// database was not closed normally</span>
00112 int4 initialized; <span class="comment">// database is initilaized</span>
00113 <span class="preprocessor">#if (dbDatabaseOffsetBits > 32 && defined(ALIGN_HEADER)) || defined(PAD_HEADER)</span>
00114 <span class="preprocessor"></span> int4 pad;
00115 <span class="preprocessor">#endif</span>
00116 <span class="preprocessor"></span> <span class="keyword">struct </span>{
00117 offs_t index; <span class="comment">// offset to object index</span>
00118 offs_t shadowIndex; <span class="comment">// offset to shadow index</span>
00119 oid_t indexSize; <span class="comment">// size of object index</span>
00120 oid_t shadowIndexSize; <span class="comment">// size of object index</span>
00121 oid_t indexUsed; <span class="comment">// used part of the index </span>
00122 oid_t freeList; <span class="comment">// L1 list of free descriptors</span>
00123 } root[2];
00124
00125 int4 majorVersion;
00126 int4 minorVersion;
00127 int4 mode;
00128
00129 <span class="keyword">enum</span> {
00130 MODE_OID_64 = 0x01,
00131 MODE_OFFS_64 = 0x02,
00132 MODE_AUTOINCREMENT = 0x04,
00133 MODE_RECTANGLE_DIM = 0x08
00134 };
00135
00136 <span class="keywordtype">int</span> getVersion() {
00137 <span class="keywordflow">return</span> majorVersion*100 + minorVersion;
00138 }
00139
00140 <span class="keywordtype">bool</span> isCompatible();
00141 <span class="keyword">static</span> <span class="keywordtype">int</span> getCurrentMode();
00142 };
00143
00144 <span class="keyword">union </span>dbSynthesizedAttribute;
00145 <span class="keyword">struct </span>dbInheritedAttribute;
00146 <span class="keyword">class </span>dbDatabaseThreadContext;
00147 <span class="keyword">class </span><a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>;
00148 <span class="keyword">class </span><a class="code" href="classdbQuery.html">dbQuery</a>;
00149 <span class="keyword">class </span>dbExprNode;
00150
00151 <span class="keyword">struct </span>dbMemoryStatistic {
00152 offs_t used;
00153 offs_t free;
00154 offs_t nHoles;
00155 offs_t minHoleSize;
00156 offs_t maxHoleSize;
00157 size_t nHolesOfSize[dbDatabaseOffsetBits];
00158 };
00159
00160 <span class="keyword">class </span>FixedSizeAllocator
00161 {
00162 <span class="keyword">struct </span>Hole {
00163 Hole* next;
00164 offs_t offs;
00165 };
00166
00167 size_t minSize;
00168 size_t maxSize;
00169 size_t quantum;
00170 size_t nChains;
00171 size_t bufSize;
00172 Hole** chains;
00173 Hole* vacant;
00174 Hole* holes;
00175
00176 <span class="keyword">public</span>:
00177 size_t hits;
00178 size_t faults;
00179 size_t retries;
00180
00181 FixedSizeAllocator();
00182 ~FixedSizeAllocator();
00183
00184 <span class="keywordtype">void</span> init(size_t minSize, size_t maxSize, size_t quantum, size_t bufSize);
00185 <span class="keywordtype">void</span> reset();
00186
00187 offs_t allocate(size_t size) {
00188 <span class="keywordflow">if</span> (size - minSize <= maxSize - minSize) {
00189 size_t i = (size - minSize + quantum - 1) / quantum;
00190 Hole* hole = chains[i];
00191 <span class="keywordflow">if</span> (hole != NULL) {
00192 hits += 1;
00193 chains[i] = hole->next;
00194 hole->next = vacant;
00195 vacant = hole;
00196 <span class="keywordflow">return</span> hole->offs;
00197 }
00198 faults += 1;
00199 }
00200 <span class="keywordflow">return</span> 0;
00201 }
00202
00203 <span class="keywordtype">bool</span> free(offs_t offs, size_t size) {
00204 <span class="keywordflow">if</span> (vacant != NULL && size - minSize <= maxSize - minSize) {
00205 size_t i = (size - minSize + quantum - 1) / quantum;
00206 Hole* hole = vacant;
00207 vacant = hole->next;
00208 hole->next = chains[i];
00209 chains[i] = hole;
00210 hole->offs = offs;
00211 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00212 }
00213 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00214 }
00215 };
00216
00217
00218 <span class="keyword">class </span>dbMonitor {
00219 <span class="keyword">public</span>:
00220 sharedsem_t sem;
00221 sharedsem_t mutatorSem;
00222 <span class="keywordtype">int</span> nReaders;
00223 <span class="keywordtype">int</span> nWriters;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -