cursor_8h-source.html
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 400 行 · 第 1/2 页
HTML
400 行
<!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>cursor.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>cursor.h</h1><div class="fragment"><pre>00001 <font class="comment">//-< CURSOR.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: 10-Dec-98 K.A. Knizhnik * GARRET *</font>00007 <font class="comment">//-------------------------------------------------------------------*--------*</font>00008 <font class="comment">// Table cursor</font>00009 <font class="comment">//-------------------------------------------------------------------*--------*</font>00010 00011 <font class="preprocessor">#ifndef __CURSOR_H__</font>00012 <font class="preprocessor"></font><font class="preprocessor">#define __CURSOR_H__</font>00013 <font class="preprocessor"></font>00014 <font class="keyword">class </font>dbOrderByNode;00015 00016 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbSelection { 00017 <font class="keyword">public</font>:00018 <font class="keyword">enum</font> { quantum = 1024 };00019 <font class="keyword">class </font>segment { 00020 <font class="keyword">public</font>: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 <font class="keywordtype">void</font> add(oid_t oid) { 00039 <font class="keywordflow">if</font> (last == NULL) { 00040 first = last = <font class="keyword">new</font> segment(NULL);00041 } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (last->nRows == quantum) { 00042 last = last->next = <font class="keyword">new</font> segment(last);00043 }00044 last->rows[last->nRows++] = oid;00045 nRows += 1;00046 }00047 00048 <font class="keywordtype">void</font> sort(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db, dbOrderByNode* order);00049 <font class="keyword">static</font> <font class="keywordtype">int</font> compare(<a class="code" href="classdbRecord.html">dbRecord</a>* a, <a class="code" href="classdbRecord.html">dbRecord</a>* b, dbOrderByNode* order);00050 00051 <font class="keywordtype">void</font> toArray(oid_t* oids);00052 00053 dbSelection() { 00054 nRows = 0;00055 pos = 0;00056 first = curr = last = NULL;00057 }00058 <font class="keywordtype">void</font> reverse();00059 <font class="keywordtype">void</font> reset();00060 };00061 00062 <font class="keyword">enum</font> dbCursorType { 00063 dbCursorViewOnly,00064 dbCursorForUpdate00065 };00066 <a name="l00070"></a><a class="code" href="classdbAnyCursor.html">00070</a> <font class="keyword">class </font>FASTDB_DLL_ENTRY dbAnyCursor : <font class="keyword">public</font> <a class="code" href="classdbL2List.html">dbL2List</a> { 00071 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbAnyContainer.html">dbAnyContainer</a>;00072 <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="classdbDatabase.html">dbDatabase</a>;00073 <font class="keyword">friend</font> <font class="keyword">class </font>dbHashTable;00074 <font class="keyword">friend</font> <font class="keyword">class </font>dbTtreeNode;00075 <font class="keyword">friend</font> <font class="keyword">class </font>dbSubSql;00076 <font class="keyword">friend</font> <font class="keyword">class </font>dbStatement;00077 <font class="keyword">friend</font> <font class="keyword">class </font>dbServer;00078 <font class="keyword">friend</font> <font class="keyword">class </font>dbCLI;00079 <font class="keyword">public</font>:<a name="l00084"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a12">00084</a> <font class="keywordtype">int</font> getNumberOfRecords() { <font class="keywordflow">return</font> selection.nRows; }00085 00089 <font class="keywordtype">void</font> remove();00090 <a name="l00095"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a14">00095</a> <font class="keywordtype">bool</font> isEmpty() { <font class="keywordflow">return</font> currId == 0; }00096 <a name="l00101"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a15">00101</a> <font class="keywordtype">bool</font> isLimitReached() { <font class="keywordflow">return</font> selection.nRows >= limit; }00102 00110 oid_t* toArrayOfOid(oid_t* arr); 00111 <a name="l00122"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a17">00122</a> <font class="keywordtype">int</font> select(<a class="code" href="classdbQuery.html">dbQuery</a>& query, dbCursorType aType, <font class="keywordtype">void</font>* paramStruct = NULL) {00123 type = aType;00124 reset();00125 paramBase = paramStruct;00126 db->select(<font class="keyword">this</font>, query);00127 paramBase = NULL;00128 <font class="keywordflow">if</font> (gotoFirst() && prefetch) { 00129 fetch();00130 }00131 <font class="keywordflow">return</font> selection.nRows;00132 } 00133 <a name="l00140"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a18">00140</a> <font class="keywordtype">int</font> select(<a class="code" href="classdbQuery.html">dbQuery</a>& query, <font class="keywordtype">void</font>* paramStruct = NULL) { 00141 <font class="keywordflow">return</font> select(query, defaultType, paramStruct);00142 }00143 <a name="l00151"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a19">00151</a> <font class="keywordtype">int</font> select(<font class="keywordtype">char</font> <font class="keyword">const</font>* condition, dbCursorType aType, <font class="keywordtype">void</font>* paramStruct = NULL) { 00152 <a class="code" href="classdbQuery.html">dbQuery</a> query(condition);00153 <font class="keywordflow">return</font> select(query, aType, paramStruct);00154 } 00155 <a name="l00162"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a20">00162</a> <font class="keywordtype">int</font> select(<font class="keywordtype">char</font> <font class="keyword">const</font>* condition, <font class="keywordtype">void</font>* paramStruct = NULL) { 00163 <font class="keywordflow">return</font> select(condition, defaultType, paramStruct);00164 }00165 <a name="l00171"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">00171</a> <font class="keywordtype">int</font> select(dbCursorType aType) { 00172 type = aType;00173 reset();00174 db->select(<font class="keyword">this</font>); 00175 <font class="keywordflow">if</font> (gotoFirst() && prefetch) { 00176 fetch();00177 }00178 <font class="keywordflow">return</font> selection.nRows;00179 } 00180 <a name="l00185"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a22">00185</a> <font class="keywordtype">int</font> select() {00186 <font class="keywordflow">return</font> select(defaultType);00187 }00188 <a name="l00193"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a23">00193</a> <font class="keywordtype">void</font> update() { 00194 assert(type == dbCursorForUpdate && currId != 0);00195 updateInProgress = <font class="keyword">true</font>;00196 db->update(currId, table, record);00197 updateInProgress = <font class="keyword">false</font>;00198 }00199 <a name="l00203"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a24">00203</a> <font class="keywordtype">void</font> removeAll() {00204 assert(db != NULL);00205 db->deleteTable(table);00206 reset();00207 }00208 00212 <font class="keywordtype">void</font> removeAllSelected();00213 <a name="l00217"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a26">00217</a> <font class="keywordtype">void</font> setSelectionLimit(size_t lim) { limit = lim; }00218 <a name="l00222"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a27">00222</a> <font class="keywordtype">void</font> unsetSelectionLimit() { limit = dbDefaultSelectionLimit; }00223 <a name="l00230"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a28">00230</a> <font class="keywordtype">void</font> setPrefetchMode(<font class="keywordtype">bool</font> mode) { prefetch = mode; }00231 00235 <font class="keywordtype">void</font> reset();00236 00241 <font class="keywordtype">bool</font> isLast(); 00242 00247 <font class="keywordtype">bool</font> isFirst(); 00248 00254 <font class="keywordtype">void</font> freeze();00255 00259 <font class="keywordtype">void</font> unfreeze();00260 <a name="l00264"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a34">00264</a> <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* getTable() { <font class="keywordflow">return</font> table; }00265 00266 <font class="keyword">protected</font>: 00267 <a class="code" href="classdbDatabase.html">dbDatabase</a>* db;00268 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table;00269 dbCursorType type;00270 dbCursorType defaultType;00271 dbSelection selection;00272 <font class="keywordtype">bool</font> allRecords;00273 oid_t firstId;00274 oid_t lastId;00275 oid_t currId;00276 byte* record;00277 size_t limit;00278 00279 int4* bitmap; <font class="comment">// bitmap to avoid duplicates</font>00280 size_t bitmapSize;00281 <font class="keywordtype">bool</font> eliminateDuplicates;00282 <font class="keywordtype">bool</font> prefetch;00283 <font class="keywordtype">bool</font> removed; <font class="comment">// current record was removed</font>00284 <font class="keywordtype">bool</font> updateInProgress;00285 00286 <font class="keywordtype">void</font>* paramBase;00287 00288 <font class="keywordtype">void</font> checkForDuplicates() { 00289 <font class="keywordflow">if</font> (!eliminateDuplicates && limit > 1) { 00290 eliminateDuplicates = <font class="keyword">true</font>;00291 size_t size = (db-><a class="code" href="classdbDatabase.html#dbSubSqln19">currIndexSize</a> + 31) / 32;00292 <font class="keywordflow">if</font> (size > bitmapSize) { 00293 <font class="keyword">delete</font>[] bitmap;00294 bitmap = <font class="keyword">new</font> int4[size];00295 bitmapSize = size;00296 }00297 memset(bitmap, 0, size*4);00298 }00299 }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?