#include "lsmtest.h" struct Datasource { int eType; int nMinKey; int nMaxKey; int nMinVal; int nMaxVal; char *aKey; char *aVal; }; void testDatasourceEntry( Datasource *p, int iData, void **ppKey, int *pnKey, void **ppVal, int *pnVal ){ assert( (ppKey==0)==(pnKey==0) ); assert( (ppVal==0)==(pnVal==0) ); if( ppKey ){ int nKey = 0; switch( p->eType ){ case TEST_DATASOURCE_RANDOM: { int nRange = (1 + p->nMaxKey - p->nMinKey); nKey = (int)( testPrngValue((u32)iData) % nRange ) + p->nMinKey; testPrngString((u32)iData, p->aKey, nKey); break; } case TEST_DATASOURCE_SEQUENCE: nKey = sprintf(p->aKey, "%012d", iData); break; } *ppKey = p->aKey; *pnKey = nKey; } if( ppVal ){ u32 nVal = testPrngValue((u32)iData)%(1+p->nMaxVal-p->nMinVal)+p->nMinVal; testPrngString((u32)~iData, p->aVal, (int)nVal); *ppVal = p->aVal; *pnVal = (int)nVal; } } void testDatasourceFree(Datasource *p){ testFree(p); } /* ** Return a pointer to a nul-terminated string that corresponds to the ** contents of the datasource-definition passed as the first argument. ** The caller should eventually free the returned pointer using testFree(). */ char *testDatasourceName(const DatasourceDefn *p){ char *zRet; zRet = testMallocPrintf("%s.(%d-%d).(%d-%d)", (p->eType==TEST_DATASOURCE_SEQUENCE ? "seq" : "rnd"), p->nMinKey, p->nMaxKey, p->nMinVal, p->nMaxVal ); return zRet; } Datasource *testDatasourceNew(const DatasourceDefn *pDefn){ Datasource *p; int nMinKey; int nMaxKey; int nMinVal; int nMaxVal; if( pDefn->eType==TEST_DATASOURCE_SEQUENCE ){ nMinKey = 128; nMaxKey = 128; }else{ nMinKey = MAX(0, pDefn->nMinKey); nMaxKey = MAX(nMinKey, pDefn->nMaxKey); } nMinVal = MAX(0, pDefn->nMinVal); nMaxVal = MAX(nMinVal, pDefn->nMaxVal); p = (Datasource *)testMalloc(sizeof(Datasource) + nMaxKey + nMaxVal + 1); p->eType = pDefn->eType; p->nMinKey = nMinKey; p->nMinVal = nMinVal; p->nMaxKey = nMaxKey; p->nMaxVal = nMaxVal; p->aKey = (char *)&p[1]; p->aVal = &p->aKey[nMaxKey]; return p; };