0000: 2f 2f 20 76 74 61 62 5f 69 6e 66 6f 2e 63 70 70 // vtab_info.cpp
0010: 0d 0a 23 69 6e 63 6c 75 64 65 20 22 53 74 64 41 ..#include "StdA
0020: 66 78 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 20 fx.h"..#include
0030: 22 76 74 61 62 5f 69 6e 66 6f 2e 68 22 0d 0a 23 "vtab_info.h"..#
0040: 69 6e 63 6c 75 64 65 20 22 75 74 65 78 2e 68 22 include "utex.h"
0050: 0d 0a 23 69 6e 63 6c 75 64 65 20 22 72 65 66 65 ..#include "refe
0060: 72 65 6e 63 65 74 61 62 69 6e 66 6f 2e 68 22 0d rencetabinfo.h".
0070: 0a 23 69 6e 63 6c 75 64 65 20 22 6a 6f 75 72 6e .#include "journ
0080: 61 6c 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 20 al.h"..#include
0090: 22 64 6f 63 68 65 61 64 65 72 73 2e 68 22 0d 0a "docheaders.h"..
00a0: 23 69 6e 63 6c 75 64 65 20 22 64 6f 63 74 61 62 #include "doctab
00b0: 6c 65 73 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 les.h"..#include
00c0: 20 22 72 65 67 69 73 74 65 72 2e 68 22 0d 0a 23 "register.h"..#
00d0: 69 6e 63 6c 75 64 65 20 22 69 6e 64 65 78 5f 73 include "index_s
00e0: 65 6c 65 63 74 6f 72 2e 68 22 0d 0a 23 69 6e 63 elector.h"..#inc
00f0: 6c 75 64 65 20 22 6c 6f 6e 67 73 74 72 72 65 61 lude "longstrrea
0100: 64 65 72 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 der.h"..#include
0110: 20 22 73 79 73 74 61 62 73 2e 68 22 0d 0a 23 69 "systabs.h"..#i
0120: 6e 63 6c 75 64 65 20 22 63 61 6c 63 6a 6f 75 72 nclude "calcjour
0130: 6e 61 6c 2e 68 22 0d 0a 0d 0a 43 4e 6f 43 61 73 nal.h"....CNoCas
0140: 65 4d 61 70 3c 43 56 74 61 62 49 6e 66 6f 2a 3e eMap<CVtabInfo*>
0150: 20 43 56 74 61 62 49 6e 66 6f 3a 3a 6d 5f 61 6c CVtabInfo::m_al
0160: 6c 54 61 62 73 3b 0d 0a 43 53 74 72 69 6e 67 20 lTabs;..CString
0170: 43 56 74 61 62 49 6e 66 6f 3a 3a 6d 5f 6c 61 73 CVtabInfo::m_las
0180: 74 45 72 72 6f 72 3b 0d 0a 73 74 72 75 63 74 20 tError;..struct
0190: 74 61 62 5f 64 65 6c 65 74 65 72 7b 20 76 6f 69 tab_deleter{ voi
01a0: 64 20 6f 70 65 72 61 74 6f 72 28 29 28 43 56 74 d operator()(CVt
01b0: 61 62 49 6e 66 6f 2a 20 70 54 61 62 29 7b 64 65 abInfo* pTab){de
01c0: 6c 65 74 65 20 70 54 61 62 3b 7d 7d 3b 0d 0a 0d lete pTab;}};...
01d0: 0a 44 57 4f 52 44 20 74 61 62 6c 65 5f 72 65 61 .DWORD table_rea
01e0: 64 65 72 3a 3a 61 6c 6c 52 65 61 64 65 72 43 6f der::allReaderCo
01f0: 75 6e 74 20 3d 20 30 3b 0d 0a 42 4f 4f 4c 20 74 unt = 0;..BOOL t
0200: 61 62 6c 65 5f 72 65 61 64 65 72 3a 3a 62 57 65 able_reader::bWe
0210: 4f 70 65 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 OpenTransaction
0220: 3d 20 46 41 4c 53 45 3b 0d 0a 42 4f 4f 4c 20 74 = FALSE;..BOOL t
0230: 61 62 6c 65 5f 72 65 61 64 65 72 3a 3a 62 4e 65 able_reader::bNe
0240: 65 64 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 edTransaction =
0250: 46 41 4c 53 45 3b 0d 0a 0d 0a 76 6f 69 64 20 43 FALSE;....void C
0260: 56 74 61 62 49 6e 66 6f 3a 3a 64 6f 6e 65 57 6f VtabInfo::doneWo
0270: 72 6b 28 29 0d 0a 7b 0d 0a 09 6d 5f 61 6c 6c 54 rk()..{...m_allT
0280: 61 62 73 2e 46 6f 72 45 61 63 68 56 61 6c 75 65 abs.ForEachValue
0290: 28 74 61 62 5f 64 65 6c 65 74 65 72 28 29 29 3b (tab_deleter());
02a0: 0d 0a 7d 0d 0a 0d 0a 4e 4f 54 48 52 4f 57 20 73 ..}....NOTHROW s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 54 72 61 63 65 tatic void Trace
02c0: 43 6f 6e 73 74 72 61 69 6e 74 73 28 73 71 6c 69 Constraints(sqli
02d0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2a 20 te3_index_info*
02e0: 70 49 6e 66 6f 2c 20 63 6f 6e 73 74 20 43 56 74 pInfo, const CVt
02f0: 61 62 49 6e 66 6f 2a 20 70 56 54 61 62 29 0d 0a abInfo* pVTab)..
0300: 7b 0d 0a 09 69 66 28 21 62 44 6f 54 72 61 63 65 {...if(!bDoTrace
0310: 29 0d 0a 09 09 72 65 74 75 72 6e 3b 0d 0a 09 43 )....return;...C
0320: 53 74 72 69 6e 67 20 74 65 78 74 3b 0d 0a 09 74 String text;...t
0330: 65 78 74 2e 46 6f 72 6d 61 74 28 22 cf ee e4 e1 ext.Format("....
0340: ee f0 20 e8 ed e4 e5 ea f1 e0 20 e4 eb ff 20 f2 .. ....... ... .
0350: e0 e1 eb e8 f6 fb 20 25 73 3a 5c 72 5c 6e 5c 74 ...... %s:\r\n\t
0360: ce e3 f0 e0 ed e8 f7 e5 ed e8 ff 3a 20 22 2c 20 ...........: ",
0370: 28 4c 50 43 53 54 52 29 70 56 54 61 62 2d 3e 74 (LPCSTR)pVTab->t
0380: 61 62 6c 65 4e 61 6d 65 28 29 29 3b 0d 0a 09 43 ableName());...C
0390: 54 61 62 6c 65 45 78 2a 20 70 54 61 62 6c 65 20 TableEx* pTable
03a0: 3d 20 70 56 54 61 62 2d 3e 74 61 62 6c 65 28 29 = pVTab->table()
03b0: 3b 0d 0a 0d 0a 09 73 71 6c 69 74 65 33 5f 69 6e ;.....sqlite3_in
03c0: 64 65 78 5f 69 6e 66 6f 3a 3a 73 71 6c 69 74 65 dex_info::sqlite
03d0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 3_index_constrai
03e0: 6e 74 2a 20 70 43 20 3d 20 70 49 6e 66 6f 2d 3e nt* pC = pInfo->
03f0: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0d 0a 09 66 aConstraint;...f
0400: 6f 72 28 69 6e 74 20 69 20 3d 20 30 2c 20 63 20 or(int i = 0, c
0410: 3d 20 70 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 = pInfo->nConstr
0420: 61 69 6e 74 20 3b 20 69 20 3c 20 63 20 3b 20 69 aint ; i < c ; i
0430: 2b 2b 2c 20 70 43 2b 2b 29 0d 0a 09 7b 0d 0a 09 ++, pC++)...{...
0440: 09 69 66 28 21 70 43 2d 3e 75 73 61 62 6c 65 29 .if(!pC->usable)
0450: 0d 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0d 0a .....continue;..
0460: 09 09 74 65 78 74 20 2b 3d 20 70 56 54 61 62 2d ..text += pVTab-
0470: 3e 66 69 65 6c 64 28 70 43 2d 3e 69 43 6f 6c 75 >field(pC->iColu
0480: 6d 6e 29 2e 6e 61 6d 65 28 29 3b 0d 0a 09 09 0d mn).name();.....
0490: 0a 09 09 73 77 69 74 63 68 28 70 43 2d 3e 6f 70 ...switch(pC->op
04a0: 29 0d 0a 09 09 7b 0d 0a 09 09 63 61 73 65 20 53 )....{....case S
04b0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
04c0: 54 52 41 49 4e 54 5f 45 51 3a 0d 0a 09 09 09 74 TRAINT_EQ:.....t
04d0: 65 78 74 20 2b 3d 20 27 3d 27 3b 0d 0a 09 09 09 ext += '=';.....
04e0: 62 72 65 61 6b 3b 0d 0a 09 09 63 61 73 65 20 53 break;....case S
04f0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
0500: 54 52 41 49 4e 54 5f 47 54 3a 0d 0a 09 09 09 74 TRAINT_GT:.....t
0510: 65 78 74 20 2b 3d 20 27 3e 27 3b 0d 0a 09 09 09 ext += '>';.....
0520: 62 72 65 61 6b 3b 0d 0a 09 09 63 61 73 65 20 53 break;....case S
0530: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
0540: 54 52 41 49 4e 54 5f 4c 45 3a 0d 0a 09 09 09 74 TRAINT_LE:.....t
0550: 65 78 74 20 2b 3d 20 22 3c 3d 22 3b 0d 0a 09 09 ext += "<=";....
0560: 09 62 72 65 61 6b 3b 0d 0a 09 09 63 61 73 65 20 .break;....case
0570: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
0580: 53 54 52 41 49 4e 54 5f 4c 54 3a 0d 0a 09 09 09 STRAINT_LT:.....
0590: 74 65 78 74 20 2b 3d 20 27 3c 27 3b 0d 0a 09 09 text += '<';....
05a0: 09 62 72 65 61 6b 3b 0d 0a 09 09 63 61 73 65 20 .break;....case
05b0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
05c0: 53 54 52 41 49 4e 54 5f 47 45 3a 0d 0a 09 09 09 STRAINT_GE:.....
05d0: 74 65 78 74 20 2b 3d 20 22 3e 3d 22 3b 0d 0a 09 text += ">=";...
05e0: 09 09 62 72 65 61 6b 3b 0d 0a 09 09 63 61 73 65 ..break;....case
05f0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f SQLITE_INDEX_CO
0600: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 3a 0d NSTRAINT_MATCH:.
0610: 0a 09 09 09 74 65 78 74 20 2b 3d 20 22 20 6d 61 ....text += " ma
0620: 74 63 68 22 3b 0d 0a 09 09 09 62 72 65 61 6b 3b tch";.....break;
0630: 0d 0a 09 09 7d 0d 0a 09 09 74 65 78 74 20 2b 3d ....}....text +=
0640: 20 22 3b 20 22 3b 0d 0a 09 7d 0d 0a 09 69 66 28 "; ";...}...if(
0650: 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 29 pInfo->nOrderBy)
0660: 0d 0a 09 7b 0d 0a 09 09 74 65 78 74 20 2b 3d 20 ...{....text +=
0670: 22 5c 72 5c 6e 5c 74 d3 ef ee f0 ff e4 ee f7 e8 "\r\n\t.........
0680: f2 fc 3a 20 22 3b 0d 0a 09 09 6f 72 64 65 72 62 ..: ";....orderb
0690: 79 5f 70 74 72 20 70 4f 72 64 65 72 42 79 20 3d y_ptr pOrderBy =
06a0: 20 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 pInfo->aOrderBy
06b0: 3b 0d 0a 09 09 66 6f 72 28 69 6e 74 20 69 20 3d ;....for(int i =
06c0: 20 30 3b 20 69 20 3c 20 70 49 6e 66 6f 2d 3e 6e 0; i < pInfo->n
06d0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 4f OrderBy; i++, pO
06e0: 72 64 65 72 42 79 2b 2b 29 0d 0a 09 09 7b 0d 0a rderBy++)....{..
06f0: 09 09 09 74 65 78 74 20 2b 3d 20 70 56 54 61 62 ...text += pVTab
0700: 2d 3e 66 69 65 6c 64 28 70 4f 72 64 65 72 42 79 ->field(pOrderBy
0710: 2d 3e 69 43 6f 6c 75 6d 6e 29 2e 6e 61 6d 65 28 ->iColumn).name(
0720: 29 3b 0d 0a 09 09 09 0d 0a 09 09 09 69 66 28 70 );..........if(p
0730: 4f 72 64 65 72 42 79 2d 3e 64 65 73 63 29 0d 0a OrderBy->desc)..
0740: 09 09 09 09 74 65 78 74 20 2b 3d 20 22 20 64 65 ....text += " de
0750: 73 63 22 3b 0d 0a 09 09 09 74 65 78 74 20 2b 3d sc";.....text +=
0760: 20 22 2c 20 22 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d ", ";....}...}.
0770: 0a 09 44 6f 4d 73 67 4c 69 6e 65 28 22 25 73 22 ..DoMsgLine("%s"
0780: 2c 20 6d 6d 4e 6f 6e 65 2c 20 74 65 78 74 29 3b , mmNone, text);
0790: 0d 0a 7d 0d 0a 0d 0a 4e 4f 54 48 52 4f 57 20 73 ..}....NOTHROW s
07a0: 74 61 74 69 63 20 76 6f 69 64 20 54 72 61 63 65 tatic void Trace
07b0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 69 6e Index(sqlite3_in
07c0: 64 65 78 5f 69 6e 66 6f 2a 20 70 49 64 78 2c 20 dex_info* pIdx,
07d0: 42 4f 4f 4c 20 62 46 72 6f 6d 43 61 73 68 2c 20 BOOL bFromCash,
07e0: 63 6f 6e 73 74 20 43 56 74 61 62 49 6e 66 6f 2a const CVtabInfo*
07f0: 20 70 56 54 61 62 29 0d 0a 7b 0d 0a 09 69 66 28 pVTab)..{...if(
0800: 21 62 44 6f 54 72 61 63 65 29 0d 0a 09 09 72 65 !bDoTrace)....re
0810: 74 75 72 6e 3b 0d 0a 09 43 53 74 72 69 6e 67 20 turn;...CString
0820: 74 65 78 74 3b 0d 0a 09 69 66 28 70 49 64 78 2d text;...if(pIdx-
0830: 3e 69 64 78 4e 75 6d 20 3e 3d 20 30 29 0d 0a 09 >idxNum >= 0)...
0840: 7b 0d 0a 09 09 43 49 6e 64 65 78 45 78 2a 20 70 {....CIndexEx* p
0850: 49 6e 64 65 78 20 3d 20 70 56 54 61 62 2d 3e 74 Index = pVTab->t
0860: 61 62 6c 65 28 29 2d 3e 69 6e 64 65 78 28 70 49 able()->index(pI
0870: 64 78 2d 3e 69 64 78 4e 75 6d 29 3b 0d 0a 09 09 dx->idxNum);....
0880: 74 65 78 74 2e 46 6f 72 6d 61 74 28 22 5c 74 c2 text.Format("\t.
0890: fb e1 f0 e0 ed 20 e8 ed e4 e5 ea f1 20 25 73 3a ..... ...... %s:
08a0: 20 25 73 22 2c 20 70 49 6e 64 65 78 2d 3e 70 5f %s", pIndex->p_
08b0: 31 30 2d 3e 73 7a 4e 61 6d 65 2c 20 70 49 6e 64 10->szName, pInd
08c0: 65 78 2d 3e 70 5f 31 30 2d 3e 73 7a 49 64 78 45 ex->p_10->szIdxE
08d0: 78 70 72 29 3b 0d 0a 09 7d 0d 0a 09 65 6c 73 65 xpr);...}...else
08e0: 0d 0a 09 09 74 65 78 74 20 3d 20 22 5c 74 c8 ed ....text = "\t..
08f0: e4 e5 ea f1 20 ed e5 20 e2 fb e1 f0 e0 ed 2e 22 .... .. ......."
0900: 3b 0d 0a 09 44 6f 4d 73 67 4c 69 6e 65 28 62 46 ;...DoMsgLine(bF
0910: 72 6f 6d 43 61 73 68 20 3f 20 22 5c 74 cd e0 e9 romCash ? "\t...
0920: e4 e5 ed ee 20 e2 20 ea fd f8 e5 22 20 3a 20 22 .... . ...." : "
0930: 5c 74 c2 20 ea fd f8 e5 20 ed e5 20 ed e0 e9 e4 \t. .... .. ....
0940: e5 ed ee 22 29 3b 0d 0a 09 44 6f 4d 73 67 4c 69 ...");...DoMsgLi
0950: 6e 65 28 22 25 73 22 2c 20 6d 6d 4e 6f 6e 65 2c ne("%s", mmNone,
0960: 20 74 65 78 74 29 3b 0d 0a 09 69 66 28 70 49 64 text);...if(pId
0970: 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d x->orderByConsum
0980: 65 64 29 0d 0a 09 09 44 6f 4d 73 67 4c 69 6e 65 ed)....DoMsgLine
0990: 28 22 5c 74 cf ee ef e0 e4 e0 e5 f2 20 e2 20 f1 ("\t........ . .
09a0: ee f0 f2 e8 f0 ee e2 ea f3 22 29 3b 0d 0a 09 44 .........");...D
09b0: 6f 4d 73 67 4c 69 6e 65 28 22 5c 74 d1 f2 ee e8 oMsgLine("\t....
09c0: ec ee f1 f2 fc 3a 20 25 69 22 2c 20 6d 6d 4e 6f .....: %i", mmNo
09d0: 6e 65 2c 20 28 69 6e 74 29 70 49 64 78 2d 3e 65 ne, (int)pIdx->e
09e0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0d 0a stimatedCost);..
09f0: 7d 0d 0a 0d 0a 0d 0a 69 6e 74 20 43 56 74 61 62 }......int CVtab
0a00: 49 6e 66 6f 3a 3a 62 65 73 74 49 6e 64 65 78 28 Info::bestIndex(
0a10: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e sqlite3_index_in
0a20: 66 6f 2a 20 70 49 64 78 29 20 63 6f 6e 73 74 0d fo* pIdx) const.
0a30: 0a 7b 0d 0a 09 2f 2f 62 44 6f 54 72 61 63 65 20 .{...//bDoTrace
0a40: 3d 20 54 52 55 45 3b 0d 0a 09 54 72 61 63 65 43 = TRUE;...TraceC
0a50: 6f 6e 73 74 72 61 69 6e 74 73 28 70 49 64 78 2c onstraints(pIdx,
0a60: 20 74 68 69 73 29 3b 0d 0a 0d 0a 0d 0a 09 42 4f this);.......BO
0a70: 4f 4c 20 66 72 6f 6d 43 61 73 68 20 3d 20 54 52 OL fromCash = TR
0a80: 55 45 3b 0d 0a 09 0d 0a 09 43 53 74 72 69 6e 67 UE;......CString
0a90: 20 63 61 73 68 4b 65 79 3b 0d 0a 09 69 66 28 21 cashKey;...if(!
0aa0: 73 74 72 61 74 43 61 73 68 2e 67 65 74 46 72 6f stratCash.getFro
0ab0: 6d 43 61 73 68 28 70 49 64 78 2c 20 63 61 73 68 mCash(pIdx, cash
0ac0: 4b 65 79 29 29 0d 0a 09 7b 0d 0a 09 09 69 6e 64 Key))...{....ind
0ad0: 65 78 5f 73 65 6c 65 63 74 6f 72 20 69 64 78 5f ex_selector idx_
0ae0: 75 73 61 67 65 3b 0d 0a 09 09 63 6f 6e 73 74 20 usage;....const
0af0: 69 64 78 5f 6e 6f 64 65 2a 20 70 42 65 73 74 20 idx_node* pBest
0b00: 3d 20 69 64 78 5f 75 73 61 67 65 2e 62 65 73 74 = idx_usage.best
0b10: 49 6e 64 65 78 28 70 49 64 78 2c 20 2a 74 68 69 Index(pIdx, *thi
0b20: 73 29 3b 0d 0a 09 09 46 69 6c 74 65 72 4d 61 63 s);....FilterMac
0b30: 68 69 6e 65 3a 3a 62 75 69 6c 64 28 2a 74 68 69 hine::build(*thi
0b40: 73 2c 20 70 49 64 78 2c 20 70 42 65 73 74 29 3b s, pIdx, pBest);
0b50: 0d 0a 09 09 69 66 28 70 42 65 73 74 29 0d 0a 09 ....if(pBest)...
0b60: 09 7b 0d 0a 09 09 09 69 66 28 70 42 65 73 74 2d .{.....if(pBest-
0b70: 3e 69 6e 64 65 78 4e 75 6d 20 3d 3d 20 2d 31 29 >indexNum == -1)
0b80: 09 2f 2f 20 72 65 63 4e 6f 0d 0a 09 09 09 09 70 .// recNo......p
0b90: 49 64 78 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f Idx->estimatedCo
0ba0: 73 74 20 3d 20 31 3b 0d 0a 09 09 09 65 6c 73 65 st = 1;.....else
0bb0: 0d 0a 09 09 09 09 70 49 64 78 2d 3e 65 73 74 69 ......pIdx->esti
0bc0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 64 6f 75 62 matedCost = doub
0bd0: 6c 65 28 6c 6f 67 52 6f 77 43 6f 75 6e 74 20 2a le(logRowCount *
0be0: 20 70 42 65 73 74 2d 3e 66 75 6c 6c 4c 65 6e 49 pBest->fullLenI
0bf0: 6e 49 64 78 29 20 2f 20 28 70 42 65 73 74 2d 3e nIdx) / (pBest->
0c00: 75 73 65 64 4c 65 6e 4f 66 49 6e 64 65 78 20 2b usedLenOfIndex +
0c10: 20 70 42 65 73 74 2d 3e 6f 72 64 65 72 42 79 4c pBest->orderByL
0c20: 65 6e 29 3b 0d 0a 09 09 7d 0d 0a 09 09 65 6c 73 en);....}....els
0c30: 65 0d 0a 09 09 09 70 49 64 78 2d 3e 65 73 74 69 e.....pIdx->esti
0c40: 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 30 30 30 matedCost = 1000
0c50: 30 20 2d 20 6c 6f 67 52 6f 77 43 6f 75 6e 74 3b 0 - logRowCount;
0c60: 0d 0a 09 09 73 74 72 61 74 43 61 73 68 2e 61 64 ....stratCash.ad
0c70: 64 54 6f 43 61 73 68 28 63 61 73 68 4b 65 79 2c dToCash(cashKey,
0c80: 20 70 49 64 78 29 3b 0d 0a 09 09 66 72 6f 6d 43 pIdx);....fromC
0c90: 61 73 68 20 3d 20 46 41 4c 53 45 3b 0d 0a 09 7d ash = FALSE;...}
0ca0: 0d 0a 09 0d 0a 09 54 72 61 63 65 49 6e 64 65 78 ......TraceIndex
0cb0: 28 70 49 64 78 2c 20 66 72 6f 6d 43 61 73 68 2c (pIdx, fromCash,
0cc0: 20 74 68 69 73 29 3b 0d 0a 09 0d 0a 09 72 65 74 this);......ret
0cd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0d 0a urn SQLITE_OK;..
0ce0: 7d 0d 0a 0d 0a 0d 0a 76 6f 69 64 20 43 56 74 61 }......void CVta
0cf0: 62 49 6e 66 6f 3a 3a 66 69 6c 6c 4e 61 6d 65 73 bInfo::fillNames
0d00: 46 72 6f 6d 4f 62 6a 73 28 43 4d 65 74 61 44 61 FromObjs(CMetaDa
0d10: 74 61 4f 62 6a 41 72 72 61 79 2a 20 61 72 72 2c taObjArray* arr,
0d20: 20 43 4e 6f 43 61 73 65 4d 61 70 3c 43 53 74 72 CNoCaseMap<CStr
0d30: 69 6e 67 3e 26 20 61 6c 69 61 63 65 73 2c 20 43 ing>& aliaces, C
0d40: 44 57 6f 72 64 41 72 72 61 79 2a 20 6c 6f 6e 67 DWordArray* long
0d50: 53 74 72 29 0d 0a 7b 0d 0a 09 66 6f 72 28 69 6e Str)..{...for(in
0d60: 74 20 69 20 3d 20 30 2c 20 63 20 3d 20 61 72 72 t i = 0, c = arr
0d70: 2d 3e 47 65 74 4e 49 74 65 6d 73 28 29 3b 20 69 ->GetNItems(); i
0d80: 3c 63 20 3b 20 69 2b 2b 29 0d 0a 09 7b 0d 0a 09 <c ; i++)...{...
0d90: 09 43 4d 65 74 61 44 61 74 61 4f 62 6a 2a 20 70 .CMetaDataObj* p
0da0: 4f 62 6a 20 3d 20 61 72 72 2d 3e 47 65 74 41 74 Obj = arr->GetAt
0db0: 28 69 29 3b 0d 0a 09 09 69 66 28 70 4f 62 6a 2d (i);....if(pObj-
0dc0: 3e 49 73 54 79 70 65 64 4f 62 6a 28 29 29 0d 0a >IsTypedObj())..
0dd0: 09 09 7b 0d 0a 09 09 09 69 66 28 6c 6f 6e 67 53 ..{.....if(longS
0de0: 74 72 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 63 tr).....{......c
0df0: 6f 6e 73 74 20 43 54 79 70 65 26 20 74 20 3d 20 onst CType& t =
0e00: 28 28 43 4d 65 74 61 44 61 74 61 54 79 70 65 64 ((CMetaDataTyped
0e10: 4f 62 6a 2a 29 70 4f 62 6a 29 2d 3e 47 65 74 54 Obj*)pObj)->GetT
0e20: 79 70 65 28 29 3b 0d 0a 09 09 09 09 69 66 28 74 ype();......if(t
0e30: 2e 74 79 70 65 20 3d 3d 20 32 20 26 26 20 30 20 .type == 2 && 0
0e40: 3d 3d 20 74 2e 6d 5f 6c 65 6e 67 74 68 29 0d 0a == t.m_length)..
0e50: 09 09 09 09 09 6c 6f 6e 67 53 74 72 2d 3e 41 64 .....longStr->Ad
0e60: 64 28 70 4f 62 6a 2d 3e 6d 5f 49 44 29 3b 0d 0a d(pObj->m_ID);..
0e70: 09 09 09 7d 0d 0a 09 09 09 61 6c 69 61 63 65 73 ...}.....aliaces
0e80: 5b 28 28 43 4d 65 74 61 44 61 74 61 54 79 70 65 [((CMetaDataType
0e90: 64 4f 62 6a 2a 29 70 4f 62 6a 29 2d 3e 47 65 74 dObj*)pObj)->Get
0ea0: 46 69 65 6c 64 4e 61 6d 65 28 29 5d 20 3d 20 70 FieldName()] = p
0eb0: 4f 62 6a 2d 3e 6d 5f 43 6f 64 65 3b 0d 0a 09 09 Obj->m_Code;....
0ec0: 7d 0d 0a 09 7d 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 }...}..}....void
0ed0: 20 43 56 74 61 62 49 6e 66 6f 3a 3a 66 69 6c 6c CVtabInfo::fill
0ee0: 54 61 62 49 6e 66 6f 28 43 4e 6f 43 61 73 65 4d TabInfo(CNoCaseM
0ef0: 61 70 3c 43 53 74 72 69 6e 67 3e 26 20 61 6c 69 ap<CString>& ali
0f00: 61 63 65 73 2c 20 43 44 57 6f 72 64 41 72 72 61 aces, CDWordArra
0f10: 79 2a 20 6c 6f 6e 67 53 74 72 29 0d 0a 7b 0d 0a y* longStr)..{..
0f20: 09 6d 5f 70 68 69 73 49 6e 66 6f 20 3d 20 70 68 .m_phisInfo = ph
0f30: 69 73 69 63 61 6c 5f 69 6e 66 6f 3a 3a 62 75 69 isical_info::bui
0f40: 6c 64 49 6e 66 6f 28 6d 5f 70 54 61 62 6c 65 29 ldInfo(m_pTable)
0f50: 3b 0d 0a 09 6d 5f 70 46 69 65 6c 64 73 20 3d 20 ;...m_pFields =
0f60: 6e 65 77 20 6f 6e 65 5f 66 69 65 6c 64 5b 6d 5f new one_field[m_
0f70: 70 68 69 73 49 6e 66 6f 2d 3e 66 69 65 6c 64 73 phisInfo->fields
0f80: 43 6f 75 6e 74 28 29 20 2b 20 6d 5f 70 68 69 73 Count() + m_phis
0f90: 49 6e 66 6f 2d 3e 69 6e 64 65 78 65 73 43 6f 75 Info->indexesCou
0fa0: 6e 74 28 29 20 2b 20 31 20 2b 20 28 6c 6f 6e 67 nt() + 1 + (long
0fb0: 53 74 72 20 3f 20 6c 6f 6e 67 53 74 72 2d 3e 47 Str ? longStr->G
0fc0: 65 74 53 69 7a 65 28 29 20 3a 20 30 29 5d 3b 0d etSize() : 0)];.
0fd0: 0a 09 6d 5f 70 46 69 65 6c 64 73 2d 3e 74 79 70 ..m_pFields->typ
0fe0: 65 20 3d 20 6f 6e 65 5f 66 69 65 6c 64 3a 3a 66 e = one_field::f
0ff0: 52 65 63 4e 6f 3b 0d 0a 09 6d 5f 70 46 69 65 6c RecNo;...m_pFiel
1000: 64 73 2d 3e 6d 5f 6e 61 6d 65 20 3d 20 22 72 65 ds->m_name = "re
1010: 63 4e 6f 5b 72 6f 77 69 64 5d 22 3b 0d 0a 0d 0a cNo[rowid]";....
1020: 09 2f 2f 20 c7 e0 ef ee eb ed e8 ec 20 f4 e8 e7 .// ........ ...
1030: e8 f7 e5 f1 ea e8 e5 20 ef ee eb ff 0d 0a 09 6f ....... .......o
1040: 6e 65 5f 66 69 65 6c 64 2a 20 70 4f 6e 65 46 69 ne_field* pOneFi
1050: 65 6c 64 20 3d 20 2b 2b 6d 5f 70 46 69 65 6c 64 eld = ++m_pField
1060: 73 3b 0d 0a 09 43 4e 6f 43 61 73 65 4d 61 70 3c s;...CNoCaseMap<
1070: 69 6e 74 3e 20 61 6c 6c 46 69 65 6c 64 73 3b 0d int> allFields;.
1080: 0a 0d 0a 09 43 53 74 72 69 6e 67 20 63 72 65 61 ....CString crea
1090: 74 65 2c 20 6e 61 6d 65 2c 20 66 6d 74 2c 20 66 te, name, fmt, f
10a0: 6c 64 4e 61 6d 65 3b 0d 0a 09 66 6f 72 28 44 57 ldName;...for(DW
10b0: 4f 52 44 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d ORD i = 0; i < m
10c0: 5f 70 68 69 73 49 6e 66 6f 2d 3e 66 69 65 6c 64 _phisInfo->field
10d0: 73 43 6f 75 6e 74 28 29 3b 20 69 2b 2b 29 0d 0a sCount(); i++)..
10e0: 09 7b 0d 0a 09 09 43 46 69 65 6c 64 2a 20 70 46 .{....CField* pF
10f0: 69 65 6c 64 20 3d 20 6d 5f 70 54 61 62 6c 65 2d ield = m_pTable-
1100: 3e 66 69 65 6c 64 28 69 29 3b 0d 0a 09 09 66 6c >field(i);....fl
1110: 64 4e 61 6d 65 20 3d 20 70 46 69 65 6c 64 2d 3e dName = pField->
1120: 73 7a 4e 61 6d 65 3b 0d 0a 09 09 69 66 28 21 61 szName;....if(!a
1130: 6c 69 61 63 65 73 2e 4c 6f 6f 6b 75 70 28 70 46 liaces.Lookup(pF
1140: 69 65 6c 64 2d 3e 73 7a 4e 61 6d 65 2c 20 6e 61 ield->szName, na
1150: 6d 65 29 29 0d 0a 09 09 09 6e 61 6d 65 20 3d 20 me)).....name =
1160: 66 6c 64 4e 61 6d 65 3b 0d 0a 09 09 65 6c 73 65 fldName;....else
1170: 0d 0a 09 09 09 66 6c 64 4e 61 6d 65 20 3d 20 66 .....fldName = f
1180: 6c 64 4e 61 6d 65 20 2b 20 27 5b 27 20 2b 20 6e ldName + '[' + n
1190: 61 6d 65 20 2b 20 27 5d 27 3b 0d 0a 09 09 6f 6e ame + ']';....on
11a0: 65 5f 66 69 65 6c 64 3a 3a 66 54 79 70 65 20 74 e_field::fType t
11b0: 79 70 65 20 3d 20 6f 6e 65 5f 66 69 65 6c 64 3a ype = one_field:
11c0: 3a 66 46 69 65 6c 64 3b 0d 0a 0d 0a 09 09 77 68 :fField;......wh
11d0: 69 6c 65 28 61 6c 6c 46 69 65 6c 64 73 2e 49 73 ile(allFields.Is
11e0: 45 78 69 73 74 28 6e 61 6d 65 29 29 0d 0a 09 09 Exist(name))....
11f0: 09 6e 61 6d 65 20 2b 3d 20 27 5f 27 3b 0d 0a 09 .name += '_';...
1200: 09 61 6c 6c 46 69 65 6c 64 73 5b 6e 61 6d 65 5d .allFields[name]
1210: 20 3d 20 30 3b 0d 0a 0d 0a 09 09 63 72 65 61 74 = 0;......creat
1220: 65 20 3d 20 63 72 65 61 74 65 20 2b 20 22 2c 5b e = create + ",[
1230: 22 20 2b 20 6e 61 6d 65 20 2b 20 22 5d 22 3b 0d " + name + "]";.
1240: 0a 09 09 73 77 69 74 63 68 28 70 46 69 65 6c 64 ...switch(pField
1250: 2d 3e 54 79 70 65 43 46 69 65 6c 64 29 0d 0a 09 ->TypeCField)...
1260: 09 7b 0d 0a 09 09 63 61 73 65 20 31 3a 20 2f 2f .{....case 1: //
1270: 20 63 68 61 72 0d 0a 09 09 09 66 6d 74 2e 46 6f char.....fmt.Fo
1280: 72 6d 61 74 28 22 20 63 68 61 72 28 25 69 29 20 rmat(" char(%i)
1290: 63 6f 6c 6c 61 74 65 20 5f 31 43 22 2c 20 70 46 collate _1C", pF
12a0: 69 65 6c 64 2d 3e 73 69 7a 65 43 46 69 65 6c 64 ield->sizeCField
12b0: 29 3b 0d 0a 09 09 09 63 72 65 61 74 65 20 2b 3d );.....create +=
12c0: 20 66 6d 74 3b 0d 0a 09 09 09 62 72 65 61 6b 3b fmt;.....break;
12d0: 0d 0a 09 09 63 61 73 65 20 32 3a 09 2f 2f 20 6e ....case 2:.// n
12e0: 75 6d 65 72 69 63 0d 0a 09 09 09 66 6d 74 2e 46 umeric.....fmt.F
12f0: 6f 72 6d 61 74 28 22 20 6e 75 6d 65 72 69 63 28 ormat(" numeric(
1300: 25 69 2c 20 25 69 29 22 2c 20 70 46 69 65 6c 64 %i, %i)", pField
1310: 2d 3e 73 69 7a 65 43 46 69 65 6c 64 2c 20 70 46 ->sizeCField, pF
1320: 69 65 6c 64 2d 3e 70 72 65 63 43 46 69 65 6c 64 ield->precCField
1330: 29 3b 0d 0a 09 09 09 63 72 65 61 74 65 20 2b 3d );.....create +=
1340: 20 66 6d 74 3b 0d 0a 09 09 09 7b 0d 0a 09 09 09 fmt;.....{.....
1350: 09 4c 50 43 53 54 52 20 70 52 65 61 64 20 3d 20 .LPCSTR pRead =
1360: 70 46 69 65 6c 64 2d 3e 73 7a 4e 61 6d 65 3b 0d pField->szName;.
1370: 0a 09 09 09 09 77 68 69 6c 65 28 2a 70 52 65 61 .....while(*pRea
1380: 64 20 26 26 20 2a 70 52 65 61 64 20 3e 20 27 39 d && *pRead > '9
1390: 27 29 0d 0a 09 09 09 09 09 70 52 65 61 64 2b 2b ').......pRead++
13a0: 3b 0d 0a 09 09 09 09 69 66 28 2a 70 52 65 61 64 ;......if(*pRead
13b0: 29 0d 0a 09 09 09 09 7b 0d 0a 09 09 09 09 09 43 )......{.......C
13c0: 4d 65 74 61 44 61 74 61 4f 62 6a 2a 20 70 4f 62 MetaDataObj* pOb
13d0: 6a 20 3d 20 70 4d 65 74 61 44 61 74 61 43 6f 6e j = pMetaDataCon
13e0: 74 2d 3e 46 69 6e 64 4f 62 6a 65 63 74 28 61 74 t->FindObject(at
13f0: 6f 6c 28 70 52 65 61 64 29 29 3b 0d 0a 09 09 09 ol(pRead));.....
1400: 09 09 69 66 28 70 4f 62 6a 20 26 26 20 70 4f 62 ..if(pObj && pOb
1410: 6a 2d 3e 49 73 54 79 70 65 64 4f 62 6a 28 29 20 j->IsTypedObj()
1420: 26 26 20 21 28 28 43 4d 65 74 61 44 61 74 61 54 && !((CMetaDataT
1430: 79 70 65 64 4f 62 6a 2a 29 70 4f 62 6a 29 2d 3e ypedObj*)pObj)->
1440: 47 65 74 54 79 70 65 28 29 2e 49 73 50 6f 73 69 GetType().IsPosi
1450: 74 69 76 65 4f 6e 6c 79 28 29 29 0d 0a 09 09 09 tiveOnly()).....
1460: 09 09 09 74 79 70 65 20 3d 20 6f 6e 65 5f 66 69 ...type = one_fi
1470: 65 6c 64 3a 3a 66 4e 75 6d 4e 65 67 61 74 65 46 eld::fNumNegateF
1480: 69 65 6c 64 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 ield;......}....
1490: 09 7d 0d 0a 09 09 09 62 72 65 61 6b 3b 0d 0a 09 .}.....break;...
14a0: 09 63 61 73 65 20 33 3a 09 2f 2f 20 64 61 74 65 .case 3:.// date
14b0: 0d 0a 09 09 09 63 72 65 61 74 65 20 2b 3d 20 22 .....create += "
14c0: 20 63 68 61 72 28 38 29 22 3b 0d 0a 09 09 09 62 char(8)";.....b
14d0: 72 65 61 6b 3b 0d 0a 09 09 64 65 66 61 75 6c 74 reak;....default
14e0: 3a 0d 0a 09 09 09 63 72 65 61 74 65 20 2b 3d 20 :.....create +=
14f0: 22 20 74 65 78 74 20 63 6f 6c 6c 61 74 65 20 5f " text collate _
1500: 31 43 22 3b 0d 0a 09 09 7d 0d 0a 09 09 63 72 65 1C";....}....cre
1510: 61 74 65 20 2b 3d 20 22 20 6e 6f 74 20 6e 75 6c ate += " not nul
1520: 6c 5c 72 5c 6e 22 3b 0d 0a 09 09 70 4f 6e 65 46 l\r\n";....pOneF
1530: 69 65 6c 64 2d 3e 74 79 70 65 20 3d 20 74 79 70 ield->type = typ
1540: 65 3b 0d 0a 09 09 70 4f 6e 65 46 69 65 6c 64 2d e;....pOneField-
1550: 3e 70 6f 73 69 74 69 6f 6e 20 3d 20 69 3b 0d 0a >position = i;..
1560: 09 09 70 4f 6e 65 46 69 65 6c 64 2d 3e 6d 5f 6e ..pOneField->m_n
1570: 61 6d 65 20 3d 20 66 6c 64 4e 61 6d 65 3b 0d 0a ame = fldName;..
1580: 09 09 70 4f 6e 65 46 69 65 6c 64 2b 2b 3b 0d 0a ..pOneField++;..
1590: 09 7d 0d 0a 09 2f 2f 20 c7 e0 ef ee eb ed e8 ec .}...// ........
15a0: 20 ef ee eb ff 20 e4 eb e8 ed ed fb f5 20 f1 f2 .... ....... ..
15b0: f0 ee ea 0d 0a 09 69 66 28 6c 6f 6e 67 53 74 72 ......if(longStr
15c0: 29 0d 0a 09 7b 0d 0a 09 09 66 6f 72 28 69 20 3d )...{....for(i =
15d0: 20 30 3b 20 69 3c 6c 6f 6e 67 53 74 72 2d 3e 47 0; i<longStr->G
15e0: 65 74 53 69 7a 65 28 29 3b 20 69 2b 2b 29 0d 0a etSize(); i++)..
15f0: 09 09 7b 0d 0a 09 09 09 44 57 4f 52 44 20 69 64 ..{.....DWORD id
1600: 20 3d 20 6c 6f 6e 67 53 74 72 2d 3e 47 65 74 41 = longStr->GetA
1610: 74 28 69 29 3b 0d 0a 09 09 09 43 4d 65 74 61 44 t(i);.....CMetaD
1620: 61 74 61 4f 62 6a 2a 20 70 4f 62 6a 20 3d 20 70 ataObj* pObj = p
1630: 4d 65 74 61 44 61 74 61 43 6f 6e 74 2d 3e 46 69 MetaDataCont->Fi
1640: 6e 64 4f 62 6a 65 63 74 28 69 64 29 3b 0d 0a 09 ndObject(id);...
1650: 09 09 44 57 4f 52 44 20 62 75 66 20 3d 20 30 78 ..DWORD buf = 0x
1660: 32 30 32 30 32 30 32 30 3b 0d 0a 09 09 09 63 68 20202020;.....ch
1670: 61 72 2a 20 70 74 72 20 3d 20 28 28 63 68 61 72 ar* ptr = ((char
1680: 2a 29 26 62 75 66 29 20 2b 20 33 3b 0d 0a 09 09 *)&buf) + 3;....
1690: 09 64 6f 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 44 .do.....{......D
16a0: 57 4f 52 44 20 6d 6f 64 20 3d 20 69 64 20 25 20 WORD mod = id %
16b0: 33 36 3b 0d 0a 09 09 09 09 2a 70 74 72 2d 2d 20 36;......*ptr--
16c0: 3d 20 6d 6f 64 20 3c 20 31 30 20 3f 20 6d 6f 64 = mod < 10 ? mod
16d0: 20 2b 20 27 30 27 20 3a 20 6d 6f 64 20 2d 20 31 + '0' : mod - 1
16e0: 30 20 2b 20 27 41 27 3b 0d 0a 09 09 09 09 69 64 0 + 'A';......id
16f0: 20 2f 3d 20 33 36 3b 0d 0a 09 09 09 7d 77 68 69 /= 36;.....}whi
1700: 6c 65 28 69 64 29 3b 0d 0a 0d 0a 09 09 09 70 4f le(id);.......pO
1710: 6e 65 46 69 65 6c 64 2d 3e 74 79 70 65 20 3d 20 neField->type =
1720: 6f 6e 65 5f 66 69 65 6c 64 3a 3a 66 4c 6f 6e 67 one_field::fLong
1730: 53 74 72 3b 0d 0a 09 09 09 70 4f 6e 65 46 69 65 Str;.....pOneFie
1740: 6c 64 2d 3e 6d 5f 6e 61 6d 65 20 3d 20 70 4f 62 ld->m_name = pOb
1750: 6a 2d 3e 6d 5f 43 6f 64 65 3b 0d 0a 09 09 09 70 j->m_Code;.....p
1760: 4f 6e 65 46 69 65 6c 64 2d 3e 70 6f 73 69 74 69 OneField->positi
1770: 6f 6e 20 3d 20 62 75 66 3b 0d 0a 09 09 09 63 72 on = buf;.....cr
1780: 65 61 74 65 20 3d 20 63 72 65 61 74 65 20 2b 20 eate = create +
1790: 22 2c 22 20 2b 20 70 4f 6e 65 46 69 65 6c 64 2d "," + pOneField-
17a0: 3e 6d 5f 6e 61 6d 65 20 2b 20 22 20 74 65 78 74 >m_name + " text
17b0: 20 63 6f 6c 6c 61 74 65 20 5f 31 43 20 64 65 66 collate _1C def
17c0: 61 75 6c 74 20 6e 75 6c 6c 5c 72 5c 6e 22 3b 0d ault null\r\n";.
17d0: 0a 09 09 09 70 4f 6e 65 46 69 65 6c 64 2b 2b 3b ....pOneField++;
17e0: 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 0d 0a 09 43 53 ....}...}.....CS
17f0: 74 72 69 6e 67 20 69 64 78 4e 61 6d 65 3b 0d 0a tring idxName;..
1800: 0d 0a 09 66 6f 72 28 69 20 3d 20 30 3b 20 69 20 ...for(i = 0; i
1810: 3c 20 6d 5f 70 68 69 73 49 6e 66 6f 2d 3e 69 6e < m_phisInfo->in
1820: 64 65 78 65 73 43 6f 75 6e 74 28 29 20 3b 20 69 dexesCount() ; i
1830: 2b 2b 29 0d 0a 09 7b 0d 0a 09 09 43 49 6e 64 65 ++)...{....CInde
1840: 78 45 78 2a 20 70 49 6e 64 65 78 20 3d 20 6d 5f xEx* pIndex = m_
1850: 70 54 61 62 6c 65 2d 3e 69 6e 64 65 78 28 69 29 pTable->index(i)
1860: 3b 0d 0a 09 09 0d 0a 09 09 44 57 4f 52 44 20 6c ;........DWORD l
1870: 65 6e 20 3d 20 30 2c 20 6e 43 6f 75 6e 74 20 3d en = 0, nCount =
1880: 20 70 49 6e 64 65 78 2d 3e 66 69 65 6c 64 73 43 pIndex->fieldsC
1890: 6f 75 6e 74 28 29 3b 0d 0a 09 09 69 64 78 4e 61 ount();....idxNa
18a0: 6d 65 20 3d 20 22 69 64 78 22 3b 0d 0a 09 09 66 me = "idx";....f
18b0: 6f 72 28 44 57 4f 52 44 20 6a 20 3d 20 30 3b 20 or(DWORD j = 0;
18c0: 6a 20 3c 20 6e 43 6f 75 6e 74 20 3b 20 6a 2b 2b j < nCount ; j++
18d0: 29 0d 0a 09 09 7b 0d 0a 09 09 09 43 46 69 65 6c )....{.....CFiel
18e0: 64 2a 20 70 46 69 65 6c 64 20 3d 20 70 49 6e 64 d* pField = pInd
18f0: 65 78 2d 3e 66 69 65 6c 64 28 6a 29 3b 0d 0a 0d ex->field(j);...
1900: 0a 09 09 09 69 66 28 21 61 6c 69 61 63 65 73 2e ....if(!aliaces.
1910: 4c 6f 6f 6b 75 70 28 70 46 69 65 6c 64 2d 3e 73 Lookup(pField->s
1920: 7a 4e 61 6d 65 2c 20 6e 61 6d 65 29 29 0d 0a 09 zName, name))...
1930: 09 09 09 6e 61 6d 65 20 3d 20 70 46 69 65 6c 64 ...name = pField
1940: 2d 3e 73 7a 4e 61 6d 65 3b 0d 0a 09 09 09 69 64 ->szName;.....id
1950: 78 4e 61 6d 65 20 3d 20 69 64 78 4e 61 6d 65 20 xName = idxName
1960: 2b 20 27 5f 27 20 2b 20 6e 61 6d 65 3b 0d 0a 09 + '_' + name;...
1970: 09 09 6c 65 6e 20 2b 3d 20 70 46 69 65 6c 64 2d ..len += pField-
1980: 3e 73 69 7a 65 43 46 69 65 6c 64 3b 0d 0a 09 09 >sizeCField;....
1990: 7d 0d 0a 09 09 66 6d 74 2e 46 6f 72 6d 61 74 28 }....fmt.Format(
19a0: 22 2c 20 25 73 20 63 68 61 72 28 25 69 29 20 63 ", %s char(%i) c
19b0: 6f 6c 6c 61 74 65 20 5f 31 43 20 64 65 66 61 75 ollate _1C defau
19c0: 6c 74 20 6e 75 6c 6c 5c 72 5c 6e 22 2c 20 69 64 lt null\r\n", id
19d0: 78 4e 61 6d 65 2c 20 6c 65 6e 29 3b 0d 0a 09 09 xName, len);....
19e0: 63 72 65 61 74 65 20 2b 3d 20 66 6d 74 3b 0d 0a create += fmt;..
19f0: 09 09 70 4f 6e 65 46 69 65 6c 64 2d 3e 74 79 70 ..pOneField->typ
1a00: 65 20 3d 20 6f 6e 65 5f 66 69 65 6c 64 3a 3a 66 e = one_field::f
1a10: 56 69 72 74 49 64 78 3b 0d 0a 09 09 70 4f 6e 65 VirtIdx;....pOne
1a20: 46 69 65 6c 64 2d 3e 70 6f 73 69 74 69 6f 6e 20 Field->position
1a30: 3d 20 69 3b 0d 0a 09 09 70 4f 6e 65 46 69 65 6c = i;....pOneFiel
1a40: 64 2d 3e 6d 5f 6e 61 6d 65 20 3d 20 43 53 74 72 d->m_name = CStr
1a50: 69 6e 67 28 70 49 6e 64 65 78 2d 3e 73 7a 4e 61 ing(pIndex->szNa
1a60: 6d 65 29 20 2b 20 27 5b 27 20 2b 20 28 28 4c 50 me) + '[' + ((LP
1a70: 43 53 54 52 29 69 64 78 4e 61 6d 65 20 2b 20 31 CSTR)idxName + 1
1a80: 29 20 2b 20 27 5d 27 3b 0d 0a 09 09 70 4f 6e 65 ) + ']';....pOne
1a90: 46 69 65 6c 64 2b 2b 3b 0d 0a 09 7d 0d 0a 09 0d Field++;...}....
1aa0: 0a 09 63 72 65 61 74 65 2e 53 65 74 41 74 28 30 ..create.SetAt(0
1ab0: 2c 20 27 20 27 29 3b 0d 0a 09 6d 5f 73 74 72 53 , ' ');...m_strS
1ac0: 71 6c 43 72 65 61 74 65 2e 46 6f 72 6d 61 74 28 qlCreate.Format(
1ad0: 22 63 72 65 61 74 65 20 74 61 62 6c 65 20 78 28 "create table x(
1ae0: 5c 72 5c 6e 25 73 29 22 2c 20 63 72 65 61 74 65 \r\n%s)", create
1af0: 29 3b 0d 0a 09 69 66 28 62 44 6f 54 72 61 63 65 );...if(bDoTrace
1b00: 29 0d 0a 09 09 44 6f 4d 73 67 4c 69 6e 65 28 22 )....DoMsgLine("
1b10: 25 73 22 2c 20 6d 6d 4e 6f 6e 65 2c 20 6d 5f 73 %s", mmNone, m_s
1b20: 74 72 53 71 6c 43 72 65 61 74 65 29 3b 0d 0a 09 trSqlCreate);...
1b30: 75 38 74 65 78 74 3a 3a 74 6f 55 74 66 38 28 6d u8text::toUtf8(m
1b40: 5f 73 74 72 53 71 6c 43 72 65 61 74 65 29 3b 0d _strSqlCreate);.
1b50: 0a 0d 0a 09 2f 2f 20 cf ee eb f3 f7 e8 ec 20 ef ....// ....... .
1b60: f0 e8 e1 eb e8 e7 e8 f2 e5 eb fc ed ee e5 20 ea .............. .
1b70: ee eb e8 f7 e5 f1 f2 e2 ee 20 f1 f2 f0 ee ea 2e ......... ......
1b80: 0d 0a 09 43 53 74 6f 72 65 4f 62 6a 20 73 74 6f ...CStoreObj sto
1b90: 72 65 28 6d 5f 70 54 61 62 6c 65 2c 20 4e 55 4c re(m_pTable, NUL
1ba0: 4c 29 3b 0d 0a 09 73 74 6f 72 65 2e 47 6f 74 6f L);...store.Goto
1bb0: 28 6e 61 76 4c 61 73 74 2c 20 30 29 3b 0d 0a 09 (navLast, 0);...
1bc0: 44 57 4f 52 44 20 61 70 70 72 6f 78 52 6f 77 43 DWORD approxRowC
1bd0: 6f 75 6e 74 20 3d 20 73 74 6f 72 65 2e 6d 5f 70 ount = store.m_p
1be0: 6f 73 3b 0d 0a 09 2f 2f 20 c2 fb f7 e8 f1 eb e8 os;...// .......
1bf0: ec 20 ef f0 e8 e1 eb e8 e7 e8 f2 e5 eb fc ed ee . ..............
1c00: e5 20 e7 ed e0 f7 e5 ed e8 e5 20 6c 6f 67 32 20 . ........ log2
1c10: ee f2 20 ea ee eb e8 f7 e5 f1 f2 e2 e0 20 f1 f2 .. .......... ..
1c20: f0 ee ea 2c 0d 0a 09 2f 2f 20 ea e0 ea 20 33 32 ...,...// ... 32
1c30: 20 2d 20 ea ee eb e8 f7 e5 f1 f2 e2 ee 20 e2 e5 - .......... ..
1c40: e4 f3 f9 e8 f5 20 ed f3 eb e5 e9 20 e2 20 e1 e8 ..... ..... . ..
1c50: f2 e0 f5 20 f7 e8 f1 eb e0 0d 0a 09 6c 6f 67 52 ... ........logR
1c60: 6f 77 43 6f 75 6e 74 20 3d 20 33 32 3b 0d 0a 09 owCount = 32;...
1c70: 44 57 4f 52 44 20 72 20 3d 20 61 70 70 72 6f 78 DWORD r = approx
1c80: 52 6f 77 43 6f 75 6e 74 3b 0d 0a 09 69 66 28 30 RowCount;...if(0
1c90: 20 3d 3d 20 28 72 20 26 20 30 78 46 46 46 46 30 == (r & 0xFFFF0
1ca0: 30 30 30 29 29 7b 6c 6f 67 52 6f 77 43 6f 75 6e 000)){logRowCoun
1cb0: 74 20 2d 3d 20 31 36 3b 20 72 20 3c 3c 3d 20 31 t -= 16; r <<= 1
1cc0: 36 3b 7d 0d 0a 09 69 66 28 30 20 3d 3d 20 28 72 6;}...if(0 == (r
1cd0: 20 26 20 30 78 46 46 30 30 30 30 30 30 29 29 7b & 0xFF000000)){
1ce0: 6c 6f 67 52 6f 77 43 6f 75 6e 74 20 2d 3d 20 38 logRowCount -= 8
1cf0: 3b 20 72 20 3c 3c 3d 20 38 3b 7d 0d 0a 09 69 66 ; r <<= 8;}...if
1d00: 28 30 20 3d 3d 20 28 72 20 26 20 30 78 46 30 30 (0 == (r & 0xF00
1d10: 30 30 30 30 30 29 29 7b 6c 6f 67 52 6f 77 43 6f 00000)){logRowCo
1d20: 75 6e 74 20 2d 3d 20 34 3b 20 72 20 3c 3c 3d 20 unt -= 4; r <<=
1d30: 34 3b 7d 0d 0a 09 69 66 28 30 20 3d 3d 20 28 72 4;}...if(0 == (r
1d40: 20 26 20 30 78 43 30 30 30 30 30 30 30 29 29 7b & 0xC0000000)){
1d50: 6c 6f 67 52 6f 77 43 6f 75 6e 74 20 2d 3d 20 32 logRowCount -= 2
1d60: 3b 7d 0d 0a 7d 0d 0a 0d 0a 2f 2f 20 c8 ed f4 f0 ;}..}....// ....
1d70: e0 f1 f2 f0 f3 ea f2 f3 f0 e0 20 e4 eb ff 20 ef .......... ... .
1d80: ee f1 f2 f0 ee e5 ed e8 ff 20 f6 e5 ef ee f7 ea ......... ......
1d90: e8 20 ea eb e0 f1 f1 ee e2 2d ee e1 f0 e0 e1 ee . .......-......
1da0: f2 f7 e8 ea ee e2 0d 0a 73 74 72 75 63 74 20 6e ........struct n
1db0: 75 6c 6c 5f 6f 62 6a 65 63 74 7b 65 6e 75 6d 7b ull_object{enum{
1dc0: 76 61 6c 20 3d 20 2d 31 7d 3b 7d 3b 0d 0a 74 65 val = -1};};..te
1dd0: 6d 70 6c 61 74 65 3c 69 6e 74 20 49 3e 20 73 74 mplate<int I> st
1de0: 72 75 63 74 20 70 72 65 76 5f 74 79 70 65 7b 74 ruct prev_type{t
1df0: 79 70 65 64 65 66 20 70 72 65 76 5f 74 79 70 65 ypedef prev_type
1e00: 3c 49 2d 31 3e 3a 3a 74 79 70 65 20 74 79 70 65 <I-1>::type type
1e10: 3b 7d 3b 0d 0a 74 65 6d 70 6c 61 74 65 3c 3e 20 ;};..template<>
1e20: 73 74 72 75 63 74 20 70 72 65 76 5f 74 79 70 65 struct prev_type
1e30: 3c 5f 5f 4c 49 4e 45 5f 5f 3e 7b 20 74 79 70 65 <__LINE__>{ type
1e40: 64 65 66 20 6e 75 6c 6c 5f 6f 62 6a 65 63 74 20 def null_object
1e50: 74 79 70 65 3b 20 7d 3b 0d 0a 0d 0a 23 64 65 66 type; };....#def
1e60: 69 6e 65 20 46 49 4e 44 5f 43 4c 41 53 53 28 63 ine FIND_CLASS(c
1e70: 6c 61 73 73 4e 61 6d 65 29 5c 0d 0a 73 74 72 75 lassName)\..stru
1e80: 63 74 20 63 6c 61 73 73 4e 61 6d 65 23 23 5f 66 ct className##_f
1e90: 64 5c 0d 0a 7b 5c 0d 0a 09 74 79 70 65 64 65 66 d\..{\...typedef
1ea0: 20 70 72 65 76 5f 74 79 70 65 3c 5f 5f 4c 49 4e prev_type<__LIN
1eb0: 45 5f 5f 20 2d 20 31 3e 3a 3a 74 79 70 65 20 70 E__ - 1>::type p
1ec0: 72 65 76 3b 5c 0d 0a 09 74 79 70 65 64 65 66 20 rev;\...typedef
1ed0: 63 6c 61 73 73 4e 61 6d 65 20 63 6c 61 73 73 54 className classT
1ee0: 79 70 65 3b 5c 0d 0a 09 65 6e 75 6d 7b 76 61 6c ype;\...enum{val
1ef0: 20 3d 20 70 72 65 76 3a 3a 76 61 6c 20 2b 20 31 = prev::val + 1
1f00: 7d 3b 5c 0d 0a 7d 3b 5c 0d 0a 74 65 6d 70 6c 61 };\..};\..templa
1f10: 74 65 3c 3e 20 73 74 72 75 63 74 20 70 72 65 76 te<> struct prev
1f20: 5f 74 79 70 65 3c 5f 5f 4c 49 4e 45 5f 5f 3e 20 _type<__LINE__>
1f30: 7b 74 79 70 65 64 65 66 20 63 6c 61 73 73 4e 61 {typedef classNa
1f40: 6d 65 23 23 5f 66 64 20 74 79 70 65 3b 7d 0d 0a me##_fd type;}..
1f50: 0d 0a 73 74 72 75 63 74 20 66 69 72 73 74 5f 73 ..struct first_s
1f60: 74 72 69 6e 67 5f 68 61 73 68 0d 0a 7b 0d 0a 09 tring_hash..{...
1f70: 43 4e 6f 43 61 73 65 4d 61 70 3c 69 6e 74 3e 20 CNoCaseMap<int>
1f80: 54 79 70 65 4e 75 6d 73 3b 0d 0a 09 74 65 6d 70 TypeNums;...temp
1f90: 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 3e late<typename T>
1fa0: 0d 0a 09 5f 5f 66 6f 72 63 65 69 6e 6c 69 6e 65 ...__forceinline
1fb0: 20 66 69 72 73 74 5f 73 74 72 69 6e 67 5f 68 61 first_string_ha
1fc0: 73 68 28 54 2a 20 70 29 0d 0a 09 7b 0d 0a 09 09 sh(T* p)...{....
1fd0: 46 69 6c 6c 28 70 29 3b 0d 0a 09 7d 0d 0a 09 74 Fill(p);...}...t
1fe0: 65 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 emplate<typename
1ff0: 20 54 3e 0d 0a 09 5f 5f 66 6f 72 63 65 69 6e 6c T>...__forceinl
2000: 69 6e 65 20 76 6f 69 64 20 46 69 6c 6c 28 54 2a ine void Fill(T*
2010: 29 0d 0a 09 7b 0d 0a 09 09 4c 50 43 53 54 52 20 )...{....LPCSTR
2020: 70 31 2c 20 70 32 3b 0d 0a 09 09 54 3a 3a 63 6c p1, p2;....T::cl
2030: 61 73 73 54 79 70 65 3a 3a 47 65 74 46 69 6e 64 assType::GetFind
2040: 49 6e 66 6f 28 70 31 2c 20 70 32 29 3b 0d 0a 09 Info(p1, p2);...
2050: 09 54 79 70 65 4e 75 6d 73 5b 70 31 5d 20 3d 20 .TypeNums[p1] =
2060: 54 3a 3a 76 61 6c 3b 0d 0a 09 09 54 79 70 65 4e T::val;....TypeN
2070: 75 6d 73 5b 70 32 5d 20 3d 20 54 3a 3a 76 61 6c ums[p2] = T::val
2080: 3b 0d 0a 09 09 46 69 6c 6c 28 28 54 3a 3a 70 72 ;....Fill((T::pr
2090: 65 76 2a 29 4e 55 4c 4c 29 3b 0d 0a 09 7d 0d 0a ev*)NULL);...}..
20a0: 09 74 65 6d 70 6c 61 74 65 3c 3e 20 76 6f 69 64 .template<> void
20b0: 20 46 69 6c 6c 3c 6e 75 6c 6c 5f 6f 62 6a 65 63 Fill<null_objec
20c0: 74 3e 28 6e 75 6c 6c 5f 6f 62 6a 65 63 74 2a 29 t>(null_object*)
20d0: 7b 7d 0d 0a 7d 3b 0d 0a 0d 0a 74 65 6d 70 6c 61 {}..};....templa
20e0: 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 3e 0d 0a te<typename T>..
20f0: 5f 5f 66 6f 72 63 65 69 6e 6c 69 6e 65 20 43 56 __forceinline CV
2100: 74 61 62 49 6e 66 6f 2a 20 5f 47 65 74 4f 62 6a tabInfo* _GetObj
2110: 65 63 74 28 43 53 74 72 69 6e 67 41 72 72 61 79 ect(CStringArray
2120: 26 20 61 72 72 4f 66 4e 61 6d 65 73 2c 20 43 4e & arrOfNames, CN
2130: 6f 43 61 73 65 4d 61 70 3c 43 56 74 61 62 49 6e oCaseMap<CVtabIn
2140: 66 6f 2a 3e 26 20 61 6c 6c 4f 62 6a 65 63 74 73 fo*>& allObjects
2150: 2c 20 63 6f 6e 73 74 20 69 6e 74 20 69 54 79 70 , const int iTyp
2160: 65 4e 75 6d 2c 20 54 2a 20 70 3d 4e 55 4c 4c 29 eNum, T* p=NULL)
2170: 0d 0a 7b 0d 0a 09 69 66 28 54 3a 3a 76 61 6c 20 ..{...if(T::val
2180: 3d 3d 20 69 54 79 70 65 4e 75 6d 29 0d 0a 09 7b == iTypeNum)...{
2190: 0d 0a 09 09 43 53 74 72 69 6e 67 20 73 74 72 4e ....CString strN
21a0: 61 6d 65 3b 0d 0a 09 09 74 79 70 65 64 65 66 20 ame;....typedef
21b0: 54 3a 3a 63 6c 61 73 73 54 79 70 65 20 63 74 3b T::classType ct;
21c0: 0d 0a 09 09 69 66 28 21 63 74 3a 3a 47 65 74 4e ....if(!ct::GetN
21d0: 61 6d 65 46 72 6f 6d 28 61 72 72 4f 66 4e 61 6d ameFrom(arrOfNam
21e0: 65 73 2c 20 73 74 72 4e 61 6d 65 29 29 0d 0a 09 es, strName))...
21f0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a ..return NULL;..
2200: 09 09 73 74 72 4e 61 6d 65 2e 49 6e 73 65 72 74 ..strName.Insert
2210: 28 30 2c 20 63 74 3a 3a 47 65 74 50 72 65 66 69 (0, ct::GetPrefi
2220: 78 28 29 29 3b 0d 0a 09 09 43 56 74 61 62 49 6e x());....CVtabIn
2230: 66 6f 2a 20 70 49 6e 66 6f 3b 0d 0a 09 09 69 66 fo* pInfo;....if
2240: 28 61 6c 6c 4f 62 6a 65 63 74 73 2e 4c 6f 6f 6b (allObjects.Look
2250: 75 70 28 73 74 72 4e 61 6d 65 2c 20 70 49 6e 66 up(strName, pInf
2260: 6f 29 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 70 o)).....return p
2270: 49 6e 66 6f 3b 0d 0a 09 09 70 49 6e 66 6f 20 3d Info;....pInfo =
2280: 20 6e 65 77 20 63 74 28 61 72 72 4f 66 4e 61 6d new ct(arrOfNam
2290: 65 73 29 3b 0d 0a 09 09 69 66 28 21 70 49 6e 66 es);....if(!pInf
22a0: 6f 2d 3e 74 61 62 6c 65 28 29 29 0d 0a 09 09 7b o->table())....{
22b0: 0d 0a 09 09 09 73 74 61 74 69 63 5f 63 61 73 74 .....static_cast
22c0: 3c 63 74 2a 3e 28 70 49 6e 66 6f 29 2d 3e 46 72 <ct*>(pInfo)->Fr
22d0: 65 65 28 29 3b 0d 0a 09 09 09 70 49 6e 66 6f 20 ee();.....pInfo
22e0: 3d 20 4e 55 4c 4c 3b 0d 0a 09 09 7d 0d 0a 09 09 = NULL;....}....
22f0: 65 6c 73 65 0d 0a 09 09 09 61 6c 6c 4f 62 6a 65 else.....allObje
2300: 63 74 73 5b 73 74 72 4e 61 6d 65 5d 20 3d 20 70 cts[strName] = p
2310: 49 6e 66 6f 3b 0d 0a 09 09 72 65 74 75 72 6e 20 Info;....return
2320: 70 49 6e 66 6f 3b 0d 0a 09 7d 0d 0a 09 65 6c 73 pInfo;...}...els
2330: 65 0d 0a 09 09 72 65 74 75 72 6e 20 5f 47 65 74 e....return _Get
2340: 4f 62 6a 65 63 74 28 61 72 72 4f 66 4e 61 6d 65 Object(arrOfName
2350: 73 2c 20 61 6c 6c 4f 62 6a 65 63 74 73 2c 20 69 s, allObjects, i
2360: 54 79 70 65 4e 75 6d 2c 20 28 54 3a 3a 70 72 65 TypeNum, (T::pre
2370: 76 2a 29 4e 55 4c 4c 29 3b 0d 0a 7d 0d 0a 74 65 v*)NULL);..}..te
2380: 6d 70 6c 61 74 65 3c 3e 0d 0a 5f 5f 66 6f 72 63 mplate<>..__forc
2390: 65 69 6e 6c 69 6e 65 20 43 56 74 61 62 49 6e 66 einline CVtabInf
23a0: 6f 2a 20 5f 47 65 74 4f 62 6a 65 63 74 3c 6e 75 o* _GetObject<nu
23b0: 6c 6c 5f 6f 62 6a 65 63 74 3e 28 43 53 74 72 69 ll_object>(CStri
23c0: 6e 67 41 72 72 61 79 26 20 61 72 72 4f 66 4e 61 ngArray& arrOfNa
23d0: 6d 65 73 2c 20 43 4e 6f 43 61 73 65 4d 61 70 3c mes, CNoCaseMap<
23e0: 43 56 74 61 62 49 6e 66 6f 2a 3e 26 20 61 6c 6c CVtabInfo*>& all
23f0: 4f 62 6a 65 63 74 73 2c 20 63 6f 6e 73 74 20 69 Objects, const i
2400: 6e 74 20 69 54 79 70 65 4e 75 6d 2c 20 6e 75 6c nt iTypeNum, nul
2410: 6c 5f 6f 62 6a 65 63 74 2a 20 70 29 0d 0a 7b 0d l_object* p)..{.
2420: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a ..return NULL;..
2430: 7d 0d 0a 0d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f }....///////////
2440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d ///////////////.
2480: 0a 2f 2f 20 cd c0 d7 c0 cb ce 20 ce cf c8 d1 c0 .// ...... .....
2490: cd c8 df 20 ca cb c0 d1 d1 ce c2 20 ce c1 da c5 ... ....... ....
24a0: ca d2 ce c2 20 d0 c0 c7 cb c8 d7 cd db d5 20 d2 .... ......... .
24b0: c0 c1 cb c8 d6 0d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f ......./////////
24c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
24d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
24e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
24f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2500: 2f 0d 0a 46 49 4e 44 5f 43 4c 41 53 53 28 43 52 /..FIND_CLASS(CR
2510: 65 66 65 72 65 6e 63 65 54 61 62 49 6e 66 6f 29 eferenceTabInfo)
2520: 3b 0d 0a 46 49 4e 44 5f 43 4c 41 53 53 28 43 4a ;..FIND_CLASS(CJ
2530: 6f 75 72 6e 49 6e 66 6f 29 3b 0d 0a 46 49 4e 44 ournInfo);..FIND
2540: 5f 43 4c 41 53 53 28 43 44 48 54 61 62 49 6e 66 _CLASS(CDHTabInf
2550: 6f 29 3b 0d 0a 46 49 4e 44 5f 43 4c 41 53 53 28 o);..FIND_CLASS(
2560: 43 44 54 54 61 62 49 6e 66 6f 29 3b 0d 0a 46 49 CDTTabInfo);..FI
2570: 4e 44 5f 43 4c 41 53 53 28 43 52 65 67 54 61 62 ND_CLASS(CRegTab
2580: 49 6e 66 6f 29 3b 0d 0a 46 49 4e 44 5f 43 4c 41 Info);..FIND_CLA
2590: 53 53 28 43 52 65 67 54 6f 74 61 6c 73 54 61 62 SS(CRegTotalsTab
25a0: 49 6e 66 6f 29 3b 0d 0a 46 49 4e 44 5f 43 4c 41 Info);..FIND_CLA
25b0: 53 53 28 43 43 6f 72 65 54 61 62 73 29 3b 0d 0a SS(CCoreTabs);..
25c0: 46 49 4e 44 5f 43 4c 41 53 53 28 43 43 4a 54 61 FIND_CLASS(CCJTa
25d0: 62 49 6e 66 6f 29 3b 0d 0a 2f 2f 20 ca ce cd c5 bInfo);..// ....
25e0: d6 20 ce cf c8 d1 c0 cd c8 df 20 ca cb c0 d1 d1 . ........ .....
25f0: ce c2 20 ce c1 da c5 ca d2 ce c2 20 d0 c0 c7 cb .. ........ ....
2600: c8 d7 cd db d5 20 d2 c0 c1 cb c8 d6 0d 0a 0d 0a ..... ..........
2610: 74 79 70 65 64 65 66 20 70 72 65 76 5f 74 79 70 typedef prev_typ
2620: 65 3c 5f 5f 4c 49 4e 45 5f 5f 3e 3a 3a 74 79 70 e<__LINE__>::typ
2630: 65 20 6c 61 73 74 46 69 6e 64 54 79 70 65 3b 0d e lastFindType;.
2640: 0a 0d 0a 43 56 74 61 62 49 6e 66 6f 2a 20 43 56 ...CVtabInfo* CV
2650: 74 61 62 49 6e 66 6f 3a 3a 74 61 62 49 6e 66 6f tabInfo::tabInfo
2660: 46 6f 72 4e 61 6d 65 28 63 6f 6e 73 74 20 43 53 ForName(const CS
2670: 74 72 69 6e 67 26 20 73 74 72 55 73 65 72 4e 61 tring& strUserNa
2680: 6d 65 29 0d 0a 7b 0d 0a 09 73 74 61 74 69 63 20 me)..{...static
2690: 66 69 72 73 74 5f 73 74 72 69 6e 67 5f 68 61 73 first_string_has
26a0: 68 20 66 73 68 28 28 6c 61 73 74 46 69 6e 64 54 h fsh((lastFindT
26b0: 79 70 65 2a 29 4e 55 4c 4c 29 3b 0d 0a 09 43 53 ype*)NULL);...CS
26c0: 74 72 69 6e 67 41 72 72 61 79 20 61 72 72 4f 66 tringArray arrOf
26d0: 4e 61 6d 65 73 3b 0d 0a 09 53 70 6c 69 74 53 74 Names;...SplitSt
26e0: 72 32 41 72 72 61 79 28 73 74 72 55 73 65 72 4e r2Array(strUserN
26f0: 61 6d 65 2c 20 61 72 72 4f 66 4e 61 6d 65 73 29 ame, arrOfNames)
2700: 3b 0d 0a 09 69 66 28 21 61 72 72 4f 66 4e 61 6d ;...if(!arrOfNam
2710: 65 73 2e 47 65 74 53 69 7a 65 28 29 29 0d 0a 09 es.GetSize())...
2720: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a 09 .return NULL;...
2730: 69 6e 74 20 69 54 79 70 65 4e 75 6d 3b 0d 0a 09 int iTypeNum;...
2740: 69 66 28 21 66 73 68 2e 54 79 70 65 4e 75 6d 73 if(!fsh.TypeNums
2750: 2e 4c 6f 6f 6b 75 70 28 61 72 72 4f 66 4e 61 6d .Lookup(arrOfNam
2760: 65 73 5b 30 5d 2c 20 69 54 79 70 65 4e 75 6d 29 es[0], iTypeNum)
2770: 29 0d 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c )....return NULL
2780: 3b 0d 0a 09 72 65 74 75 72 6e 20 5f 47 65 74 4f ;...return _GetO
2790: 62 6a 65 63 74 3c 6c 61 73 74 46 69 6e 64 54 79 bject<lastFindTy
27a0: 70 65 3e 28 61 72 72 4f 66 4e 61 6d 65 73 2c 20 pe>(arrOfNames,
27b0: 6d 5f 61 6c 6c 54 61 62 73 2c 20 69 54 79 70 65 m_allTabs, iType
27c0: 4e 75 6d 29 3b 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 Num);..}....void
27d0: 20 6f 6e 65 5f 66 69 65 6c 64 3a 3a 63 6f 6c 75 one_field::colu
27e0: 6d 6e 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 mn(sqlite3_conte
27f0: 78 74 2a 20 70 43 74 78 2c 20 63 6f 6e 73 74 20 xt* pCtx, const
2800: 63 75 72 73 6f 72 5f 64 61 74 61 26 20 63 75 72 cursor_data& cur
2810: 73 6f 72 2c 20 63 6f 6e 73 74 20 43 56 74 61 62 sor, const CVtab
2820: 49 6e 66 6f 26 20 74 61 62 6c 65 29 20 63 6f 6e Info& table) con
2830: 73 74 0d 0a 7b 0d 0a 09 73 74 61 74 69 63 20 43 st..{...static C
2840: 53 74 72 69 6e 67 20 76 61 6c 3b 0d 0a 09 69 66 String val;...if
2850: 28 69 73 46 69 65 6c 64 28 29 29 0d 0a 09 7b 0d (isField())...{.
2860: 0a 09 09 63 6f 6e 73 74 20 66 69 65 6c 64 5f 69 ...const field_i
2870: 6e 66 6f 26 20 66 69 20 3d 20 74 61 62 6c 65 2e nfo& fi = table.
2880: 70 68 69 73 49 6e 66 6f 28 29 2e 66 69 65 6c 64 phisInfo().field
2890: 28 70 6f 73 69 74 69 6f 6e 29 3b 0d 0a 09 09 6d (position);....m
28a0: 65 6d 63 70 79 28 76 61 6c 2e 47 65 74 42 75 66 emcpy(val.GetBuf
28b0: 66 65 72 53 65 74 4c 65 6e 67 74 68 28 66 69 2e ferSetLength(fi.
28c0: 6c 65 6e 67 74 68 28 29 29 2c 20 63 75 72 73 6f length()), curso
28d0: 72 2e 72 65 63 6f 72 64 2e 62 75 66 65 72 28 29 r.record.bufer()
28e0: 20 2b 20 66 69 2e 6f 66 66 73 65 74 49 6e 52 65 + fi.offsetInRe
28f0: 63 6f 72 64 28 29 2c 20 66 69 2e 6c 65 6e 67 74 cord(), fi.lengt
2900: 68 28 29 29 3b 0d 0a 09 09 69 66 28 66 69 2e 74 h());....if(fi.t
2910: 79 70 65 28 29 20 3d 3d 20 66 69 65 6c 64 5f 69 ype() == field_i
2920: 6e 66 6f 3a 3a 66 74 4e 75 6d 65 72 69 63 29 0d nfo::ftNumeric).
2930: 0a 09 09 7b 0d 0a 09 09 09 69 66 28 66 69 2e 70 ...{.....if(fi.p
2940: 72 65 63 65 73 73 69 6f 6e 28 29 29 0d 0a 09 09 recession())....
2950: 09 09 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 ..sqlite3_result
2960: 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 61 74 _double(pCtx, at
2970: 6f 66 28 76 61 6c 29 29 3b 0d 0a 09 09 09 65 6c of(val));.....el
2980: 73 65 0d 0a 09 09 09 09 73 71 6c 69 74 65 33 5f se......sqlite3_
2990: 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c result_int(pCtx,
29a0: 20 61 74 6f 6c 28 76 61 6c 29 29 3b 0d 0a 09 09 atol(val));....
29b0: 7d 0d 0a 09 09 65 6c 73 65 0d 0a 09 09 7b 0d 0a }....else....{..
29c0: 09 09 09 75 38 74 65 78 74 3a 3a 74 6f 55 74 66 ...u8text::toUtf
29d0: 38 28 76 61 6c 29 3b 0d 0a 09 09 09 73 71 6c 69 8(val);.....sqli
29e0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 te3_result_text(
29f0: 70 43 74 78 2c 20 76 61 6c 2c 20 76 61 6c 2e 47 pCtx, val, val.G
2a00: 65 74 4c 65 6e 67 74 68 28 29 2c 20 53 51 4c 49 etLength(), SQLI
2a10: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0d 0a TE_TRANSIENT);..
2a20: 09 09 7d 0d 0a 09 7d 0d 0a 09 65 6c 73 65 20 69 ..}...}...else i
2a30: 66 28 69 73 49 6e 64 65 78 28 29 29 0d 0a 09 7b f(isIndex())...{
2a40: 0d 0a 09 09 63 6f 6e 73 74 20 69 6e 64 65 78 5f ....const index_
2a50: 69 6e 66 6f 2a 20 70 49 6e 64 65 78 49 6e 66 6f info* pIndexInfo
2a60: 20 3d 20 74 61 62 6c 65 2e 70 68 69 73 49 6e 66 = table.phisInf
2a70: 6f 28 29 2e 69 6e 64 65 78 28 70 6f 73 69 74 69 o().index(positi
2a80: 6f 6e 29 3b 0d 0a 09 09 4c 50 53 54 52 20 70 57 on);....LPSTR pW
2a90: 72 69 74 65 20 3d 20 76 61 6c 2e 47 65 74 42 75 rite = val.GetBu
2aa0: 66 66 65 72 53 65 74 4c 65 6e 67 74 68 28 70 49 fferSetLength(pI
2ab0: 6e 64 65 78 49 6e 66 6f 2d 3e 6b 65 79 53 69 7a ndexInfo->keySiz
2ac0: 65 28 29 20 2b 20 31 30 29 3b 0d 0a 09 09 63 6f e() + 10);....co
2ad0: 6e 73 74 20 69 64 78 5f 66 69 65 6c 64 5f 69 6e nst idx_field_in
2ae0: 66 6f 2a 20 70 46 69 65 6c 64 49 6e 66 6f 20 3d fo* pFieldInfo =
2af0: 20 70 49 6e 64 65 78 49 6e 66 6f 2d 3e 66 69 65 pIndexInfo->fie
2b00: 6c 64 73 28 29 3b 0d 0a 09 09 66 6f 72 28 44 57 lds();....for(DW
2b10: 4f 52 44 20 63 20 3d 20 70 49 6e 64 65 78 49 6e ORD c = pIndexIn
2b20: 66 6f 2d 3e 66 69 65 6c 64 73 43 6f 75 6e 74 28 fo->fieldsCount(
2b30: 29 3b 20 63 2d 2d 3b 29 0d 0a 09 09 7b 0d 0a 09 ); c--;)....{...
2b40: 09 09 69 6e 74 20 6c 65 6e 20 3d 20 70 46 69 65 ..int len = pFie
2b50: 6c 64 49 6e 66 6f 2d 3e 69 6e 66 6f 28 29 2e 6c ldInfo->info().l
2b60: 65 6e 67 74 68 28 29 3b 0d 0a 09 09 09 6d 65 6d ength();.....mem
2b70: 63 70 79 28 70 57 72 69 74 65 2c 20 63 75 72 73 cpy(pWrite, curs
2b80: 6f 72 2e 72 65 63 6f 72 64 2e 62 75 66 65 72 28 or.record.bufer(
2b90: 29 20 2b 20 70 46 69 65 6c 64 49 6e 66 6f 2d 3e ) + pFieldInfo->
2ba0: 69 6e 66 6f 28 29 2e 6f 66 66 73 65 74 49 6e 52 info().offsetInR
2bb0: 65 63 6f 72 64 28 29 2c 20 6c 65 6e 29 3b 0d 0a ecord(), len);..
2bc0: 09 09 09 70 57 72 69 74 65 20 2b 3d 20 6c 65 6e ...pWrite += len
2bd0: 3b 0d 0a 09 09 09 70 46 69 65 6c 64 49 6e 66 6f ;.....pFieldInfo
2be0: 2b 2b 3b 0d 0a 09 09 7d 0d 0a 09 09 70 57 72 69 ++;....}....pWri
2bf0: 74 65 20 2b 3d 20 39 3b 0d 0a 09 09 6c 6f 6e 67 te += 9;....long
2c00: 20 76 20 3d 20 63 75 72 73 6f 72 2e 73 74 6f 72 v = cursor.stor
2c10: 65 2e 6d 5f 70 6f 73 3b 0d 0a 09 09 66 6f 72 28 e.m_pos;....for(
2c20: 63 20 3d 20 31 30 3b 20 63 2d 2d 3b 20 70 57 72 c = 10; c--; pWr
2c30: 69 74 65 2d 2d 29 0d 0a 09 09 7b 0d 0a 09 09 09 ite--)....{.....
2c40: 69 66 28 76 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 if(v).....{.....
2c50: 09 2a 70 57 72 69 74 65 20 3d 20 28 76 20 25 20 .*pWrite = (v %
2c60: 31 30 29 20 2b 20 27 30 27 3b 0d 0a 09 09 09 09 10) + '0';......
2c70: 76 20 2f 3d 20 31 30 3b 0d 0a 09 09 09 7d 0d 0a v /= 10;.....}..
2c80: 09 09 09 65 6c 73 65 0d 0a 09 09 09 09 2a 70 57 ...else......*pW
2c90: 72 69 74 65 20 3d 20 27 20 27 3b 0d 0a 09 09 7d rite = ' ';....}
2ca0: 0d 0a 09 09 75 38 74 65 78 74 3a 3a 74 6f 55 74 ....u8text::toUt
2cb0: 66 38 28 76 61 6c 29 3b 0d 0a 09 09 73 71 6c 69 f8(val);....sqli
2cc0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 te3_result_text(
2cd0: 70 43 74 78 2c 20 76 61 6c 2c 20 76 61 6c 2e 47 pCtx, val, val.G
2ce0: 65 74 4c 65 6e 67 74 68 28 29 2c 20 53 51 4c 49 etLength(), SQLI
2cf0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0d 0a TE_TRANSIENT);..
2d00: 09 7d 0d 0a 09 65 6c 73 65 20 69 66 28 69 73 4c .}...else if(isL
2d10: 6e 53 74 72 28 29 29 0d 0a 09 7b 0d 0a 09 09 4c nStr())...{....L
2d20: 6f 6e 67 53 74 72 52 65 61 64 65 72 3a 3a 67 65 ongStrReader::ge
2d30: 74 28 29 2e 52 65 61 64 53 74 72 28 63 75 72 73 t().ReadStr(curs
2d40: 6f 72 2e 72 65 63 6f 72 64 2e 62 75 66 65 72 28 or.record.bufer(
2d50: 29 2c 20 70 6f 73 69 74 69 6f 6e 2c 20 76 61 6c ), position, val
2d60: 29 3b 0d 0a 09 09 75 38 74 65 78 74 3a 3a 74 6f );....u8text::to
2d70: 55 74 66 38 28 76 61 6c 29 3b 0d 0a 09 09 73 71 Utf8(val);....sq
2d80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 lite3_result_tex
2d90: 74 28 70 43 74 78 2c 20 76 61 6c 2c 20 76 61 6c t(pCtx, val, val
2da0: 2e 47 65 74 4c 65 6e 67 74 68 28 29 2c 20 53 51 .GetLength(), SQ
2db0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b LITE_TRANSIENT);
2dc0: 0d 0a 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 09 73 ...}...else....s
2dd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 qlite3_result_nu
2de0: 6c 6c 28 70 43 74 78 29 3b 0d 0a 7d 0d 0a ll(pCtx);..}..