📄 compiler_8h-source.html
字号:
00254 }
00255 ~dbExprNode();
00256
00257 <span class="keywordtype">void</span>* operator new(size_t size EXTRA_DEBUG_NEW_PARAMS) {
00258 <span class="keywordflow">return</span> dbExprNodeAllocator::instance.allocate();
00259 }
00260
00261 <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* ptr EXTRA_DEBUG_NEW_PARAMS) {
00262 dbExprNodeAllocator::instance.deallocate((dbExprNode*)ptr);
00263 }
00264 };
00265
00266
00267 <span class="keyword">class </span>dbExprNodeSegment {
00268 <span class="keyword">public</span>:
00269 <span class="keyword">enum</span> { allocationQuantum = 1024};
00270 <span class="keywordtype">char</span> buf[<span class="keyword">sizeof</span>(dbExprNode)*allocationQuantum];
00271 dbExprNodeSegment* next;
00272 };
00273
00274
00275 <span class="keyword">class </span>dbBinding {
00276 <span class="keyword">public</span>:
00277 dbBinding* next;
00278 <span class="keywordtype">char</span> <span class="keyword">const</span>* name;
00279 <span class="keywordtype">bool</span> used;
00280 <span class="keywordtype">int</span> index;
00281 };
00282
00283 <span class="keyword">class </span>dbOrderByNode {
00284 <span class="keyword">public</span>:
00285 dbOrderByNode* next;
00286 <a class="code" href="classdbFieldDescriptor.html">dbFieldDescriptor</a>* field;
00287 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table;
00288 dbExprNode* expr;
00289 <span class="keywordtype">bool</span> ascent; <span class="comment">// true for ascent order, false for descent </span>
00290
00291 ~dbOrderByNode() {
00292 <span class="keyword">delete</span> expr;
00293 }
00294 };
00295
00296 <span class="keyword">class </span>dbFollowByNode {
00297 <span class="keyword">public</span>:
00298 dbFollowByNode* next;
00299 <a class="code" href="classdbFieldDescriptor.html">dbFieldDescriptor</a>* field;
00300 };
00301
00302 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbCompiler {
00303 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbQuery.html">dbQuery</a>;
00304 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classdbQueryElement.html">dbQueryElement</a>;
00305 <span class="keyword">public</span>:
00306 <span class="keyword">enum</span> {
00307 maxStrLen = 4096,
00308 maxFreeVars = 4
00309 };
00310
00311 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table;
00312 <a class="code" href="classdbQueryElement.html">dbQueryElement</a>* queryElement;
00313 <span class="keywordtype">int</span> currPos;
00314 <span class="keywordtype">int</span> firstPos;
00315 <span class="keywordtype">int</span> offsetWithinStatement;
00316 <span class="keywordtype">int</span> bvalue;
00317 db_int8 ivalue;
00318 real8 fvalue;
00319 dbStrLiteral svalue;
00320 <span class="keywordtype">bool</span> hasToken;
00321 <span class="keywordtype">int</span> lex;
00322 <span class="keywordtype">char</span>* name;
00323 dbBinding* bindings;
00324 <span class="keywordtype">int</span> nFreeVars;
00325 <span class="keywordtype">int</span> varType;
00326 <span class="keywordtype">void</span> <span class="keyword">const</span>* varPtr;
00327 <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* varRefTable;
00328
00329 jmp_buf abortCompilation;
00330 <span class="keyword">static</span> <span class="keywordtype">bool</span> initialized;
00331
00332 <span class="keywordtype">void</span> compare(dbExprNode* expr, dbExprNode* list);
00333
00334 <span class="keywordtype">int</span> scan();
00335 <span class="keywordtype">void</span> ungetToken(<span class="keywordtype">int</span> tkn) {
00336 lex = tkn;
00337 hasToken = <span class="keyword">true</span>;
00338 }
00339 <span class="keywordtype">void</span> error(<span class="keyword">const</span> <span class="keywordtype">char</span>* msg, <span class="keywordtype">int</span> pos = -1);
00340 dbExprNode* conjunction();
00341 dbExprNode* disjunction();
00342 dbExprNode* comparison();
00343 dbExprNode* addition();
00344 dbExprNode* multiplication();
00345 dbExprNode* power();
00346 dbExprNode* term();
00347 dbExprNode* buildList();
00348 dbExprNode* userDefinedOperator();
00349 dbExprNode* field(dbExprNode* expr, <a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* refTable,
00350 <a class="code" href="classdbFieldDescriptor.html">dbFieldDescriptor</a>* fd);
00351
00352 <span class="keywordtype">bool</span> compile(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table, <a class="code" href="classdbQuery.html">dbQuery</a>& query);
00353 dbExprNode* compileExpression(<a class="code" href="classdbTableDescriptor.html">dbTableDescriptor</a>* table, <span class="keywordtype">char</span> <span class="keyword">const</span>* expr, <span class="keywordtype">int</span> startPos);
00354 <span class="keywordtype">void</span> compileOrderByPart(<a class="code" href="classdbQuery.html">dbQuery</a>& query);
00355 <span class="keywordtype">void</span> compileLimitPart(<a class="code" href="classdbQuery.html">dbQuery</a>& query);
00356 <span class="keywordtype">void</span> compileStartFollowPart(<a class="code" href="classdbQuery.html">dbQuery</a>& query);
00357
00358 <span class="keywordtype">void</span> deleteNode(dbExprNode* node);
00359 dbExprNode* rectangleConstant(dbExprNode* head);
00360
00361 dbCompiler();
00362 };
00363
00364 <span class="keyword">class </span>dbDatabaseThreadContext : <span class="keyword">public</span> <a class="code" href="classdbL2List.html">dbL2List</a> {
00365 <span class="keyword">public</span>:
00366 <span class="keywordtype">int</span> readAccess;
00367 <span class="keywordtype">int</span> writeAccess;
00368 <span class="keywordtype">int</span> concurrentId;
00369 <span class="keywordtype">int</span> mutatorCSLocked;
00370 <span class="keywordtype">int</span> isMutator;
00371
00372 <a class="code" href="classdbL2List.html">dbL2List</a> cursors;
00373
00374 dbCompiler compiler;
00375
00376 dbProcessId currPid;
00377
00378 <span class="keywordtype">bool</span> interactive;
00379 <span class="keywordtype">bool</span> catched;
00380 <span class="keywordtype">bool</span> commitDelayed;
00381 <span class="keywordtype">bool</span> removeContext;
00382 jmp_buf unwind;
00383
00384 dbDatabaseThreadContext() {
00385 concurrentId = 0;
00386 readAccess = <span class="keyword">false</span>;
00387 writeAccess = <span class="keyword">false</span>;
00388 mutatorCSLocked = <span class="keyword">false</span>;
00389 isMutator = <span class="keyword">false</span>;
00390 interactive = <span class="keyword">false</span>;
00391 catched = <span class="keyword">false</span>;
00392 commitDelayed = <span class="keyword">false</span>;
00393 removeContext = <span class="keyword">false</span>;
00394 currPid = dbProcessId::getCurrent();
00395 }
00396 };
00397
00398 <span class="keyword">union </span>dbSynthesizedAttribute {
00399 byte* base;
00400 <span class="keywordtype">int</span> bvalue;
00401 db_int8 ivalue;
00402 real8 fvalue;
00403 <a class="code" href="classrectangle.html">rectangle</a> rvalue;
00404 <span class="keywordtype">void</span>* raw;
00405 oid_t oid;
00406
00407 <span class="keyword">struct </span>{
00408 <span class="keywordtype">char</span>* base;
00409 <span class="keywordtype">int</span> size;
00410 } array;
00411 };
00412
00413 <span class="keyword">struct </span>dbStringValue;
00414
00415 <span class="keyword">struct </span>FASTDB_DLL_ENTRY dbInheritedAttribute {
00416 byte* record;
00417 oid_t oid;
00418 <a class="code" href="classdbTable.html">dbTable</a>* table;
00419 <a class="code" href="classdbDatabase.html">dbDatabase</a>* db;
00420 dbStringValue* tempStrings;
00421 size_t paramBase;
00422 <span class="keyword">enum</span> {
00423 internalStrBufSize = 8*1024
00424 };
00425 size_t strBufPos;
00426 <span class="keywordtype">char</span> strBuf[internalStrBufSize];
00427
00428 <span class="keyword">struct </span>{
00429 <span class="keywordtype">int</span> index;
00430 jmp_buf unwind;
00431 } exists_iterator[dbCompiler::maxFreeVars];
00432
00433 <span class="keywordtype">void</span> removeTemporaries();
00434
00435 dbInheritedAttribute() {
00436 tempStrings = NULL;
00437 strBufPos = 0;
00438 }
00439
00440 ~dbInheritedAttribute() {
00441 removeTemporaries();
00442 }
00443 };
00444
00445 <span class="keyword">struct </span>dbStringValue {
00446 dbStringValue* next;
00447 <span class="keywordtype">char</span> str[1];
00448
00449 <span class="keyword">static</span> <span class="keywordtype">char</span>* create(size_t size, dbInheritedAttribute& attr) {
00450 <span class="keywordflow">if</span> (attr.strBufPos + size > <span class="keyword">sizeof</span>(attr.strBuf)) {
00451 dbStringValue* sv =
00452 (dbStringValue*)<span class="keyword">new</span> <span class="keywordtype">char</span>[offsetof(dbStringValue, str) + size];
00453 sv->next = attr.tempStrings;
00454 attr.tempStrings = sv;
00455 <span class="keywordflow">return</span> sv->str;
00456 } <span class="keywordflow">else</span> {
00457 <span class="keywordtype">char</span>* p = attr.strBuf + attr.strBufPos;
00458 attr.strBufPos += size;
00459 <span class="keywordflow">return</span> p;
00460 }
00461 }
00462
00463 <span class="keyword">static</span> <span class="keywordtype">char</span>* create(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, dbInheritedAttribute& attr) {
00464 size_t len = strlen(s) + 1;
00465 <span class="keywordtype">char</span>* buf;
00466 <span class="keywordflow">if</span> (attr.strBufPos + len > <span class="keyword">sizeof</span>(attr.strBuf)) {
00467 dbStringValue* sv =
00468 (dbStringValue*)<span class="keyword">new</span> <span class="keywordtype">char</span>[offsetof(dbStringValue,str)+len];
00469 sv->next = attr.tempStrings;
00470 attr.tempStrings = sv;
00471 buf = sv->str;
00472 } <span class="keywordflow">else</span> {
00473 buf = attr.strBuf + attr.strBufPos;
00474 attr.strBufPos += len;
00475 }
00476 <span class="keywordflow">return</span> strcpy(buf, s);
00477 }
00478 };
00479
00480 <span class="keyword">inline</span> <span class="keywordtype">char</span>* findWildcard(<span class="keywordtype">char</span>* pattern, <span class="keywordtype">char</span>* escape = NULL)
00481 {
00482 <span class="keywordflow">if</span> (escape == NULL) {
00483 <span class="keywordflow">while</span> (*pattern != dbMatchAnyOneChar &&
00484 *pattern != dbMatchAnySubstring)
00485 {
00486 <span class="keywordflow">if</span> (*pattern++ == <span class="charliteral">'\0'</span>) {
00487 <span class="keywordflow">return</span> NULL;
00488 }
00489 }
00490 } <span class="keywordflow">else</span> {
00491 <span class="keywordtype">char</span> esc = *escape;
00492 <span class="keywordflow">while</span> (*pattern != dbMatchAnyOneChar &&
00493 *pattern != dbMatchAnySubstring &&
00494 *pattern != esc)
00495 {
00496 <span class="keywordflow">if</span> (*pattern++ == <span class="charliteral">'\0'</span>) {
00497 <span class="keywordflow">return</span> NULL;
00498 }
00499 }
00500 }
00501 <span class="keywordflow">return</span> pattern;
00502 }
00503
00504 END_FASTDB_NAMESPACE
00505
00506 <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 + -