summaryrefslogtreecommitdiffstats
path: root/ext/lsm1/lsm-test/lsmtest_datasource.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/lsm1/lsm-test/lsmtest_datasource.c')
-rw-r--r--ext/lsm1/lsm-test/lsmtest_datasource.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/ext/lsm1/lsm-test/lsmtest_datasource.c b/ext/lsm1/lsm-test/lsmtest_datasource.c
new file mode 100644
index 0000000..0b0fd94
--- /dev/null
+++ b/ext/lsm1/lsm-test/lsmtest_datasource.c
@@ -0,0 +1,96 @@
+
+
+#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;
+};