Artifact
f1d66121a6a471f7bacfb61627e66a2e02c9b87d:
0000: 2f 2f 20 73 74 72 61 74 65 67 79 63 61 73 68 2e // strategycash.
0010: 63 70 70 0d 0a 23 69 6e 63 6c 75 64 65 20 22 53 cpp..#include "S
0020: 74 64 41 66 78 2e 68 22 0d 0a 23 69 6e 63 6c 75 tdAfx.h"..#inclu
0030: 64 65 20 22 73 74 72 61 74 65 67 79 63 61 73 68 de "strategycash
0040: 2e 68 22 0d 0a 0d 0a 42 4f 4f 4c 20 53 74 72 61 .h"....BOOL Stra
0050: 74 65 67 79 43 61 73 68 3a 3a 67 65 74 46 72 6f tegyCash::getFro
0060: 6d 43 61 73 68 28 73 71 6c 69 74 65 33 5f 69 6e mCash(sqlite3_in
0070: 64 65 78 5f 69 6e 66 6f 2a 20 70 49 64 78 2c 20 dex_info* pIdx,
0080: 43 53 74 72 69 6e 67 26 20 63 61 73 68 4b 65 79 CString& cashKey
0090: 29 0d 0a 7b 0d 0a 09 2f 2f 20 d1 f2 f0 ee e8 ec )..{...// ......
00a0: 20 f1 f2 f0 ee ea f3 0d 0a 09 63 61 73 68 4b 65 .........cashKe
00b0: 79 2e 45 6d 70 74 79 28 29 3b 0d 0a 09 44 57 4f y.Empty();...DWO
00c0: 52 44 20 63 20 3d 20 70 49 64 78 2d 3e 6e 43 6f RD c = pIdx->nCo
00d0: 6e 73 74 72 61 69 6e 74 3b 0d 0a 09 66 6f 72 28 nstraint;...for(
00e0: 63 6f 6e 73 74 72 61 69 6e 74 5f 70 74 72 20 70 constraint_ptr p
00f0: 74 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f 6e 73 tr = pIdx->aCons
0100: 74 72 61 69 6e 74 3b 20 63 2d 2d 3b 20 70 74 72 traint; c--; ptr
0110: 2b 2b 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 69 73 ++)...{....if(is
0120: 43 6f 6e 73 74 72 61 69 6e 74 28 70 74 72 29 29 Constraint(ptr))
0130: 0d 0a 09 09 7b 0d 0a 09 09 09 44 57 4f 52 44 20 ....{.....DWORD
0140: 76 61 6c 20 3d 20 70 74 72 2d 3e 69 43 6f 6c 75 val = ptr->iColu
0150: 6d 6e 3b 0d 0a 09 09 09 64 6f 0d 0a 09 09 09 7b mn;.....do.....{
0160: 0d 0a 09 09 09 09 44 57 4f 52 44 20 6d 6f 64 20 ......DWORD mod
0170: 3d 20 76 61 6c 20 25 20 33 36 3b 0d 0a 09 09 09 = val % 36;.....
0180: 09 76 61 6c 20 2f 3d 20 33 36 3b 0d 0a 09 09 09 .val /= 36;.....
0190: 09 63 61 73 68 4b 65 79 20 2b 3d 20 6d 6f 64 20 .cashKey += mod
01a0: 3c 20 31 30 20 3f 20 27 30 27 20 2b 20 6d 6f 64 < 10 ? '0' + mod
01b0: 20 3a 20 27 41 27 20 2b 20 6d 6f 64 20 2d 20 31 : 'A' + mod - 1
01c0: 30 3b 0d 0a 09 09 09 7d 77 68 69 6c 65 28 76 61 0;.....}while(va
01d0: 6c 29 3b 0d 0a 09 09 09 73 77 69 74 63 68 28 70 l);.....switch(p
01e0: 74 72 2d 3e 6f 70 29 0d 0a 09 09 09 7b 0d 0a 09 tr->op).....{...
01f0: 09 09 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e ..case SQLITE_IN
0200: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 DEX_CONSTRAINT_E
0210: 51 3a 0d 0a 09 09 09 09 63 61 73 68 4b 65 79 20 Q:......cashKey
0220: 2b 3d 20 27 3d 27 3b 0d 0a 09 09 09 09 62 72 65 += '=';......bre
0230: 61 6b 3b 0d 0a 09 09 09 63 61 73 65 20 53 51 4c ak;.....case SQL
0240: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 ITE_INDEX_CONSTR
0250: 41 49 4e 54 5f 47 54 3a 0d 0a 09 09 09 09 63 61 AINT_GT:......ca
0260: 73 68 4b 65 79 20 2b 3d 20 27 3e 27 3b 0d 0a 09 shKey += '>';...
0270: 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 63 61 ...break;.....ca
0280: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f se SQLITE_INDEX_
0290: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 3a 0d 0a CONSTRAINT_LE:..
02a0: 09 09 09 09 63 61 73 68 4b 65 79 20 2b 3d 20 22 ....cashKey += "
02b0: 3c 3d 22 3b 0d 0a 09 09 09 09 62 72 65 61 6b 3b <=";......break;
02c0: 0d 0a 09 09 09 63 61 73 65 20 53 51 4c 49 54 45 .....case SQLITE
02d0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e _INDEX_CONSTRAIN
02e0: 54 5f 4c 54 3a 0d 0a 09 09 09 09 63 61 73 68 4b T_LT:......cashK
02f0: 65 79 20 2b 3d 20 27 3c 27 3b 0d 0a 09 09 09 09 ey += '<';......
0300: 62 72 65 61 6b 3b 0d 0a 09 09 09 63 61 73 65 20 break;.....case
0310: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
0320: 53 54 52 41 49 4e 54 5f 47 45 3a 0d 0a 09 09 09 STRAINT_GE:.....
0330: 09 63 61 73 68 4b 65 79 20 2b 3d 20 22 3e 3d 22 .cashKey += ">="
0340: 3b 0d 0a 09 09 09 09 62 72 65 61 6b 3b 0d 0a 09 ;......break;...
0350: 09 09 7d 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 63 ..}....}...}...c
0360: 61 73 68 4b 65 79 20 2b 3d 20 27 3b 27 3b 0d 0a ashKey += ';';..
0370: 09 6f 72 64 65 72 62 79 5f 70 74 72 20 70 4f 72 .orderby_ptr pOr
0380: 64 20 3d 20 70 49 64 78 2d 3e 61 4f 72 64 65 72 d = pIdx->aOrder
0390: 42 79 3b 0d 0a 09 66 6f 72 28 63 20 3d 20 70 49 By;...for(c = pI
03a0: 64 78 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 63 2d dx->nOrderBy; c-
03b0: 2d 3b 20 70 4f 72 64 2b 2b 29 0d 0a 09 7b 0d 0a -; pOrd++)...{..
03c0: 09 09 44 57 4f 52 44 20 76 61 6c 20 3d 20 70 4f ..DWORD val = pO
03d0: 72 64 2d 3e 69 43 6f 6c 75 6d 6e 3b 0d 0a 09 09 rd->iColumn;....
03e0: 64 6f 0d 0a 09 09 7b 0d 0a 09 09 09 44 57 4f 52 do....{.....DWOR
03f0: 44 20 6d 6f 64 20 3d 20 76 61 6c 20 25 20 33 36 D mod = val % 36
0400: 3b 0d 0a 09 09 09 76 61 6c 20 2f 3d 20 33 36 3b ;.....val /= 36;
0410: 0d 0a 09 09 09 63 61 73 68 4b 65 79 20 2b 3d 20 .....cashKey +=
0420: 6d 6f 64 20 3c 20 31 30 20 3f 20 27 30 27 20 2b mod < 10 ? '0' +
0430: 20 6d 6f 64 20 3a 20 27 41 27 20 2b 20 6d 6f 64 mod : 'A' + mod
0440: 20 2d 20 31 30 3b 0d 0a 09 09 7d 77 68 69 6c 65 - 10;....}while
0450: 28 76 61 6c 29 3b 0d 0a 09 09 63 61 73 68 4b 65 (val);....cashKe
0460: 79 20 2b 3d 20 70 4f 72 64 2d 3e 64 65 73 63 20 y += pOrd->desc
0470: 3f 20 27 3c 27 20 3a 20 27 3e 27 3b 0d 0a 09 7d ? '<' : '>';...}
0480: 0d 0a 09 2f 2f 20 d1 f2 f0 ee ea e0 20 ef ee f1 ...// ...... ...
0490: f2 f0 ee e5 ed e0 2e 20 c1 f3 e4 e5 ec 20 e8 f1 ....... ..... ..
04a0: ea e0 f2 fc 20 e2 20 ea fd f8 e5 2e 0d 0a 09 63 .... . ........c
04b0: 61 73 68 5f 65 6e 74 72 79 2a 20 6e 6f 64 65 20 ash_entry* node
04c0: 3d 20 4e 55 4c 4c 3b 0d 0a 09 66 6f 72 28 50 4f = NULL;...for(PO
04d0: 53 49 54 49 4f 4e 20 70 6f 73 20 3d 20 63 61 73 SITION pos = cas
04e0: 68 2e 47 65 74 48 65 61 64 50 6f 73 69 74 69 6f h.GetHeadPositio
04f0: 6e 28 29 3b 20 70 6f 73 20 3b 29 0d 0a 09 7b 0d n(); pos ;)...{.
0500: 0a 09 09 50 4f 53 49 54 49 4f 4e 20 6e 65 78 74 ...POSITION next
0510: 20 3d 20 70 6f 73 3b 0d 0a 09 09 6e 6f 64 65 20 = pos;....node
0520: 3d 20 28 63 61 73 68 5f 65 6e 74 72 79 2a 29 63 = (cash_entry*)c
0530: 61 73 68 2e 47 65 74 4e 65 78 74 28 6e 65 78 74 ash.GetNext(next
0540: 29 3b 0d 0a 09 09 69 66 28 6e 6f 64 65 2d 3e 63 );....if(node->c
0550: 61 73 68 4b 65 79 20 3d 3d 20 63 61 73 68 4b 65 ashKey == cashKe
0560: 79 29 0d 0a 09 09 09 62 72 65 61 6b 3b 0d 0a 09 y).....break;...
0570: 09 70 6f 73 20 3d 20 6e 65 78 74 3b 0d 0a 09 7d .pos = next;...}
0580: 0d 0a 09 0d 0a 09 69 66 28 21 70 6f 73 29 0d 0a ......if(!pos)..
0590: 09 09 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0d ..return FALSE;.
05a0: 0a 0d 0a 09 2f 2f 20 cd e0 f8 eb e8 20 e7 e0 ef ....// ..... ...
05b0: e8 f1 fc 2e 20 c7 e0 ef ee eb ed e8 ec 20 e8 ed .... ........ ..
05c0: f4 f3 2e 0d 0a 09 75 73 61 67 65 5f 70 74 72 20 ......usage_ptr
05d0: 70 55 73 67 20 3d 20 70 49 64 78 2d 3e 61 43 6f pUsg = pIdx->aCo
05e0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0d 0a nstraintUsage;..
05f0: 09 70 74 72 20 3d 20 70 49 64 78 2d 3e 61 43 6f .ptr = pIdx->aCo
0600: 6e 73 74 72 61 69 6e 74 3b 0d 0a 09 63 20 3d 20 nstraint;...c =
0610: 70 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e pIdx->nConstrain
0620: 74 3b 0d 0a 09 66 6f 72 28 44 57 4f 52 44 20 69 t;...for(DWORD i
0630: 20 3d 20 30 2c 20 2a 70 41 72 67 3d 28 44 57 4f = 0, *pArg=(DWO
0640: 52 44 2a 29 6e 6f 64 65 2d 3e 61 72 67 73 2e 47 RD*)node->args.G
0650: 65 74 44 61 74 61 28 29 3b 20 63 2d 2d 3b 20 70 etData(); c--; p
0660: 74 72 2b 2b 2c 20 70 55 73 67 2b 2b 29 0d 0a 09 tr++, pUsg++)...
0670: 7b 0d 0a 09 09 69 66 28 69 73 43 6f 6e 73 74 72 {....if(isConstr
0680: 61 69 6e 74 28 70 74 72 29 29 0d 0a 09 09 7b 0d aint(ptr))....{.
0690: 0a 09 09 09 70 55 73 67 2d 3e 61 72 67 76 49 6e ....pUsg->argvIn
06a0: 64 65 78 20 3d 20 2a 70 41 72 67 2b 2b 3b 0d 0a dex = *pArg++;..
06b0: 09 09 09 70 55 73 67 2d 3e 6f 6d 69 74 20 3d 20 ...pUsg->omit =
06c0: 54 52 55 45 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a TRUE;....}...}..
06d0: 09 70 49 64 78 2d 3e 69 64 78 4e 75 6d 20 3d 20 .pIdx->idxNum =
06e0: 6e 6f 64 65 2d 3e 69 64 78 4e 75 6d 3b 0d 0a 09 node->idxNum;...
06f0: 70 49 64 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e pIdx->orderByCon
0700: 73 75 6d 65 64 20 3d 20 6e 6f 64 65 2d 3e 62 4f sumed = node->bO
0710: 72 64 65 72 42 79 3b 0d 0a 09 69 6e 74 20 73 74 rderBy;...int st
0720: 72 4c 65 6e 20 3d 20 6e 6f 64 65 2d 3e 69 64 78 rLen = node->idx
0730: 53 74 72 2e 47 65 74 4c 65 6e 67 74 68 28 29 20 Str.GetLength()
0740: 2b 20 31 3b 0d 0a 09 70 49 64 78 2d 3e 69 64 78 + 1;...pIdx->idx
0750: 53 74 72 20 3d 20 28 63 68 61 72 2a 29 73 71 6c Str = (char*)sql
0760: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 74 72 4c ite3_malloc(strL
0770: 65 6e 29 3b 0d 0a 09 6d 65 6d 63 70 79 28 70 49 en);...memcpy(pI
0780: 64 78 2d 3e 69 64 78 53 74 72 2c 20 28 4c 50 43 dx->idxStr, (LPC
0790: 53 54 52 29 6e 6f 64 65 2d 3e 69 64 78 53 74 72 STR)node->idxStr
07a0: 2c 20 73 74 72 4c 65 6e 29 3b 0d 0a 09 70 49 64 , strLen);...pId
07b0: 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 x->needToFreeIdx
07c0: 53 74 72 20 3d 20 54 52 55 45 3b 0d 0a 09 70 49 Str = TRUE;...pI
07d0: 64 78 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 dx->estimatedCos
07e0: 74 20 3d 20 6e 6f 64 65 2d 3e 63 6f 73 74 3b 0d t = node->cost;.
07f0: 0a 0d 0a 09 2f 2f 20 c8 20 ef e5 f0 e5 ec e5 f1 ....// . .......
0800: f2 e8 ec 20 e7 e0 ef e8 f1 fc 20 e2 20 ed e0 f7 ... ...... . ...
0810: e0 eb ee 20 f1 ef e8 f1 ea e0 2e 0d 0a 09 63 61 ... ..........ca
0820: 73 68 2e 52 65 6d 6f 76 65 41 74 28 70 6f 73 29 sh.RemoveAt(pos)
0830: 3b 0d 0a 09 63 61 73 68 2e 41 64 64 48 65 61 64 ;...cash.AddHead
0840: 28 6e 6f 64 65 29 3b 0d 0a 09 72 65 74 75 72 6e (node);...return
0850: 20 54 52 55 45 3b 0d 0a 7d 0d 0a 0d 0a 76 6f 69 TRUE;..}....voi
0860: 64 20 53 74 72 61 74 65 67 79 43 61 73 68 3a 3a d StrategyCash::
0870: 61 64 64 54 6f 43 61 73 68 28 63 6f 6e 73 74 20 addToCash(const
0880: 43 53 74 72 69 6e 67 26 20 63 61 73 68 4b 65 79 CString& cashKey
0890: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f , sqlite3_index_
08a0: 69 6e 66 6f 2a 20 70 49 64 78 29 0d 0a 7b 0d 0a info* pIdx)..{..
08b0: 09 63 61 73 68 5f 65 6e 74 72 79 2a 20 6e 6f 64 .cash_entry* nod
08c0: 65 20 3d 20 6e 65 77 20 63 61 73 68 5f 65 6e 74 e = new cash_ent
08d0: 72 79 3b 0d 0a 09 6e 6f 64 65 2d 3e 63 61 73 68 ry;...node->cash
08e0: 4b 65 79 20 3d 20 63 61 73 68 4b 65 79 3b 0d 0a Key = cashKey;..
08f0: 09 6e 6f 64 65 2d 3e 69 64 78 4e 75 6d 20 3d 20 .node->idxNum =
0900: 70 49 64 78 2d 3e 69 64 78 4e 75 6d 3b 0d 0a 09 pIdx->idxNum;...
0910: 6e 6f 64 65 2d 3e 69 64 78 53 74 72 20 3d 20 70 node->idxStr = p
0920: 49 64 78 2d 3e 69 64 78 53 74 72 3b 0d 0a 09 6e Idx->idxStr;...n
0930: 6f 64 65 2d 3e 63 6f 73 74 20 3d 20 70 49 64 78 ode->cost = pIdx
0940: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b ->estimatedCost;
0950: 0d 0a 09 6e 6f 64 65 2d 3e 62 4f 72 64 65 72 42 ...node->bOrderB
0960: 79 20 3d 20 70 49 64 78 2d 3e 6f 72 64 65 72 42 y = pIdx->orderB
0970: 79 43 6f 6e 73 75 6d 65 64 3b 0d 0a 09 09 0d 0a yConsumed;......
0980: 0d 0a 09 63 6f 6e 73 74 72 61 69 6e 74 5f 70 74 ...constraint_pt
0990: 72 20 70 74 72 20 3d 20 70 49 64 78 2d 3e 61 43 r ptr = pIdx->aC
09a0: 6f 6e 73 74 72 61 69 6e 74 3b 0d 0a 09 75 73 61 onstraint;...usa
09b0: 67 65 5f 70 74 72 20 70 55 73 67 20 3d 20 70 49 ge_ptr pUsg = pI
09c0: 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 dx->aConstraintU
09d0: 73 61 67 65 3b 0d 0a 09 66 6f 72 28 44 57 4f 52 sage;...for(DWOR
09e0: 44 20 63 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6e D c = pIdx->nCon
09f0: 73 74 72 61 69 6e 74 3b 20 63 2d 2d 3b 20 70 74 straint; c--; pt
0a00: 72 2b 2b 2c 20 70 55 73 67 2b 2b 29 0d 0a 09 7b r++, pUsg++)...{
0a10: 0d 0a 09 09 69 66 28 69 73 43 6f 6e 73 74 72 61 ....if(isConstra
0a20: 69 6e 74 28 70 74 72 29 29 0d 0a 09 09 09 6e 6f int(ptr)).....no
0a30: 64 65 2d 3e 61 72 67 73 2e 41 64 64 28 70 55 73 de->args.Add(pUs
0a40: 67 2d 3e 61 72 67 76 49 6e 64 65 78 29 3b 0d 0a g->argvIndex);..
0a50: 09 7d 0d 0a 09 63 61 73 68 2e 41 64 64 48 65 61 .}...cash.AddHea
0a60: 64 28 6e 6f 64 65 29 3b 0d 0a 09 69 66 28 63 61 d(node);...if(ca
0a70: 73 68 2e 47 65 74 43 6f 75 6e 74 28 29 20 3e 20 sh.GetCount() >
0a80: 33 32 29 0d 0a 09 7b 0d 0a 09 09 64 65 6c 65 74 32)...{....delet
0a90: 65 20 28 63 61 73 68 5f 65 6e 74 72 79 2a 29 63 e (cash_entry*)c
0aa0: 61 73 68 2e 47 65 74 54 61 69 6c 28 29 3b 0d 0a ash.GetTail();..
0ab0: 09 09 63 61 73 68 2e 52 65 6d 6f 76 65 41 74 28 ..cash.RemoveAt(
0ac0: 63 61 73 68 2e 47 65 74 54 61 69 6c 50 6f 73 69 cash.GetTailPosi
0ad0: 74 69 6f 6e 28 29 29 3b 0d 0a 09 7d 0d 0a 7d 0d tion());...}..}.
0ae0: 0a 0d 0a 53 74 72 61 74 65 67 79 43 61 73 68 3a ...StrategyCash:
0af0: 3a 7e 53 74 72 61 74 65 67 79 43 61 73 68 28 29 :~StrategyCash()
0b00: 0d 0a 7b 0d 0a 09 66 6f 72 28 50 4f 53 49 54 49 ..{...for(POSITI
0b10: 4f 4e 20 70 6f 73 20 3d 20 63 61 73 68 2e 47 65 ON pos = cash.Ge
0b20: 74 48 65 61 64 50 6f 73 69 74 69 6f 6e 28 29 3b tHeadPosition();
0b30: 20 70 6f 73 3b 29 0d 0a 09 09 64 65 6c 65 74 65 pos;)....delete
0b40: 20 28 63 61 73 68 5f 65 6e 74 72 79 2a 29 63 61 (cash_entry*)ca
0b50: 73 68 2e 47 65 74 4e 65 78 74 28 70 6f 73 29 3b sh.GetNext(pos);
0b60: 0d 0a 7d 0d 0a ..}..