📄 cursor_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>FastDB: cursor.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.5 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div><h1>cursor.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< CURSOR.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: 10-Dec-98 K.A. Knizhnik * GARRET *</span>00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>00008 <span class="comment">// Table cursor</span>00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>00010 00011 <span class="preprocessor">#ifndef __CURSOR_H__</span>00012 <span class="preprocessor"></span><span class="preprocessor">#define __CURSOR_H__</span>00013 <span class="preprocessor"></span>00014 <span class="keyword">class </span>dbOrderByNode;00015 00016 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbSelection { 00017 <span class="keyword">public</span>:00018 <span class="keyword">enum</span> { quantum = 1024 };00019 <span class="keyword">class </span>segment { 00020 <span class="keyword">public</span>:00021 segment* prev;00022 segment* next;00023 size_t nRows;00024 oid_t rows[quantum];00025 00026 segment(segment* after) { 00027 prev = after;00028 next = NULL;00029 nRows = 0;00030 } 00031 };00032 segment* first;00033 segment* last;00034 segment* curr;00035 size_t nRows;00036 size_t pos;00037 00038 segment* createNewSegment(segment* after);00039 00040 <span class="keywordtype">void</span> add(oid_t oid) {00041 <span class="keywordflow">if</span> (last == NULL) { 00042 first = last = createNewSegment(NULL);00043 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last->nRows == quantum) { 00044 last = last->next = createNewSegment(last);00045 }00046 last->rows[last->nRows++] = oid;00047 nRows += 1;00048 }00049 00050 <span class="keywordtype">void</span> sort(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db, dbOrderByNode* order);00051 <span class="keyword">static</span> <span class="keywordtype">int</span> compare(<a class="code" href="classdbRecord.html">dbRecord</a>* a, <a class="code" href="classdbRecord.html">dbRecord</a>* b, dbOrderByNode* order);00052 <span class="keyword">static</span> <span class="keywordtype">int</span> compare(oid_t a, oid_t b, dbOrderByNode* order);00053 00054 <span class="keywordtype">void</span> toArray(oid_t* oids) <span class="keyword">const</span>;00055 00056 dbSelection() { 00057 nRows = 0;00058 pos = 0;00059 first = curr = last = NULL;00060 }00061 <span class="keywordtype">void</span> reverse();00062 <span class="keywordtype">void</span> reset();00063 };00064 00065 <span class="keyword">enum</span> dbCursorType { 00066 dbCursorViewOnly,00067 dbCursorForUpdate00068 };00069 <a name="l00073"></a><a class="code" href="classdbAnyCursor.html">00073</a> <span class="keyword">class </span>FASTDB_DLL_ENTRY dbAnyCursor : <span class="keyword">public</span> <a class="code" href="classdbL2List.html">dbL2List</a> { 00074 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbAnyContainer.html">dbAnyContainer</a>;00075 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbDatabase.html">dbDatabase</a>;00076 <span class="keyword">friend</span> <span class="keyword">class </span>dbHashTable;00077 <span class="keyword">friend</span> <span class="keyword">class </span>dbTtreeNode;00078 <span class="keyword">friend</span> <span class="keyword">class </span>dbSubSql;00079 <span class="keyword">friend</span> <span class="keyword">class </span>dbStatement;00080 <span class="keyword">friend</span> <span class="keyword">class </span>dbServer;00081 <span class="keyword">friend</span> <span class="keyword">class </span>dbCLI;00082 <span class="keyword">public</span>:<a name="l00087"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a14">00087</a> <span class="keywordtype">int</span> getNumberOfRecords()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> selection.nRows; }00088 00092 <span class="keywordtype">void</span> remove();00093 <a name="l00098"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a16">00098</a> <span class="keywordtype">bool</span> isEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> currId == 0; }00099 <a name="l00104"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a18">00104</a> <span class="keywordtype">bool</span> isUpdateCursor()<span class="keyword"> const </span>{ 00105 <span class="keywordflow">return</span> type == dbCursorForUpdate;00106 }00107 <a name="l00112"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a19">00112</a> <span class="keywordtype">bool</span> isLimitReached()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> selection.nRows >= limit; }00113 00121 oid_t* toArrayOfOid(oid_t* arr) <span class="keyword">const</span>; 00122 <a name="l00133"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">00133</a> <span class="keywordtype">int</span> select(<a class="code" href="classdbQuery.html">dbQuery</a>& query, dbCursorType aType, <span class="keywordtype">void</span>* paramStruct = NULL) {00134 type = aType;00135 reset();00136 paramBase = paramStruct;00137 db->select(<span class="keyword">this</span>, query);00138 paramBase = NULL;00139 <span class="keywordflow">if</span> (gotoFirst() && prefetch) { 00140 fetch();00141 }00142 <span class="keywordflow">return</span> selection.nRows;00143 } 00144 <a name="l00151"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a22">00151</a> <span class="keywordtype">int</span> select(<a class="code" href="classdbQuery.html">dbQuery</a>& query, <span class="keywordtype">void</span>* paramStruct = NULL) { 00152 <span class="keywordflow">return</span> select(query, defaultType, paramStruct);00153 }00154 <a name="l00162"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a23">00162</a> <span class="keywordtype">int</span> select(<span class="keywordtype">char</span> <span class="keyword">const</span>* condition, dbCursorType aType, <span class="keywordtype">void</span>* paramStruct = NULL) { 00163 <a class="code" href="classdbQuery.html">dbQuery</a> query(condition);00164 <span class="keywordflow">return</span> select(query, aType, paramStruct);00165 } 00166 <a name="l00173"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a24">00173</a> <span class="keywordtype">int</span> select(<span class="keywordtype">char</span> <span class="keyword">const</span>* condition, <span class="keywordtype">void</span>* paramStruct = NULL) { 00174 <span class="keywordflow">return</span> select(condition, defaultType, paramStruct);00175 }00176 <a name="l00182"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a25">00182</a> <span class="keywordtype">int</span> select(dbCursorType aType) { 00183 type = aType;00184 reset();00185 db->select(<span class="keyword">this</span>); 00186 <span class="keywordflow">if</span> (gotoFirst() && prefetch) { 00187 fetch();00188 }00189 <span class="keywordflow">return</span> selection.nRows;00190 } 00191 <a name="l00196"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a26">00196</a> <span class="keywordtype">int</span> select() {00197 <span class="keywordflow">return</span> select(defaultType);00198 }00199 00206 <span class="keywordtype">int</span> selectByKey(<span class="keywordtype">char</span> <span class="keyword">const</span>* key, <span class="keywordtype">void</span> <span class="keyword">const</span>* value);00207 00215 <span class="keywordtype">int</span> selectByKeyRange(<span class="keywordtype">char</span> <span class="keyword">const</span>* key, <span class="keywordtype">void</span> <span class="keyword">const</span>* minValue, <span class="keywordtype">void</span> <span class="keyword">const</span>* maxValue);00216 <a name="l00221"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a29">00221</a> <span class="keywordtype">void</span> update() { 00222 assert(type == dbCursorForUpdate && currId != 0);00223 updateInProgress = <span class="keyword">true</span>;00224 db->update(currId, table, record);00225 updateInProgress = <span class="keyword">false</span>;00226 }00227 <a name="l00231"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a30">00231</a> <span class="keywordtype">void</span> removeAll() {00232 assert(db != NULL);00233 db->deleteTable(table);00234 reset();00235 }00236 00240 <span class="keywordtype">void</span> removeAllSelected();00241 <a name="l00245"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a32">00245</a> <span class="keywordtype">void</span> setSelectionLimit(size_t lim) { limit = lim; }00246 <a name="l00250"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a33">00250</a> <span class="keywordtype">void</span> unsetSelectionLimit() { limit = dbDefaultSelectionLimit; }00251 <a name="l00258"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a34">00258</a> <span class="keywordtype">void</span> setPrefetchMode(<span class="keywordtype">bool</span> mode) { prefetch = mode; }00259 00263 <span class="keywordtype">void</span> reset();00264 00269 <span class="keywordtype">bool</span> isLast() <span class="keyword">const</span>; 00270 00275 <span class="keywordtype">bool</span> isFirst() <span class="keyword">const</span>; 00276 00282 <span class="keywordtype">void</span> freeze();00283 00287 <span class="keywordtype">void</span> unfreeze();00288 00296 <span class="keywordtype">bool</span> skip(<span class="keywordtype">int</span> n);00297 00298 00304 <span class="keywordtype">int</span> seek(oid_t oid);00305 <a name="l00309"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a42">00309</a> <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* getTable() { <span class="keywordflow">return</span> table; }00310 00311 <a name="l00316"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a43">00316</a> <span class="keywordtype">void</span> setTable(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* aTable) { 00317 table = aTable;00318 db = aTable-><a class="code" href="classdbTableDescriptor.html#dbTableDescriptorp10">db</a>;00319 }00320 <a name="l00325"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a44">00325</a> <span class="keywordtype">void</span> setRecord(<span class="keywordtype">void</span>* rec) { 00326 record = (byte*)rec;00327 }00328 <a name="l00333"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a45">00333</a> <span class="keywordtype">void</span>* getRecord() { 00334 <span class="keywordflow">return</span> record;00335 }00336 00341 <span class="keywordtype">bool</span> isInSelection(oid_t oid);00342 00343 <a name="l00348"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a47">00348</a> <span class="keywordtype">void</span> fetch() { 00349 assert(!(db->currIndex[currId] 00350 & (dbInternalObjectMarker|dbFreeHandleMarker)));00351 table->columns->fetchRecordFields(record, 00352 (byte*)db->getRow(currId));00353 }00354 00355 00356 <span class="keyword">protected</span>: 00357 <a class="code" href="classdbDatabase.html">dbDatabase</a>* db;00358 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table;00359 dbCursorType type;00360 dbCursorType defaultType;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -