database_8h-source.html
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 674 行 · 第 1/3 页
HTML
674 行
00311 00317 dbErrorHandler setErrorHandler(dbErrorHandler newHandler); 00318 00326 <font class="keyword">virtual</font> <font class="keywordtype">void</font> handleError(dbErrorClass error, <font class="keywordtype">char</font> <font class="keyword">const</font>* msg = NULL, 00327 <font class="keywordtype">int</font> arg = 0); 00328 00335 <font class="keywordtype">void</font> insertRecord(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table, <a class="code" href="classdbAnyReference.html">dbAnyReference</a>* ref, 00336 <font class="keywordtype">void</font> <font class="keyword">const</font>* record);00337 <a name="l00341"></a><a class="code" href="classdbDatabase.html#dbSubSqla19">00341</a> <font class="keywordtype">bool</font> isOpen()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> opened; }00342 00346 <font class="keywordtype">int</font> getVersion();00347 <a name="l00352"></a><a class="code" href="classdbDatabase.html#dbSubSqla21">00352</a> <font class="keywordtype">void</font> setFileSizeLimit(size_t limit) { 00353 dbFileSizeLimit = limit;00354 }00355 00356 <font class="preprocessor">#ifndef NO_MEMBER_TEMPLATES</font>00357 <font class="preprocessor"></font>00362 <font class="keyword">template</font><<font class="keyword">class</font> T><a name="l00363"></a><a class="code" href="classdbDatabase.html#dbSubSqla22">00363</a> <a class="code" href="classdbReference.html">dbReference<T></a> insert(T <font class="keyword">const</font>& record) {00364 <a class="code" href="classdbReference.html">dbReference<T></a> ref;00365 insertRecord(lookupTable(&T::dbDescriptor), &ref, &record);00366 <font class="keywordflow">return</font> ref;00367 }00368 <font class="preprocessor">#endif</font>00369 <font class="preprocessor"></font>00375 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* lookupTable(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* desc);00376 00377 <font class="keyword">enum</font> dbAccessType { 00378 dbReadOnly = 0,00379 dbAllAccess = 1,00380 dbConcurrentRead = 2,00381 dbConcurrentUpdate = 300382 };00394 dbDatabase(dbAccessType type = dbAllAccess,00395 size_t dbInitSize = dbDefaultInitDatabaseSize,00396 size_t dbExtensionQuantum = dbDefaultExtensionQuantum,00397 size_t dbInitIndexSize = dbDefaultInitIndexSize,00398 <font class="keywordtype">int</font> nThreads = 1 00399 <font class="comment">// Do not specify the last parameter - it is only for checking</font>00400 <font class="comment">// that application and GigaBASE library were built with the </font>00401 <font class="comment">// same compiler options (-DNO_PTHREADS is critical)</font>00402 <font class="comment">// Mismached parameters should cause linker error</font>00403 #ifdef NO_PTHREADS00404 , <font class="keywordtype">bool</font> usePthreads = <font class="keyword">false</font>00405 #endif00406 );00410 <font class="keyword">virtual</font> ~dbDatabase(); 00411 00417 <font class="keyword">static</font> <font class="keywordtype">void</font> cleanup();00418 00419 <font class="keyword">const</font> dbAccessType accessType;00420 <font class="keyword">const</font> size_t initSize;00421 <font class="keyword">const</font> size_t extensionQuantum;00422 <font class="keyword">const</font> size_t initIndexSize;00423 00424 <font class="keyword">static</font> <font class="keywordtype">unsigned</font> dbParallelScanThreshold; 00425 00426 <font class="keyword">protected</font>:00427 <font class="keyword">static</font> size_t internalObjectSize[];00428 00429 dbThreadPool threadPool;00430 00431 dbThreadContext<dbDatabaseThreadContext> threadContext;00432 00433 byte* baseAddr; <font class="comment">// base address of database file mapping</font>00434 <a class="code" href="classdbHeader.html">dbHeader</a>* header; <font class="comment">// base address of database file mapping</font>00435 offs_t* currIndex; <font class="comment">// current database object index</font>00436 offs_t* index[2];00437 <font class="keywordtype">unsigned</font> parThreads;00438 <font class="keywordtype">bool</font> modified;00439 00440 size_t currRBitmapPage; <font class="comment">//current bitmap page for allocating records</font>00441 size_t currRBitmapOffs; <font class="comment">//offset in current bitmap page for allocating</font>00442 <font class="comment">//unaligned records</font>00443 size_t currPBitmapPage; <font class="comment">//current bitmap page for allocating page objects</font>00444 size_t currPBitmapOffs; <font class="comment">//offset in current bitmap page for allocating</font>00445 <font class="comment">//page objects</font>00446 <font class="keyword">struct </font>dbLocation { 00447 offs_t pos;00448 size_t size;00449 dbLocation* next;00450 };00451 dbLocation* reservedChain;00452 00453 <font class="keywordtype">char</font>* databaseName;00454 <font class="keywordtype">int</font> databaseNameLen;00455 <font class="keywordtype">char</font>* fileName;00456 <font class="keywordtype">int</font> version;00457 00458 size_t mmapSize;00459 00460 size_t committedIndexSize;00461 size_t currIndexSize;00462 oid_t updatedRecordId;00463 00464 <font class="keywordtype">unsigned</font> dbWaitLockTimeout;00465 00466 size_t dbFileSizeLimit;00467 00468 <font class="keywordtype">bool</font> uncommittedChanges;00469 00470 dbFile file;00471 dbSharedObject<dbMonitor> shm;00472 dbGlobalCriticalSection cs;00473 dbGlobalCriticalSection mutatorCS;00474 dbInitializationMutex initMutex;00475 dbSemaphore writeSem; 00476 dbSemaphore readSem; 00477 dbSemaphore upgradeSem; 00478 dbEvent backupCompletedEvent;00479 dbMonitor* monitor;00480 00481 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* tables;00482 00483 <font class="keywordtype">int</font>* bitmapPageAvailableSpace;00484 <font class="keywordtype">bool</font> opened;00485 00486 <font class="keywordtype">long</font> allocatedSize;00487 00488 time_t commitDelay; 00489 time_t commitTimeout;00490 time_t commitTimerStarted;00491 00492 dbMutex delayedCommitStartTimerMutex;00493 dbMutex delayedCommitStopTimerMutex;00494 dbLocalEvent delayedCommitStartTimerEvent; 00495 dbEvent delayedCommitStopTimerEvent; 00496 dbLocalEvent commitThreadSyncEvent;00497 00498 dbMutex backupMutex; 00499 dbLocalEvent backupInitEvent;00500 <font class="keywordtype">char</font>* backupFileName;00501 time_t backupPeriod;00502 <font class="keywordtype">bool</font> stopDelayedCommitThread;00503 00504 dbThread backupThread;00505 dbThread commitThread;00506 00507 <font class="keywordtype">int</font> accessCount;00508 00509 <a class="code" href="classdbL2List.html">dbL2List</a> threadContextList;00510 dbMutex threadContextListMutex;00511 00512 dbErrorHandler errorHandler;00513 00514 <font class="keywordtype">void</font> delayedCommit();00515 <font class="keywordtype">void</font> backupScheduler();00516 00517 <font class="keyword">static</font> <font class="keywordtype">void</font> thread_proc delayedCommitProc(<font class="keywordtype">void</font>* arg) { 00518 ((dbDatabase*)arg)->delayedCommit();00519 }00520 00521 <font class="keyword">static</font> <font class="keywordtype">void</font> thread_proc backupSchedulerProc(<font class="keywordtype">void</font>* arg) { 00522 ((dbDatabase*)arg)->backupScheduler();00523 }00524 00529 <font class="keywordtype">void</font> commit(dbDatabaseThreadContext* ctx);00530 00535 <font class="keywordtype">void</font> restoreTablesConsistency();00536 <a name="l00542"></a><a class="code" href="classdbDatabase.html#dbSubSqlb4">00542</a> <a class="code" href="classdbRecord.html">dbRecord</a>* getRow(oid_t oid) { 00543 assert(!(currIndex[oid]&(dbFreeHandleMarker|dbInternalObjectMarker)));00544 <font class="keywordflow">return</font> (<a class="code" href="classdbRecord.html">dbRecord</a>*)(baseAddr + currIndex[oid]); 00545 }00546 00556 <a class="code" href="classdbRecord.html">dbRecord</a>* putRow(oid_t oid, size_t newSize); 00557 <a name="l00563"></a><a class="code" href="classdbDatabase.html#dbSubSqlb6">00563</a> <a class="code" href="classdbRecord.html">dbRecord</a>* putRow(oid_t oid) { 00564 <font class="keywordflow">if</font> (oid < committedIndexSize && index[0][oid] == index[1][oid]) { 00565 size_t size = getRow(oid)-><a class="code" href="classdbRecord.html#dbTablem7">size</a>;00566 size_t pageNo = oid/dbHandlesPerPage;00567 monitor->dirtyPagesMap[pageNo >> 5] |= 1 << (pageNo & 31);00568 cloneBitmap(currIndex[oid], size);00569 allocate(size, oid);00570 } 00571 <font class="keywordflow">return</font> (<a class="code" href="classdbRecord.html">dbRecord</a>*)(baseAddr + currIndex[oid]); 00572 }00573 <a name="l00579"></a><a class="code" href="classdbDatabase.html#dbSubSqlb7">00579</a> byte* get(oid_t oid) { 00580 <font class="keywordflow">return</font> baseAddr + (currIndex[oid] & ~dbInternalObjectMarker); 00581 }00582 <a name="l00588"></a><a class="code" href="classdbDatabase.html#dbSubSqlb8">00588</a> byte* put(oid_t oid) { 00589 <font class="keywordflow">if</font> (oid < committedIndexSize && index[0][oid] == index[1][oid]) { 00590 offs_t offs = currIndex[oid];00591 size_t size = internalObjectSize[offs & dbInternalObjectMarker];00592 size_t pageNo = oid/dbHandlesPerPage;00593 monitor->dirtyPagesMap[pageNo >> 5] |= 1 << (pageNo & 31);00594 allocate(size, oid);00595 cloneBitmap(offs & ~dbInternalObjectMarker, size);00596 } 00597 <font class="keywordflow">return</font> baseAddr + (currIndex[oid] & ~dbInternalObjectMarker); 00598 }00599 00612 <font class="keywordtype">bool</font> isIndexApplicable(<a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor, 00613 dbExprNode* expr, dbExprNode* andExpr, 00614 <a class="code" href="classdbFieldDescriptor.html">dbFieldDescriptor</a>* &indexedField);00615 00627 <font class="keywordtype">bool</font> isIndexApplicable(<a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor, 00628 dbExprNode* expr, dbExprNode* andExpr);00629 00642 <font class="keywordtype">bool</font> followInverseReference(dbExprNode* expr, dbExprNode* andExpr, 00643 <a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor, oid_t iref);00644 00652 <font class="keywordtype">bool</font> existsInverseReference(dbExprNode* expr, <font class="keywordtype">int</font> nExistsClauses);00653 00663 <font class="keyword">static</font> <font class="keywordtype">void</font> _fastcall execute(dbExprNode* expr, 00664 dbInheritedAttribute& iattr,00665 dbSynthesizedAttribute& sattr);00666 00676 <font class="keywordtype">bool</font> evaluate(dbExprNode* expr, oid_t oid, <a class="code" href="classdbTable.html">dbTable</a>* table, <a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor);00677 00682 <font class="keywordtype">void</font> select(<a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor);00683 00689 <font class="keywordtype">void</font> select(<a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor, <a class="code" href="classdbQuery.html">dbQuery</a>& query);00690 00696 <font class="keywordtype">void</font> traverse(<a class="code" href="classdbAnyCursor.html">dbAnyCursor</a>* cursor, <a class="code" href="classdbQuery.html">dbQuery</a>& query);00697 00704 <font class="keywordtype">void</font> update(oid_t oid, <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table, <font class="keywordtype">void</font> <font class="keyword">const</font>* record);00705 00711 <font class="keywordtype">void</font> remove(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table, oid_t oid);00712 00720 offs_t allocate(size_t size, oid_t oid = 0);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?