📄 cursor_8h-source.html
字号:
<!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.18 -->
<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 <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 BEGIN_FASTDB_NAMESPACE
00015
00016 <span class="keyword">class </span>dbOrderByNode;
00017
00018 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbSelection {
00019 <span class="keyword">public</span>:
00020 <span class="keyword">enum</span> { quantum = 1024 };
00021 <span class="keyword">class </span>segment {
00022 <span class="keyword">public</span>:
00023 segment* prev;
00024 segment* next;
00025 size_t nRows;
00026 oid_t rows[quantum];
00027
00028 segment(segment* after) {
00029 prev = after;
00030 next = NULL;
00031 nRows = 0;
00032 }
00033 };
00034 segment* first;
00035 segment* last;
00036 segment* curr;
00037 size_t nRows;
00038 size_t pos;
00039
00040 segment* createNewSegment(segment* after);
00041
00042 <span class="keywordtype">void</span> add(oid_t oid) {
00043 <span class="keywordflow">if</span> (last == NULL) {
00044 first = last = createNewSegment(NULL);
00045 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last->nRows == quantum) {
00046 last = last->next = createNewSegment(last);
00047 }
00048 last->rows[last->nRows++] = oid;
00049 nRows += 1;
00050 }
00051
00052 <span class="keywordtype">void</span> sort(<a class="code" href="classdbDatabase.html">dbDatabase</a>* db, dbOrderByNode* order);
00053 <span class="keyword">static</span> <span class="keywordtype">int</span> compare(oid_t a, oid_t b, dbOrderByNode* order);
00054
00055 <span class="keywordtype">void</span> toArray(oid_t* oids) <span class="keyword">const</span>;
00056 <span class="keywordtype">void</span> truncate(size_t from, size_t length);
00057
00058 dbSelection() {
00059 nRows = 0;
00060 pos = 0;
00061 first = curr = last = NULL;
00062 }
00063 <span class="keywordtype">void</span> reverse();
00064 <span class="keywordtype">void</span> reset();
00065 };
00066
00067 <span class="keyword">enum</span> dbCursorType {
00068 dbCursorViewOnly,
00069 dbCursorForUpdate
00070 };
00071
<a name="l00075"></a><a class="code" href="classdbAnyCursor.html">00075</a> <span class="keyword">class </span>FASTDB_DLL_ENTRY dbAnyCursor : <span class="keyword">public</span> <a class="code" href="classdbL2List.html">dbL2List</a> {
00076 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbAnyContainer.html">dbAnyContainer</a>;
00077 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbDatabase.html">dbDatabase</a>;
00078 <span class="keyword">friend</span> <span class="keyword">class </span>dbHashTable;
00079 <span class="keyword">friend</span> <span class="keyword">class </span>dbTtreeNode;
00080 <span class="keyword">friend</span> <span class="keyword">class </span>dbRtreePage;
00081 <span class="keyword">friend</span> <span class="keyword">class </span>dbSubSql;
00082 <span class="keyword">friend</span> <span class="keyword">class </span>dbStatement;
00083 <span class="keyword">friend</span> <span class="keyword">class </span>dbServer;
00084 <span class="keyword">friend</span> <span class="keyword">class </span>dbCLI;
00085 <span class="keyword">friend</span> <span class="keyword">class </span>JniResultSet;
00086 <span class="keyword">public</span>:
<a name="l00091"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a13">00091</a> <span class="keywordtype">int</span> getNumberOfRecords()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (int)selection.nRows; }
00092
00096 <span class="keywordtype">void</span> remove();
00097
<a name="l00102"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a15">00102</a> <span class="keywordtype">bool</span> isEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> currId == 0; }
00103
<a name="l00108"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a17">00108</a> <span class="keywordtype">bool</span> isUpdateCursor()<span class="keyword"> const </span>{
00109 <span class="keywordflow">return</span> type == dbCursorForUpdate;
00110 }
00111
<a name="l00116"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a18">00116</a> <span class="keywordtype">bool</span> isLimitReached()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> selection.nRows >= limit || selection.nRows >= stmtLimitLen; }
00117
00125 oid_t* toArrayOfOid(oid_t* arr) <span class="keyword">const</span>;
00126
<a name="l00137"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">00137</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) {
00138 type = aType;
00139 reset();
00140 paramBase = paramStruct;
00141 db->select(<span class="keyword">this</span>, query);
00142 paramBase = NULL;
00143 <span class="keywordflow">if</span> (gotoFirst() && prefetch) {
00144 fetch();
00145 }
00146 <span class="keywordflow">return</span> (int)selection.nRows;
00147 }
00148
<a name="l00155"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a21">00155</a> <span class="keywordtype">int</span> select(<a class="code" href="classdbQuery.html">dbQuery</a>& query, <span class="keywordtype">void</span>* paramStruct = NULL) {
00156 <span class="keywordflow">return</span> select(query, defaultType, paramStruct);
00157 }
00158
<a name="l00166"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a22">00166</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) {
00167 <a class="code" href="classdbQuery.html">dbQuery</a> query(condition);
00168 <span class="keywordflow">return</span> select(query, aType, paramStruct);
00169 }
00170
<a name="l00177"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a23">00177</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) {
00178 <span class="keywordflow">return</span> select(condition, defaultType, paramStruct);
00179 }
00180
<a name="l00186"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a24">00186</a> <span class="keywordtype">int</span> select(dbCursorType aType) {
00187 type = aType;
00188 reset();
00189 db->select(<span class="keyword">this</span>);
00190 <span class="keywordflow">if</span> (gotoFirst() && prefetch) {
00191 fetch();
00192 }
00193 <span class="keywordflow">return</span> (int)selection.nRows;
00194 }
00195
<a name="l00200"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a25">00200</a> <span class="keywordtype">int</span> select() {
00201 <span class="keywordflow">return</span> select(defaultType);
00202 }
00203
00210 <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);
00211
00219 <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);
00220
<a name="l00225"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a28">00225</a> <span class="keywordtype">void</span> update() {
00226 assert(type == dbCursorForUpdate && currId != 0);
00227 db->update(currId, table, record);
00228 }
00229
<a name="l00233"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a29">00233</a> <span class="keywordtype">void</span> removeAll() {
00234 assert(db != NULL);
00235 db->deleteTable(table);
00236 reset();
00237 }
00238
00242 <span class="keywordtype">void</span> removeAllSelected();
00243
<a name="l00247"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a31">00247</a> <span class="keywordtype">void</span> setSelectionLimit(size_t lim) { limit = lim; }
00248
<a name="l00252"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a32">00252</a> <span class="keywordtype">void</span> unsetSelectionLimit() { limit = dbDefaultSelectionLimit; }
00253
<a name="l00260"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a33">00260</a> <span class="keywordtype">void</span> setPrefetchMode(<span class="keywordtype">bool</span> mode) { prefetch = mode; }
00261
00262
<a name="l00267"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a34">00267</a> <span class="keywordtype">void</span> enableCheckForDuplicates(<span class="keywordtype">bool</span> enabled) {
00268 checkForDuplicatedIsEnabled = enabled;
00269 }
00270
00271
00275 <span class="keywordtype">void</span> reset();
00276
00281 <span class="keywordtype">bool</span> isLast() <span class="keyword">const</span>;
00282
00287 <span class="keywordtype">bool</span> isFirst() <span class="keyword">const</span>;
00288
00294 <span class="keywordtype">void</span> freeze();
00295
00299 <span class="keywordtype">void</span> unfreeze();
00300
00308 <span class="keywordtype">bool</span> skip(<span class="keywordtype">int</span> n);
00309
00310
00316 <span class="keywordtype">int</span> seek(oid_t oid);
00317
<a name="l00321"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a42">00321</a> <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* getTable() { <span class="keywordflow">return</span> table; }
00322
00323
<a name="l00328"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a43">00328</a> <span class="keywordtype">void</span> setTable(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* aTable) {
00329 table = aTable;
00330 db = aTable-><a class="code" href="classdbTableDescriptor.html#dbTableDescriptorn10">db</a>;
00331 }
00332
<a name="l00337"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a44">00337</a> <span class="keywordtype">void</span> setRecord(<span class="keywordtype">void</span>* rec) {
00338 record = (byte*)rec;
00339 }
00340
<a name="l00345"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a45">00345</a> <span class="keywordtype">void</span>* getRecord() {
00346 <span class="keywordflow">return</span> record;
00347 }
00348
00353 <span class="keywordtype">bool</span> isInSelection(oid_t oid);
00354
00355
<a name="l00360"></a><a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a47">00360</a> <span class="keywordtype">void</span> fetch() {
00361 assert(!(db->currIndex[currId]
00362 & (dbInternalObjectMarker|dbFreeHandleMarker)));
00363 table->columns->fetchRecordFields(record,
00364 (byte*)db->getRow(currId));
00365 }
00366
00370 <span class="keywordtype">bool</span> hasNext() <span class="keyword">const</span>;
00371
00372 <span class="keyword">protected</span>:
00373 <a class="code" href="classdbDatabase.html">dbDatabase</a>* db;
00374 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table;
00375 dbCursorType type;
00376 dbCursorType defaultType;
00377 dbSelection selection;
00378 <span class="keywordtype">bool</span> allRecords;
00379 oid_t firstId;
00380 oid_t lastId;
00381 oid_t currId;
00382 byte* record;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -