database_8h-source.html
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 674 行 · 第 1/3 页
HTML
674 行
<!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.15 --><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 <font class="comment">//-< DATABASE.H >----------------------------------------------------*--------*</font>00002 <font class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</font>00003 <font class="comment">// (Main Memory Database Management System) * /\| *</font>00004 <font class="comment">// * / \ *</font>00005 <font class="comment">// Created: 20-Nov-98 K.A. Knizhnik * / [] \ *</font>00006 <font class="comment">// Last update: 23-Dec-98 K.A. Knizhnik * GARRET *</font>00007 <font class="comment">//-------------------------------------------------------------------*--------*</font>00008 <font class="comment">// Database management</font>00009 <font class="comment">//-------------------------------------------------------------------*--------*</font>00010 00011 <font class="preprocessor">#ifndef __DATABASE_H__</font>00012 <font class="preprocessor"></font><font class="preprocessor">#define __DATABASE_H__</font>00013 <font class="preprocessor"></font>00014 <font class="preprocessor">#include "class.h"</font>00015 <font class="preprocessor">#include "reference.h"</font>00016 <font class="preprocessor">#include "file.h"</font>00017 00021 <font class="keyword">const</font> size_t dbDefaultInitDatabaseSize = 1024*1024;00022 00026 <font class="keyword">const</font> size_t dbDefaultInitIndexSize = 512*1024;00027 00031 <font class="keyword">const</font> size_t dbDefaultExtensionQuantum = 4*1024*1024;00032 00036 <font class="keyword">const</font> <font class="keywordtype">unsigned</font> dbMaxParallelSearchThreads = 64;00037 00041 <font class="keyword">enum</font> dbInternalObject { 00042 dbTableRow, 00043 dbPageObjectMarker,00044 dbTtreeMarker,00045 dbTtreeNodeMarker,00046 dbHashTableMarker,00047 dbHashTableItemMarker,00048 00049 dbInternalObjectMarker = 7 <font class="comment">// mask for internals object markers</font>00050 };00051 00052 <font class="keyword">const</font> offs_t dbFreeHandleMarker = (offs_t)1 << (<font class="keyword">sizeof</font>(offs_t)*8 - 1); 00053 00054 <font class="keyword">const</font> size_t dbAllocationQuantumBits = 4;00055 <font class="keyword">const</font> size_t dbAllocationQuantum = 1 << dbAllocationQuantumBits;00056 <font class="keyword">const</font> size_t dbPageBits = 12;00057 <font class="keyword">const</font> size_t dbPageSize = 1 << dbPageBits;00058 <font class="keyword">const</font> size_t dbIdsPerPage = dbPageSize / <font class="keyword">sizeof</font>(oid_t);00059 <font class="keyword">const</font> size_t dbHandlesPerPage = dbPageSize / <font class="keyword">sizeof</font>(offs_t);00060 <font class="keyword">const</font> size_t dbBitmapSegmentBits = dbPageBits + 3 + dbAllocationQuantumBits;00061 <font class="keyword">const</font> size_t dbBitmapSegmentSize = 1 << dbBitmapSegmentBits;00062 <font class="keyword">const</font> size_t dbBitmapPages = 1 << (dbDatabaseOffsetBits-dbBitmapSegmentBits);00063 <font class="keyword">const</font> size_t dbDirtyPageBitmapSize = 1 << (dbDatabaseOidBits-dbPageBits-3);00064 <font class="keyword">const</font> size_t dbDefaultSelectionLimit = 2000000000;00065 00066 <font class="keyword">const</font> <font class="keywordtype">int</font> dbBMsearchThreshold = 512;00067 00068 <font class="keyword">const</font> <font class="keywordtype">char</font> dbMatchAnyOneChar = <font class="charliteral">'_'</font>;00069 <font class="keyword">const</font> <font class="keywordtype">char</font> dbMatchAnySubstring = <font class="charliteral">'%'</font>;00070 00074 <font class="keyword">enum</font> dbPredefinedIds { 00075 dbInvalidId,00076 dbMetaTableId, 00077 dbBitmapId,00078 dbFirstUserId = dbBitmapId + dbBitmapPages00079 };00080 <a name="l00084"></a><a class="code" href="classdbHeader.html">00084</a> <font class="keyword">class </font><a class="code" href="classdbHeader.html">dbHeader</a> { 00085 <font class="keyword">public</font>:00086 offs_t size; <font class="comment">// database file size</font>00087 int4 curr; <font class="comment">// current root</font>00088 int4 dirty; <font class="comment">// database was not closed normally</font>00089 int4 initialized; <font class="comment">// database is initilaized</font>00090 <font class="keyword">struct </font>{ 00091 offs_t index; <font class="comment">// offset to object index</font>00092 offs_t shadowIndex; <font class="comment">// offset to shadow index</font>00093 oid_t indexSize; <font class="comment">// size of object index</font>00094 oid_t shadowIndexSize; <font class="comment">// size of object index</font>00095 oid_t indexUsed; <font class="comment">// used part of the index </font>00096 oid_t freeList; <font class="comment">// L1 list of free descriptors</font>00097 } root[2];00098 00099 int4 majorVersion;00100 int4 minorVersion;00101 };00102 00103 <font class="keyword">union </font>dbSynthesizedAttribute;00104 <font class="keyword">struct </font>dbInheritedAttribute;00105 <font class="keyword">class </font>dbDatabaseThreadContext;00106 <font class="keyword">class </font><a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>;00107 <font class="keyword">class </font><a class="code" href="classdbQuery.html">dbQuery</a>;00108 <font class="keyword">class </font>dbExprNode;00109 00110 <font class="keyword">class </font>dbMonitor { 00111 <font class="keyword">public</font>:00112 sharedsem_t sem;00113 sharedsem_t mutatorSem;00114 <font class="keywordtype">int</font> nReaders;00115 <font class="keywordtype">int</font> nWriters;00116 <font class="keywordtype">int</font> nWaitReaders;00117 <font class="keywordtype">int</font> nWaitWriters;00118 <font class="keywordtype">int</font> waitForUpgrade;00119 <font class="keywordtype">int</font> forceCommitCount;00120 <font class="keywordtype">int</font> backupInProgress;00121 <font class="keywordtype">int</font> uncommittedChanges;00122 00123 <font class="keywordtype">int</font> curr; <font class="comment">// copy of header->root, used to allow read access </font>00124 <font class="comment">// to the database during transaction commit</font>00125 00126 <font class="keywordtype">int</font> commitInProgress;00127 <font class="keywordtype">int</font> concurrentTransId;00128 00129 <font class="keywordtype">unsigned</font> lastDeadlockRecoveryTime;00130 00131 <font class="keywordtype">int</font> version; 00132 <font class="keywordtype">int</font> users; 00133 00134 dbProcessId ownerPid;00135 00136 dbDatabaseThreadContext* delayedCommitContext; <font class="comment">// save context of delayed transaction</font>00137 00138 <font class="keywordtype">int</font> dirtyPagesMap[dbDirtyPageBitmapSize/4];00139 };00140 <a name="l00144"></a><a class="code" href="classdbL2List.html">00144</a> <font class="keyword">class </font>FASTDB_DLL_ENTRY <a class="code" href="classdbL2List.html">dbL2List</a> { 00145 <font class="keyword">public</font>:00146 <a class="code" href="classdbL2List.html">dbL2List</a>* next; 00147 <a class="code" href="classdbL2List.html">dbL2List</a>* prev; 00148 00149 <font class="keywordtype">void</font> link(<a class="code" href="classdbL2List.html">dbL2List</a>* elem) { 00150 elem-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = <font class="keyword">this</font>;00151 elem-><a class="code" href="classdbL2List.html#dbL2Listm0">next</a> = next;00152 next = next-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = elem;00153 }00154 <font class="keywordtype">void</font> unlink() { 00155 next-><a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = prev;00156 prev-><a class="code" href="classdbL2List.html#dbL2Listm0">next</a> = next;00157 next = prev = <font class="keyword">this</font>;00158 }00159 <font class="keywordtype">bool</font> isEmpty() { 00160 <font class="keywordflow">return</font> next == <font class="keyword">this</font>;00161 }00162 <font class="keywordtype">void</font> reset() { 00163 next = prev = <font class="keyword">this</font>;00164 } 00165 <a class="code" href="classdbL2List.html">dbL2List</a>() { 00166 next = prev = <font class="keyword">this</font>;00167 }00168 ~<a class="code" href="classdbL2List.html">dbL2List</a>() { 00169 unlink();00170 }00171 };00172 <a name="l00176"></a><a class="code" href="classdbDatabase.html">00176</a> <font class="keyword">class </font>FASTDB_DLL_ENTRY dbDatabase { 00177 <font class="keyword">friend</font> <font class="keyword">class </font>dbSelection;00178 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>;00179 <font class="keyword">friend</font> <font class="keyword">class </font>dbHashTable;00180 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbQuery.html">dbQuery</a>;00181 <font class="keyword">friend</font> <font class="keyword">class </font>dbTtree;00182 <font class="keyword">friend</font> <font class="keyword">class </font>dbTtreeNode;00183 <font class="keyword">friend</font> <font class="keyword">class </font>dbParallelQueryContext; 00184 <font class="keyword">friend</font> <font class="keyword">class </font>dbServer;00185 <font class="keyword">friend</font> <font class="keyword">class </font>dbColumnBinding;00186 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbUserFunctionArgument.html">dbUserFunctionArgument</a>;00187 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbAnyContainer.html">dbAnyContainer</a>;00188 <font class="keyword">friend</font> <font class="keyword">class </font>dbCLI;00189 <font class="keyword">friend</font> <font class="keyword">class </font>GiSTdb;00190 <font class="keyword">public</font>:00200 <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* databaseName, 00201 <font class="keywordtype">char</font> <font class="keyword">const</font>* fileName = NULL, 00202 time_t waitLockTimeoutMsec = INFINITE, 00203 time_t commitDelaySec = 0);00204 00208 <font class="keywordtype">void</font> close();00209 00213 <font class="keywordtype">void</font> commit();00214 00219 <font class="keywordtype">void</font> precommit();00220 00224 <font class="keywordtype">void</font> rollback();00225 00232 <font class="keywordtype">void</font> scheduleBackup(<font class="keywordtype">char</font> <font class="keyword">const</font>* fileName, time_t periodSec);00233 00238 <font class="keywordtype">void</font> attach();00239 00240 <font class="keyword">enum</font> DetachFlags { 00241 COMMIT = 1,00242 DESTROY_CONTEXT = 200243 };00248 <font class="keywordtype">void</font> detach(<font class="keywordtype">int</font> flags = COMMIT|DESTROY_CONTEXT);00249 <a name="l00253"></a><a class="code" href="classdbDatabase.html#dbSubSqla11">00253</a> <font class="keywordtype">void</font> lock() { beginTransaction(dbExclusiveLock); }00254 00263 <font class="keywordtype">bool</font> backup(<font class="keywordtype">char</font> <font class="keyword">const</font>* file, <font class="keywordtype">bool</font> compactify);00264 <a name="l00269"></a><a class="code" href="classdbDatabase.html#dbSubSqla13">00269</a> <font class="keywordtype">void</font> assign(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>& desc) { 00270 assert(((<font class="keywordtype">void</font>)<font class="stringliteral">"Table is not yet assigned to the database"</font>, 00271 desc.<a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn3">tableId</a> == 0));00272 desc.<a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn10">db</a> = <font class="keyword">this</font>; 00273 desc.<a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn11">fixedDatabase</a> = <font class="keyword">true</font>;00274 }00275 00283 <font class="keywordtype">void</font> setConcurrency(<font class="keywordtype">unsigned</font> nThreads);00284 <a name="l00289"></a><a class="code" href="classdbDatabase.html#dbSubSqla15">00289</a> <font class="keywordtype">long</font> getAllocatedSize() { <font class="keywordflow">return</font> allocatedSize; }00290 <a name="l00295"></a><a class="code" href="classdbDatabase.html#dbSubSqla16">00295</a> <font class="keywordtype">long</font> getDatabaseSize() { <font class="keywordflow">return</font> header->size; }00296 00297 <font class="keyword">enum</font> dbErrorClass { 00298 NoError, 00299 QueryError,00300 ArithmeticError,00301 IndexOutOfRangeError,00302 DatabaseOpenError,00303 FileError,00304 OutOfMemoryError,00305 Deadlock,00306 NullReferenceError,00307 LockRevoked,00308 FileLimitExeeded 00309 };00310 <font class="keyword">typedef</font> void (*dbErrorHandler)(dbErrorClass error, <font class="keywordtype">char</font> <font class="keyword">const</font>* msg, <font class="keywordtype">int</font> msgarg);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?