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> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center><hr><h1>database.h</h1><div class="fragment"><pre>00001 <font class="comment">//-&lt; DATABASE.H &gt;----------------------------------------------------*--------*</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 &lt;&lt; (<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 &lt;&lt; dbAllocationQuantumBits;00056 <font class="keyword">const</font> size_t dbPageBits = 12;00057 <font class="keyword">const</font> size_t dbPageSize = 1 &lt;&lt; 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 &lt;&lt; dbBitmapSegmentBits;00062 <font class="keyword">const</font> size_t dbBitmapPages = 1 &lt;&lt; (dbDatabaseOffsetBits-dbBitmapSegmentBits);00063 <font class="keyword">const</font> size_t dbDirtyPageBitmapSize = 1 &lt;&lt; (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-&gt;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-&gt;<a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = <font class="keyword">this</font>;00151         elem-&gt;<a class="code" href="classdbL2List.html#dbL2Listm0">next</a> = next;00152         next = next-&gt;<a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = elem;00153     }00154     <font class="keywordtype">void</font> unlink() { 00155         next-&gt;<a class="code" href="classdbL2List.html#dbL2Listm1">prev</a> = prev;00156         prev-&gt;<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>&amp; 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-&gt;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 + -
显示快捷键?