Hex Artifact Content Вы: nobody
Вход

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                                   ..}..