1
2
3 #include "lsmtest.h"
4
5 struct Datasource {
6 int eType;
7
8 int nMinKey;
9 int nMaxKey;
10 int nMinVal;
11 int nMaxVal;
12
13 char *aKey;
14 char *aVal;
15 };
16
testDatasourceEntry(Datasource * p,int iData,void ** ppKey,int * pnKey,void ** ppVal,int * pnVal)17 void testDatasourceEntry(
18 Datasource *p,
19 int iData,
20 void **ppKey, int *pnKey,
21 void **ppVal, int *pnVal
22 ){
23 assert( (ppKey==0)==(pnKey==0) );
24 assert( (ppVal==0)==(pnVal==0) );
25
26 if( ppKey ){
27 int nKey = 0;
28 switch( p->eType ){
29 case TEST_DATASOURCE_RANDOM: {
30 int nRange = (1 + p->nMaxKey - p->nMinKey);
31 nKey = (int)( testPrngValue((u32)iData) % nRange ) + p->nMinKey;
32 testPrngString((u32)iData, p->aKey, nKey);
33 break;
34 }
35 case TEST_DATASOURCE_SEQUENCE:
36 nKey = sprintf(p->aKey, "%012d", iData);
37 break;
38 }
39 *ppKey = p->aKey;
40 *pnKey = nKey;
41 }
42 if( ppVal ){
43 u32 nVal = testPrngValue((u32)iData)%(1+p->nMaxVal-p->nMinVal)+p->nMinVal;
44 testPrngString((u32)~iData, p->aVal, (int)nVal);
45 *ppVal = p->aVal;
46 *pnVal = (int)nVal;
47 }
48 }
49
testDatasourceFree(Datasource * p)50 void testDatasourceFree(Datasource *p){
51 testFree(p);
52 }
53
54 /*
55 ** Return a pointer to a nul-terminated string that corresponds to the
56 ** contents of the datasource-definition passed as the first argument.
57 ** The caller should eventually free the returned pointer using testFree().
58 */
testDatasourceName(const DatasourceDefn * p)59 char *testDatasourceName(const DatasourceDefn *p){
60 char *zRet;
61 zRet = testMallocPrintf("%s.(%d-%d).(%d-%d)",
62 (p->eType==TEST_DATASOURCE_SEQUENCE ? "seq" : "rnd"),
63 p->nMinKey, p->nMaxKey,
64 p->nMinVal, p->nMaxVal
65 );
66 return zRet;
67 }
68
testDatasourceNew(const DatasourceDefn * pDefn)69 Datasource *testDatasourceNew(const DatasourceDefn *pDefn){
70 Datasource *p;
71 int nMinKey;
72 int nMaxKey;
73 int nMinVal;
74 int nMaxVal;
75
76 if( pDefn->eType==TEST_DATASOURCE_SEQUENCE ){
77 nMinKey = 128;
78 nMaxKey = 128;
79 }else{
80 nMinKey = MAX(0, pDefn->nMinKey);
81 nMaxKey = MAX(nMinKey, pDefn->nMaxKey);
82 }
83 nMinVal = MAX(0, pDefn->nMinVal);
84 nMaxVal = MAX(nMinVal, pDefn->nMaxVal);
85
86 p = (Datasource *)testMalloc(sizeof(Datasource) + nMaxKey + nMaxVal + 1);
87 p->eType = pDefn->eType;
88 p->nMinKey = nMinKey;
89 p->nMinVal = nMinVal;
90 p->nMaxKey = nMaxKey;
91 p->nMaxVal = nMaxVal;
92
93 p->aKey = (char *)&p[1];
94 p->aVal = &p->aKey[nMaxKey];
95 return p;
96 };
97