/ Hex Artifact Content
Login

Artifact 5d770be191d0ca51315926723009b2c25c0b4b8136840494ef710ac324aa916c:


0000: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6c 73 6d 74  ..#include "lsmt
0010: 65 73 74 2e 68 22 0a 0a 73 74 72 75 63 74 20 44  est.h"..struct D
0020: 61 74 61 73 6f 75 72 63 65 20 7b 0a 20 20 69 6e  atasource {.  in
0030: 74 20 65 54 79 70 65 3b 0a 0a 20 20 69 6e 74 20  t eType;..  int 
0040: 6e 4d 69 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  nMinKey;.  int n
0050: 4d 61 78 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4d  MaxKey;.  int nM
0060: 69 6e 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 4d 61  inVal;.  int nMa
0070: 78 56 61 6c 3b 0a 0a 20 20 63 68 61 72 20 2a 61  xVal;..  char *a
0080: 4b 65 79 3b 0a 20 20 63 68 61 72 20 2a 61 56 61  Key;.  char *aVa
0090: 6c 3b 0a 7d 3b 0a 0a 76 6f 69 64 20 74 65 73 74  l;.};..void test
00a0: 44 61 74 61 73 6f 75 72 63 65 45 6e 74 72 79 28  DatasourceEntry(
00b0: 0a 20 20 44 61 74 61 73 6f 75 72 63 65 20 2a 70  .  Datasource *p
00c0: 2c 20 0a 20 20 69 6e 74 20 69 44 61 74 61 2c 20  , .  int iData, 
00d0: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c  .  void **ppKey,
00e0: 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a 20 20 76   int *pnKey,.  v
00f0: 6f 69 64 20 2a 2a 70 70 56 61 6c 2c 20 69 6e 74  oid **ppVal, int
0100: 20 2a 70 6e 56 61 6c 0a 29 7b 0a 20 20 61 73 73   *pnVal.){.  ass
0110: 65 72 74 28 20 28 70 70 4b 65 79 3d 3d 30 29 3d  ert( (ppKey==0)=
0120: 3d 28 70 6e 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  =(pnKey==0) );. 
0130: 20 61 73 73 65 72 74 28 20 28 70 70 56 61 6c 3d   assert( (ppVal=
0140: 3d 30 29 3d 3d 28 70 6e 56 61 6c 3d 3d 30 29 20  =0)==(pnVal==0) 
0150: 29 3b 0a 0a 20 20 69 66 28 20 70 70 4b 65 79 20  );..  if( ppKey 
0160: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 20  ){.    int nKey 
0170: 3d 20 30 3b 0a 20 20 20 20 73 77 69 74 63 68 28  = 0;.    switch(
0180: 20 70 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20   p->eType ){.   
0190: 20 20 20 63 61 73 65 20 54 45 53 54 5f 44 41 54     case TEST_DAT
01a0: 41 53 4f 55 52 43 45 5f 52 41 4e 44 4f 4d 3a 20  ASOURCE_RANDOM: 
01b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52  {.        int nR
01c0: 61 6e 67 65 20 3d 20 28 31 20 2b 20 70 2d 3e 6e  ange = (1 + p->n
01d0: 4d 61 78 4b 65 79 20 2d 20 70 2d 3e 6e 4d 69 6e  MaxKey - p->nMin
01e0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 6e 4b  Key);.        nK
01f0: 65 79 20 3d 20 28 69 6e 74 29 28 20 74 65 73 74  ey = (int)( test
0200: 50 72 6e 67 56 61 6c 75 65 28 28 75 33 32 29 69  PrngValue((u32)i
0210: 44 61 74 61 29 20 25 20 6e 52 61 6e 67 65 20 29  Data) % nRange )
0220: 20 2b 20 70 2d 3e 6e 4d 69 6e 4b 65 79 3b 20 0a   + p->nMinKey; .
0230: 20 20 20 20 20 20 20 20 74 65 73 74 50 72 6e 67          testPrng
0240: 53 74 72 69 6e 67 28 28 75 33 32 29 69 44 61 74  String((u32)iDat
0250: 61 2c 20 70 2d 3e 61 4b 65 79 2c 20 6e 4b 65 79  a, p->aKey, nKey
0260: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
0270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0280: 63 61 73 65 20 54 45 53 54 5f 44 41 54 41 53 4f  case TEST_DATASO
0290: 55 52 43 45 5f 53 45 51 55 45 4e 43 45 3a 0a 20  URCE_SEQUENCE:. 
02a0: 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 73 70         nKey = sp
02b0: 72 69 6e 74 66 28 70 2d 3e 61 4b 65 79 2c 20 22  rintf(p->aKey, "
02c0: 25 30 31 32 64 22 2c 20 69 44 61 74 61 29 3b 0a  %012d", iData);.
02d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
02e0: 20 20 20 7d 0a 20 20 20 20 2a 70 70 4b 65 79 20     }.    *ppKey 
02f0: 3d 20 70 2d 3e 61 4b 65 79 3b 0a 20 20 20 20 2a  = p->aKey;.    *
0300: 70 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20  pnKey = nKey;.  
0310: 7d 0a 20 20 69 66 28 20 70 70 56 61 6c 20 29 7b  }.  if( ppVal ){
0320: 0a 20 20 20 20 75 33 32 20 6e 56 61 6c 20 3d 20  .    u32 nVal = 
0330: 74 65 73 74 50 72 6e 67 56 61 6c 75 65 28 28 75  testPrngValue((u
0340: 33 32 29 69 44 61 74 61 29 25 28 31 2b 70 2d 3e  32)iData)%(1+p->
0350: 6e 4d 61 78 56 61 6c 2d 70 2d 3e 6e 4d 69 6e 56  nMaxVal-p->nMinV
0360: 61 6c 29 2b 70 2d 3e 6e 4d 69 6e 56 61 6c 3b 0a  al)+p->nMinVal;.
0370: 20 20 20 20 74 65 73 74 50 72 6e 67 53 74 72 69      testPrngStri
0380: 6e 67 28 28 75 33 32 29 7e 69 44 61 74 61 2c 20  ng((u32)~iData, 
0390: 70 2d 3e 61 56 61 6c 2c 20 28 69 6e 74 29 6e 56  p->aVal, (int)nV
03a0: 61 6c 29 3b 0a 20 20 20 20 2a 70 70 56 61 6c 20  al);.    *ppVal 
03b0: 3d 20 70 2d 3e 61 56 61 6c 3b 0a 20 20 20 20 2a  = p->aVal;.    *
03c0: 70 6e 56 61 6c 20 3d 20 28 69 6e 74 29 6e 56 61  pnVal = (int)nVa
03d0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 74  l;.  }.}..void t
03e0: 65 73 74 44 61 74 61 73 6f 75 72 63 65 46 72 65  estDatasourceFre
03f0: 65 28 44 61 74 61 73 6f 75 72 63 65 20 2a 70 29  e(Datasource *p)
0400: 7b 0a 20 20 74 65 73 74 46 72 65 65 28 70 29 3b  {.  testFree(p);
0410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0420: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0430: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
0440: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 72 72 65  tring that corre
0450: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 0a 2a 2a  sponds to the.**
0460: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
0470: 20 64 61 74 61 73 6f 75 72 63 65 2d 64 65 66 69   datasource-defi
0480: 6e 69 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nition passed as
0490: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
04a0: 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ent..** The call
04b0: 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
04c0: 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72 65  ally free the re
04d0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 75  turned pointer u
04e0: 73 69 6e 67 20 74 65 73 74 46 72 65 65 28 29 2e  sing testFree().
04f0: 0a 2a 2f 0a 63 68 61 72 20 2a 74 65 73 74 44 61  .*/.char *testDa
0500: 74 61 73 6f 75 72 63 65 4e 61 6d 65 28 63 6f 6e  tasourceName(con
0510: 73 74 20 44 61 74 61 73 6f 75 72 63 65 44 65 66  st DatasourceDef
0520: 6e 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  n *p){.  char *z
0530: 52 65 74 3b 0a 20 20 7a 52 65 74 20 3d 20 74 65  Ret;.  zRet = te
0540: 73 74 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 22  stMallocPrintf("
0550: 25 73 2e 28 25 64 2d 25 64 29 2e 28 25 64 2d 25  %s.(%d-%d).(%d-%
0560: 64 29 22 2c 0a 20 20 20 20 20 20 28 70 2d 3e 65  d)",.      (p->e
0570: 54 79 70 65 3d 3d 54 45 53 54 5f 44 41 54 41 53  Type==TEST_DATAS
0580: 4f 55 52 43 45 5f 53 45 51 55 45 4e 43 45 20 3f  OURCE_SEQUENCE ?
0590: 20 22 73 65 71 22 20 3a 20 22 72 6e 64 22 29 2c   "seq" : "rnd"),
05a0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 69 6e 4b 65  .      p->nMinKe
05b0: 79 2c 20 70 2d 3e 6e 4d 61 78 4b 65 79 2c 0a 20  y, p->nMaxKey,. 
05c0: 20 20 20 20 20 70 2d 3e 6e 4d 69 6e 56 61 6c 2c       p->nMinVal,
05d0: 20 70 2d 3e 6e 4d 61 78 56 61 6c 0a 20 20 29 3b   p->nMaxVal.  );
05e0: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
05f0: 7d 0a 0a 44 61 74 61 73 6f 75 72 63 65 20 2a 74  }..Datasource *t
0600: 65 73 74 44 61 74 61 73 6f 75 72 63 65 4e 65 77  estDatasourceNew
0610: 28 63 6f 6e 73 74 20 44 61 74 61 73 6f 75 72 63  (const Datasourc
0620: 65 44 65 66 6e 20 2a 70 44 65 66 6e 29 7b 0a 20  eDefn *pDefn){. 
0630: 20 44 61 74 61 73 6f 75 72 63 65 20 2a 70 3b 0a   Datasource *p;.
0640: 20 20 69 6e 74 20 6e 4d 69 6e 4b 65 79 3b 20 0a    int nMinKey; .
0650: 20 20 69 6e 74 20 6e 4d 61 78 4b 65 79 3b 0a 20    int nMaxKey;. 
0660: 20 69 6e 74 20 6e 4d 69 6e 56 61 6c 3b 0a 20 20   int nMinVal;.  
0670: 69 6e 74 20 6e 4d 61 78 56 61 6c 3b 20 0a 0a 20  int nMaxVal; .. 
0680: 20 69 66 28 20 70 44 65 66 6e 2d 3e 65 54 79 70   if( pDefn->eTyp
0690: 65 3d 3d 54 45 53 54 5f 44 41 54 41 53 4f 55 52  e==TEST_DATASOUR
06a0: 43 45 5f 53 45 51 55 45 4e 43 45 20 29 7b 0a 20  CE_SEQUENCE ){. 
06b0: 20 20 20 6e 4d 69 6e 4b 65 79 20 3d 20 31 32 38     nMinKey = 128
06c0: 3b 0a 20 20 20 20 6e 4d 61 78 4b 65 79 20 3d 20  ;.    nMaxKey = 
06d0: 31 32 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  128;.  }else{.  
06e0: 20 20 6e 4d 69 6e 4b 65 79 20 3d 20 4d 41 58 28    nMinKey = MAX(
06f0: 30 2c 20 70 44 65 66 6e 2d 3e 6e 4d 69 6e 4b 65  0, pDefn->nMinKe
0700: 79 29 3b 0a 20 20 20 20 6e 4d 61 78 4b 65 79 20  y);.    nMaxKey 
0710: 3d 20 4d 41 58 28 6e 4d 69 6e 4b 65 79 2c 20 70  = MAX(nMinKey, p
0720: 44 65 66 6e 2d 3e 6e 4d 61 78 4b 65 79 29 3b 0a  Defn->nMaxKey);.
0730: 20 20 7d 0a 20 20 6e 4d 69 6e 56 61 6c 20 3d 20    }.  nMinVal = 
0740: 4d 41 58 28 30 2c 20 70 44 65 66 6e 2d 3e 6e 4d  MAX(0, pDefn->nM
0750: 69 6e 56 61 6c 29 3b 0a 20 20 6e 4d 61 78 56 61  inVal);.  nMaxVa
0760: 6c 20 3d 20 4d 41 58 28 6e 4d 69 6e 56 61 6c 2c  l = MAX(nMinVal,
0770: 20 70 44 65 66 6e 2d 3e 6e 4d 61 78 56 61 6c 29   pDefn->nMaxVal)
0780: 3b 0a 0a 20 20 70 20 3d 20 28 44 61 74 61 73 6f  ;..  p = (Dataso
0790: 75 72 63 65 20 2a 29 74 65 73 74 4d 61 6c 6c 6f  urce *)testMallo
07a0: 63 28 73 69 7a 65 6f 66 28 44 61 74 61 73 6f 75  c(sizeof(Datasou
07b0: 72 63 65 29 20 2b 20 6e 4d 61 78 4b 65 79 20 2b  rce) + nMaxKey +
07c0: 20 6e 4d 61 78 56 61 6c 20 2b 20 31 29 3b 0a 20   nMaxVal + 1);. 
07d0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 44 65 66   p->eType = pDef
07e0: 6e 2d 3e 65 54 79 70 65 3b 0a 20 20 70 2d 3e 6e  n->eType;.  p->n
07f0: 4d 69 6e 4b 65 79 20 3d 20 6e 4d 69 6e 4b 65 79  MinKey = nMinKey
0800: 3b 0a 20 20 70 2d 3e 6e 4d 69 6e 56 61 6c 20 3d  ;.  p->nMinVal =
0810: 20 6e 4d 69 6e 56 61 6c 3b 0a 20 20 70 2d 3e 6e   nMinVal;.  p->n
0820: 4d 61 78 4b 65 79 20 3d 20 6e 4d 61 78 4b 65 79  MaxKey = nMaxKey
0830: 3b 0a 20 20 70 2d 3e 6e 4d 61 78 56 61 6c 20 3d  ;.  p->nMaxVal =
0840: 20 6e 4d 61 78 56 61 6c 3b 0a 20 20 0a 20 20 70   nMaxVal;.  .  p
0850: 2d 3e 61 4b 65 79 20 3d 20 28 63 68 61 72 20 2a  ->aKey = (char *
0860: 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 61 56 61  )&p[1];.  p->aVa
0870: 6c 20 3d 20 26 70 2d 3e 61 4b 65 79 5b 6e 4d 61  l = &p->aKey[nMa
0880: 78 4b 65 79 5d 3b 0a 20 20 72 65 74 75 72 6e 20  xKey];.  return 
0890: 70 3b 0a 7d 3b 0a                                p;.};.