📄 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_NAMESPACE00019 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 00048 <span class="keyword">enum</span> dbInternalObject { 00049 dbTableRow, 00050 dbPageObjectMarker,00051 dbTtreeMarker,00052 dbTtreeNodeMarker,00053 dbHashTableMarker,00054 dbHashTableItemMarker,00055 dbRtreeMarker,00056 dbRtreePageMarker,00057 00058 dbInternalObjectMarker = 7 <span class="comment">// mask for internals object markers</span>00059 };00060 00061 <span class="keyword">const</span> offs_t dbFreeHandleMarker = (offs_t)1 << (<span class="keyword">sizeof</span>(offs_t)*8 - 1); 00062 00063 <span class="keyword">const</span> size_t dbAllocationQuantumBits = 4;00064 <span class="keyword">const</span> size_t dbAllocationQuantum = 1 << dbAllocationQuantumBits;00065 <span class="keyword">const</span> size_t dbPageBits = 12;00066 <span class="keyword">const</span> size_t dbPageSize = 1 << dbPageBits;00067 <span class="keyword">const</span> size_t dbIdsPerPage = dbPageSize / <span class="keyword">sizeof</span>(oid_t);00068 <span class="keyword">const</span> size_t dbHandlesPerPage = dbPageSize / <span class="keyword">sizeof</span>(offs_t);00069 <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>00070 <span class="keyword">const</span> size_t dbBitmapSegmentBits = dbPageBits + 3 + dbAllocationQuantumBits;00071 <span class="keyword">const</span> size_t dbBitmapSegmentSize = 1 << dbBitmapSegmentBits;00072 <span class="keyword">const</span> size_t dbBitmapPages = 1 << (dbDatabaseOffsetBits-dbBitmapSegmentBits);00073 <span class="keyword">const</span> size_t dbDirtyPageBitmapSize = 1 << (dbDatabaseOidBits-dbPageBits+dbHandleBits-3);00074 <span class="keyword">const</span> size_t dbDefaultSelectionLimit = 2000000000;00075 00076 <span class="keyword">const</span> <span class="keywordtype">int</span> dbBMsearchThreshold = 512;00077 00078 <span class="keyword">const</span> <span class="keywordtype">char</span> dbMatchAnyOneChar = <span class="charliteral">'_'</span>;00079 <span class="keyword">const</span> <span class="keywordtype">char</span> dbMatchAnySubstring = <span class="charliteral">'%'</span>;00080 00081 <span class="keyword">const</span> <span class="keywordtype">int</span> dbMaxReaders = 64; <span class="comment">// maximal number of readers concurrently accessing the database</span>00082 00086 <span class="keyword">enum</span> dbPredefinedIds { 00087 dbInvalidId,00088 dbMetaTableId, 00089 dbBitmapId,00090 dbFirstUserId = dbBitmapId + dbBitmapPages00091 };00092 <a name="l00096"></a><a class="code" href="classdbHeader.html">00096</a> <span class="keyword">class </span><a class="code" href="classdbHeader.html">dbHeader</a> { 00097 <span class="keyword">public</span>:00098 offs_t size; <span class="comment">// database file size</span>00099 int4 curr; <span class="comment">// current root</span>00100 int4 dirty; <span class="comment">// database was not closed normally</span>00101 int4 initialized; <span class="comment">// database is initilaized</span>00102 int4 pad;00103 <span class="keyword">struct </span>{ 00104 offs_t index; <span class="comment">// offset to object index</span>00105 offs_t shadowIndex; <span class="comment">// offset to shadow index</span>00106 oid_t indexSize; <span class="comment">// size of object index</span>00107 oid_t shadowIndexSize; <span class="comment">// size of object index</span>00108 oid_t indexUsed; <span class="comment">// used part of the index </span>00109 oid_t freeList; <span class="comment">// L1 list of free descriptors</span>00110 } root[2];00111 00112 int4 majorVersion;00113 int4 minorVersion;00114 int4 mode;00115 00116 <span class="keyword">enum</span> { 00117 MODE_OID_64 = 0x01,00118 MODE_OFFS_64 = 0x02,00119 MODE_AUTOINCREMENT = 0x04,00120 MODE_RECTANGLE_DIM = 0x0800121 }; 00122 00123 <span class="keywordtype">int</span> getVersion() { 00124 <span class="keywordflow">return</span> majorVersion*100 + minorVersion;00125 }00126 00127 <span class="keywordtype">bool</span> isCompatible();00128 <span class="keyword">static</span> <span class="keywordtype">int</span> getCurrentMode();00129 };00130 00131 <span class="keyword">union </span>dbSynthesizedAttribute;00132 <span class="keyword">struct </span>dbInheritedAttribute;00133 <span class="keyword">class </span>dbDatabaseThreadContext;00134 <span class="keyword">class </span><a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>;00135 <span class="keyword">class </span><a class="code" href="classdbQuery.html">dbQuery</a>;00136 <span class="keyword">class </span>dbExprNode;00137 00138 <span class="keyword">struct </span>dbMemoryStatistic { 00139 offs_t used;00140 offs_t free;00141 offs_t nHoles;00142 offs_t minHoleSize;00143 offs_t maxHoleSize;00144 size_t nHolesOfSize[dbDatabaseOffsetBits];00145 };00146 00147 00148 <span class="keyword">class </span>dbMonitor { 00149 <span class="keyword">public</span>:00150 sharedsem_t sem;00151 sharedsem_t mutatorSem;00152 <span class="keywordtype">int</span> nReaders;00153 <span class="keywordtype">int</span> nWriters;00154 <span class="keywordtype">int</span> nConcurrentWriters;00155 <span class="keywordtype">int</span> nWaitReaders;00156 <span class="keywordtype">int</span> nWaitWriters;00157 <span class="keywordtype">int</span> waitForUpgrade;00158 <span class="keywordtype">int</span> forceCommitCount;00159 <span class="keywordtype">int</span> backupInProgress;00160 <span class="keywordtype">int</span> uncommittedChanges;00161 00162 <span class="keywordtype">int</span> curr; <span class="comment">// copy of header->root, used to allow read access </span>00163 <span class="comment">// to the database during transaction commit</span>00164 00165 <span class="keywordtype">int</span> commitInProgress;00166 <span class="keywordtype">int</span> concurrentTransId;00167 00168 <span class="keywordtype">unsigned</span> lastDeadlockRecoveryTime;00169 00170 <span class="keywordtype">int</span> version; 00171 <span class="keywordtype">int</span> users; 00172 00173 dbProcessId ownerPid;00174 00175 dbDatabaseThreadContext* delayedCommitContext; <span class="comment">// save context of delayed transaction</span>00176 00177 int4 dirtyPagesMap[dbDirtyPageBitmapSize/4];00178 00179 <span class="keywordtype">int</span> sharedLockOwner[dbMaxReaders];00180 <span class="keywordtype">int</span> exclusiveLockOwner;00181 <span class="keywordtype">int</span> clientId;00182 <span class="keywordtype">int</span> upgradeId;00183 00184 <span class="keywordtype">int</span> modified;00185 };00186 <a name="l00190"></a><a class="code" href="classdbL2List.html">00190</a> <span class="keyword">class </span>FASTDB_DLL_ENTRY <a class="code" href="classdbL2List.html">dbL2List</a> { 00191 <span class="keyword">public</span>:00192 <a class="code" href="classdbL2List.html">dbL2List</a>* next; 00193 <a class="code" href="classdbL2List.html">dbL2List</a>* prev; 00194 00195 <span class="keywordtype">void</span> link(<a class="code" href="classdbL2List.html">dbL2List</a>* elem) { 00196 elem-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = <span class="keyword">this</span>;00197 elem-><a class="code" href="classdbL2List.html#dbL2Listm0">next</a> = next;00198 next = next-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = elem;00199 }00200 <span class="keywordtype">void</span> unlink() { 00201 next-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = prev;00202 prev-><a class="code" href="classdbL2List.html#dbL2Listm0">next</a> = next;00203 next = prev = <span class="keyword">this</span>;00204 }00205 <span class="keywordtype">bool</span> isEmpty() { 00206 <span class="keywordflow">return</span> next == <span class="keyword">this</span>;00207 }00208 <span class="keywordtype">void</span> reset() { 00209 next = prev = <span class="keyword">this</span>;00210 } 00211 <a class="code" href="classdbL2List.html">dbL2List</a>() { 00212 next = prev = <span class="keyword">this</span>;00213 }00214 ~<a class="code" href="classdbL2List.html">dbL2List</a>() { 00215 unlink();00216 }00217 };00218 00219 <span class="keyword">class </span>dbVisitedObject {00220 <span class="keyword">public</span>: 00221 dbVisitedObject* next;00222 oid_t oid;00223 00224 dbVisitedObject(oid_t oid, dbVisitedObject* chain) { 00225 this->oid = oid;00226 next = chain;00227 }00228 };00229 00230 <span class="preprocessor">#ifdef AUTO_DETECT_PROCESS_CRASH</span>00231 <span class="preprocessor"></span><span class="keyword">struct </span>dbWatchDogContext : <a class="code" href="classdbL2List.html">dbL2List</a> { 00232 dbThread thread;00233 dbWatchDog watchDog;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -