modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/lsm1/lsm-test/lsmtest_datasource.c (about) 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 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 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 */ 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 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 };