📄 cursor_8h-source.html
字号:
00383 size_t limit;
00384
00385 int4* bitmap; <span class="comment">// bitmap to avoid duplicates</span>
00386 size_t bitmapSize;
00387 <span class="keywordtype">bool</span> eliminateDuplicates;
00388 <span class="keywordtype">bool</span> checkForDuplicatedIsEnabled;
00389 <span class="keywordtype">bool</span> prefetch;
00390 <span class="keywordtype">bool</span> removed; <span class="comment">// current record was removed</span>
00391 <span class="keywordtype">bool</span> lastRecordWasDeleted; <span class="comment">//last record was deleted</span>
00392
00393 size_t stmtLimitStart;
00394 size_t stmtLimitLen;
00395 size_t nSkipped;
00396
00397 <span class="keywordtype">void</span>* paramBase;
00398
00399 <span class="keywordtype">void</span> checkForDuplicates();
00400 <span class="keywordtype">void</span> deallocateBitmap();
00401
00402 <span class="keywordtype">bool</span> isMarked(oid_t oid) {
00403 <span class="keywordflow">return</span> bitmap != NULL && (bitmap[oid >> 5] & (1 << (oid & 31))) != 0;
00404 }
00405
00406 <span class="keywordtype">void</span> setStatementLimit(<a class="code" href="classdbQuery.html">dbQuery</a> <span class="keyword">const</span>& q) {
00407 stmtLimitStart = q.<a class="code" href="classdbCompiledQuery.html#dbQuerym8">stmtLimitStartPtr</a> != NULL ? (nat4)*q.<a class="code" href="classdbCompiledQuery.html#dbQuerym8">stmtLimitStartPtr</a> : q.<a class="code" href="classdbCompiledQuery.html#dbQuerym6">stmtLimitStart</a>;
00408 stmtLimitLen = q.<a class="code" href="classdbCompiledQuery.html#dbQuerym9">stmtLimitLenPtr</a> != NULL ? (nat4)*q.<a class="code" href="classdbCompiledQuery.html#dbQuerym9">stmtLimitLenPtr</a> : q.<a class="code" href="classdbCompiledQuery.html#dbQuerym7">stmtLimitLen</a>;
00409 }
00410
00411 <span class="keywordtype">void</span> truncateSelection() {
00412 selection.truncate(stmtLimitStart, stmtLimitLen);
00413 }
00414
00415 <span class="keywordtype">void</span> mark(oid_t oid) {
00416 <span class="keywordflow">if</span> (bitmap != NULL) {
00417 bitmap[oid >> 5] |= 1 << (oid & 31);
00418 }
00419 }
00420
00421 <span class="keywordtype">bool</span> add(oid_t oid) {
00422 <span class="keywordflow">if</span> (selection.nRows < limit && selection.nRows < stmtLimitLen) {
00423 <span class="keywordflow">if</span> (nSkipped < stmtLimitStart) {
00424 nSkipped += 1;
00425 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00426 }
00427 <span class="keywordflow">if</span> (eliminateDuplicates) {
00428 <span class="keywordflow">if</span> (bitmap[oid >> 5] & (1 << (oid & 31))) {
00429 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00430 }
00431 bitmap[oid >> 5] |= 1 << (oid & 31);
00432 }
00433 selection.add(oid);
00434 <span class="keywordflow">return</span> selection.nRows < limit;
00435 }
00436 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00437 }
00438
00439 byte* fetchNext();
00440 byte* fetchPrev();
00441
00442 <span class="keywordtype">bool</span> gotoNext();
00443 <span class="keywordtype">bool</span> gotoPrev();
00444 <span class="keywordtype">bool</span> gotoFirst();
00445 <span class="keywordtype">bool</span> gotoLast();
00446
00447 <span class="keywordtype">bool</span> moveNext();
00448 <span class="keywordtype">bool</span> movePrev();
00449
00450 <span class="keywordtype">void</span> setCurrent(<a class="code" href="classdbAnyReference.html">dbAnyReference</a> <span class="keyword">const</span>& ref);
00451
00452 <span class="keywordtype">void</span> adjustReferences(size_t base, size_t size, <span class="keywordtype">long</span> shift) {
00453 <span class="keywordflow">if</span> (currId != 0 && record != NULL) {
00454 table-><a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn4">columns</a>-><a class="code" href="classdbFieldDescriptor.html#dbFieldDescriptora8">adjustReferences</a>(record, base, size, shift);
00455 }
00456 }
00457
00458 dbAnyCursor(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>& aTable, dbCursorType aType, byte* rec)
00459 : table(&aTable),type(aType),defaultType(aType),
00460 allRecords(false),currId(0),record(rec)
00461 {
00462 db = aTable.<a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn10">db</a>;
00463 limit = dbDefaultSelectionLimit;
00464 prefetch = rec != NULL;
00465 removed = <span class="keyword">false</span>;
00466 bitmap = NULL;
00467 bitmapSize = 0;
00468 eliminateDuplicates = <span class="keyword">false</span>;
00469 checkForDuplicatedIsEnabled = <span class="keyword">true</span>;
00470 paramBase = NULL;
00471 stmtLimitLen = dbDefaultSelectionLimit;
00472 stmtLimitStart = 0;
00473 nSkipped = 0;
00474 }
00475 <span class="keyword">public</span>:
00476 dbAnyCursor()
00477 : table(NULL),type(dbCursorViewOnly),defaultType(dbCursorViewOnly),
00478 allRecords(false),currId(0),record(NULL)
00479 {
00480 limit = dbDefaultSelectionLimit;
00481 prefetch = <span class="keyword">false</span>;
00482 removed = <span class="keyword">false</span>;
00483 bitmap = NULL;
00484 bitmapSize = 0;
00485 eliminateDuplicates = <span class="keyword">false</span>;
00486 checkForDuplicatedIsEnabled = <span class="keyword">true</span>;
00487 db = NULL;
00488 paramBase = NULL;
00489 stmtLimitLen = dbDefaultSelectionLimit;
00490 stmtLimitStart = 0;
00491 nSkipped = 0;
00492 }
00493 ~dbAnyCursor();
00494 };
00495
00496
00500 <span class="keyword">template</span><<span class="keyword">class</span> T>
<a name="l00501"></a><a class="code" href="classdbCursor.html">00501</a> <span class="keyword">class </span><a class="code" href="classdbCursor.html">dbCursor</a> : <span class="keyword">public</span> dbAnyCursor {
00502 <span class="keyword">private</span>:
00503 <span class="comment">// Itis not possible to copy cursors</span>
00504 <a class="code" href="classdbCursor.html">dbCursor<T></a> operator = (<a class="code" href="classdbCursor.html">dbCursor<T></a> <span class="keyword">const</span>& src) {
00505 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
00506 }
00507
00508 <span class="keyword">protected</span>:
00509 T record;
00510
00511 <span class="keyword">public</span>:
<a name="l00516"></a><a class="code" href="classdbCursor.html#dbCursora0">00516</a> <a class="code" href="classdbCursor.html#dbCursora0">dbCursor</a>(dbCursorType type = dbCursorViewOnly)
00517 : dbAnyCursor(T::dbDescriptor, type, (byte*)&record) {}
00518
<a name="l00525"></a><a class="code" href="classdbCursor.html#dbCursora1">00525</a> <a class="code" href="classdbCursor.html#dbCursora0">dbCursor</a>(<a class="code" href="classdbDatabase.html">dbDatabase</a>* aDb, dbCursorType type = dbCursorViewOnly)
00526 : dbAnyCursor(T::dbDescriptor, type, (byte*)&record)
00527 {
00528 db = aDb;
00529 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* theTable = db-><a class="code" href="classdbDatabase.html#dbSubSqla41">lookupTable</a>(table);
00530 <span class="keywordflow">if</span> (theTable != NULL) {
00531 table = theTable;
00532 }
00533 }
00534
<a name="l00539"></a><a class="code" href="classdbCursor.html#dbCursora2">00539</a> T* <a class="code" href="classdbCursor.html#dbCursora2">get</a>() {
00540 <span class="keywordflow">return</span> currId == 0 ? (T*)NULL : &record;
00541 }
00542
<a name="l00547"></a><a class="code" href="classdbCursor.html#dbCursora3">00547</a> T* <a class="code" href="classdbCursor.html#dbCursora3">next</a>() {
00548 <span class="keywordflow">return</span> (T*)fetchNext();
00549 }
00550
<a name="l00555"></a><a class="code" href="classdbCursor.html#dbCursora4">00555</a> T* <a class="code" href="classdbCursor.html#dbCursora4">prev</a>() {
00556 <span class="keywordflow">return</span> (T*)fetchPrev();
00557 }
00558
<a name="l00563"></a><a class="code" href="classdbCursor.html#dbCursora5">00563</a> T* <a class="code" href="classdbCursor.html#dbCursora5">first</a>() {
00564 <span class="keywordflow">if</span> (gotoFirst()) {
00565 <a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a47">fetch</a>();
00566 <span class="keywordflow">return</span> &record;
00567 }
00568 <span class="keywordflow">return</span> NULL;
00569 }
00570
<a name="l00575"></a><a class="code" href="classdbCursor.html#dbCursora6">00575</a> T* <a class="code" href="classdbCursor.html#dbCursora6">last</a>() {
00576 <span class="keywordflow">if</span> (gotoLast()) {
00577 <a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a47">fetch</a>();
00578 <span class="keywordflow">return</span> &record;
00579 }
00580 <span class="keywordflow">return</span> NULL;
00581 }
00582
<a name="l00588"></a><a class="code" href="classdbCursor.html#dbCursora7">00588</a> <span class="keywordtype">int</span> <a class="code" href="classdbCursor.html#dbCursora7">seek</a>(<a class="code" href="classdbReference.html">dbReference<T></a> <span class="keyword">const</span>& ref) {
00589 <span class="keywordflow">return</span> <a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a41">dbAnyCursor::seek</a>(ref.<a class="code" href="classdbAnyReference.html#dbReferencea13">getOid</a>());
00590 }
00591
<a name="l00596"></a><a class="code" href="classdbCursor.html#dbCursora8">00596</a> T* <a class="code" href="classdbCursor.html#dbCursora8">operator -></a>() {
00597 assert(currId != 0);
00598 <span class="keywordflow">return</span> &record;
00599 }
00600
<a name="l00606"></a><a class="code" href="classdbCursor.html#dbCursora9">00606</a> T* <a class="code" href="classdbCursor.html#dbCursora9">at</a>(<a class="code" href="classdbReference.html">dbReference<T></a> <span class="keyword">const</span>& ref) {
00607 setCurrent(ref);
00608 <span class="keywordflow">return</span> &record;
00609 }
00610
<a name="l00615"></a><a class="code" href="classdbCursor.html#dbCursora10">00615</a> <span class="keywordtype">void</span> <a class="code" href="classdbCursor.html#dbCursora10">toArray</a>(<a class="code" href="classdbArray.html">dbArray</a>< <a class="code" href="classdbReference.html">dbReference<T></a> >& arr)<span class="keyword"> const </span>{
00616 arr.resize(selection.nRows);
00617 <a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a19">toArrayOfOid</a>((oid_t*)arr.base());
00618 }
00619
<a name="l00624"></a><a class="code" href="classdbCursor.html#dbCursora11">00624</a> <a class="code" href="classdbReference.html">dbReference<T></a> <a class="code" href="classdbCursor.html#dbCursora11">currentId</a>()<span class="keyword"> const </span>{
00625 <span class="keywordflow">return</span> <a class="code" href="classdbReference.html">dbReference<T></a>(currId);
00626 }
00627
<a name="l00632"></a><a class="code" href="classdbCursor.html#dbCursora12">00632</a> <span class="keywordtype">bool</span> <a class="code" href="classdbCursor.html#dbCursora12">isInSelection</a>(<a class="code" href="classdbReference.html">dbReference<T></a>& ref) {
00633 <span class="keywordflow">return</span> <a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a46">dbAnyCursor::isInSelection</a>(ref.<a class="code" href="classdbAnyReference.html#dbReferencea13">getOid</a>());
00634 }
00635 };
00636
00637 <span class="keyword">class </span>dbParallelQueryContext {
00638 <span class="keyword">public</span>:
00639 <a class="code" href="classdbDatabase.html">dbDatabase</a>* <span class="keyword">const</span> db;
00640 <a class="code" href="classdbCompiledQuery.html">dbCompiledQuery</a>* <span class="keyword">const</span> query;
00641 oid_t firstRow;
00642 <a class="code" href="classdbTable.html">dbTable</a>* table;
00643 dbAnyCursor* cursor;
00644 dbSelection selection[dbMaxParallelSearchThreads];
00645
00646 <span class="keywordtype">void</span> search(<span class="keywordtype">int</span> i);
00647
00648 dbParallelQueryContext(<a class="code" href="classdbDatabase.html">dbDatabase</a>* aDb, <a class="code" href="classdbTable.html">dbTable</a>* aTable,
00649 <a class="code" href="classdbCompiledQuery.html">dbCompiledQuery</a>* aQuery, dbAnyCursor* aCursor)
00650 : db(aDb), query(aQuery), firstRow(aTable->firstRow), table(aTable), cursor(aCursor) {}
00651 };
00652
00653
00654 <span class="keyword">extern</span> <span class="keywordtype">char</span>* strupper(<span class="keywordtype">char</span>* s);
00655
00656 <span class="keyword">extern</span> <span class="keywordtype">char</span>* strlower(<span class="keywordtype">char</span>* s);
00657
00658 END_FASTDB_NAMESPACE
00659
00660 <span class="preprocessor">#endif</span>
</pre></div><hr><address style="align: right;"><small>Generated on Thu Feb 14 12:42:30 2008 for FastDB by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0
width=110 height=53></a>1.2.18 </small></address>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -