modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/lsm1/lsm-test/lsmtest7.c (about) 1 2 3 #include "lsmtest.h" 4 5 6 /* 7 ** Test that the rules for when lsm_csr_next() and lsm_csr_prev() are 8 ** enforced. Specifically: 9 ** 10 ** * Both functions always return LSM_MISUSE if the cursor is at EOF 11 ** when they are called. 12 ** 13 ** * lsm_csr_next() may only be used after lsm_csr_seek(LSM_SEEK_GE) or 14 ** lsm_csr_first(). 15 ** 16 ** * lsm_csr_prev() may only be used after lsm_csr_seek(LSM_SEEK_LE) or 17 ** lsm_csr_last(). 18 */ 19 static void do_test_api1_lsm(lsm_db *pDb, int *pRc){ 20 int ret; 21 lsm_cursor *pCsr; 22 lsm_cursor *pCsr2; 23 int nKey; 24 const void *pKey; 25 26 ret = lsm_csr_open(pDb, &pCsr); 27 testCompareInt(LSM_OK, ret, pRc); 28 29 ret = lsm_csr_next(pCsr); 30 testCompareInt(LSM_MISUSE, ret, pRc); 31 ret = lsm_csr_prev(pCsr); 32 testCompareInt(LSM_MISUSE, ret, pRc); 33 34 ret = lsm_csr_seek(pCsr, "jjj", 3, LSM_SEEK_GE); 35 testCompareInt(LSM_OK, ret, pRc); 36 ret = lsm_csr_next(pCsr); 37 testCompareInt(LSM_OK, ret, pRc); 38 ret = lsm_csr_prev(pCsr); 39 testCompareInt(LSM_MISUSE, ret, pRc); 40 41 ret = lsm_csr_seek(pCsr, "jjj", 3, LSM_SEEK_LE); 42 testCompareInt(LSM_OK, ret, pRc); 43 ret = lsm_csr_next(pCsr); 44 testCompareInt(LSM_MISUSE, ret, pRc); 45 ret = lsm_csr_prev(pCsr); 46 testCompareInt(LSM_OK, ret, pRc); 47 48 ret = lsm_csr_seek(pCsr, "jjj", 3, LSM_SEEK_LEFAST); 49 testCompareInt(LSM_OK, ret, pRc); 50 ret = lsm_csr_next(pCsr); 51 testCompareInt(LSM_MISUSE, ret, pRc); 52 ret = lsm_csr_prev(pCsr); 53 testCompareInt(LSM_MISUSE, ret, pRc); 54 55 ret = lsm_csr_key(pCsr, &pKey, &nKey); 56 testCompareInt(LSM_OK, ret, pRc); 57 58 ret = lsm_csr_open(pDb, &pCsr2); 59 testCompareInt(LSM_OK, ret, pRc); 60 61 ret = lsm_csr_seek(pCsr2, pKey, nKey, LSM_SEEK_EQ); 62 testCompareInt(LSM_OK, ret, pRc); 63 testCompareInt(1, lsm_csr_valid(pCsr2), pRc); 64 ret = lsm_csr_next(pCsr2); 65 testCompareInt(LSM_MISUSE, ret, pRc); 66 ret = lsm_csr_prev(pCsr2); 67 testCompareInt(LSM_MISUSE, ret, pRc); 68 69 lsm_csr_close(pCsr2); 70 71 ret = lsm_csr_first(pCsr); 72 testCompareInt(LSM_OK, ret, pRc); 73 ret = lsm_csr_next(pCsr); 74 testCompareInt(LSM_OK, ret, pRc); 75 ret = lsm_csr_prev(pCsr); 76 testCompareInt(LSM_MISUSE, ret, pRc); 77 78 ret = lsm_csr_last(pCsr); 79 testCompareInt(LSM_OK, ret, pRc); 80 ret = lsm_csr_prev(pCsr); 81 testCompareInt(LSM_OK, ret, pRc); 82 ret = lsm_csr_next(pCsr); 83 testCompareInt(LSM_MISUSE, ret, pRc); 84 85 ret = lsm_csr_first(pCsr); 86 while( lsm_csr_valid(pCsr) ){ 87 ret = lsm_csr_next(pCsr); 88 testCompareInt(LSM_OK, ret, pRc); 89 } 90 ret = lsm_csr_next(pCsr); 91 testCompareInt(LSM_OK, ret, pRc); 92 ret = lsm_csr_prev(pCsr); 93 testCompareInt(LSM_MISUSE, ret, pRc); 94 95 ret = lsm_csr_last(pCsr); 96 while( lsm_csr_valid(pCsr) ){ 97 ret = lsm_csr_prev(pCsr); 98 testCompareInt(LSM_OK, ret, pRc); 99 } 100 ret = lsm_csr_prev(pCsr); 101 testCompareInt(LSM_OK, ret, pRc); 102 ret = lsm_csr_next(pCsr); 103 testCompareInt(LSM_MISUSE, ret, pRc); 104 105 lsm_csr_close(pCsr); 106 } 107 108 static void do_test_api1(const char *zPattern, int *pRc){ 109 if( testCaseBegin(pRc, zPattern, "api1.lsm") ){ 110 const DatasourceDefn defn = { TEST_DATASOURCE_RANDOM, 10, 15, 200, 250 }; 111 Datasource *pData; 112 TestDb *pDb; 113 int rc = 0; 114 115 pDb = testOpen("lsm_lomem", 1, &rc); 116 pData = testDatasourceNew(&defn); 117 testWriteDatasourceRange(pDb, pData, 0, 1000, pRc); 118 119 do_test_api1_lsm(tdb_lsm(pDb), pRc); 120 121 testDatasourceFree(pData); 122 testClose(&pDb); 123 124 testCaseFinish(*pRc); 125 } 126 } 127 128 static lsm_db *newLsmConnection( 129 const char *zDb, 130 int nPgsz, 131 int nBlksz, 132 int *pRc 133 ){ 134 lsm_db *db = 0; 135 if( *pRc==0 ){ 136 int n1 = nPgsz; 137 int n2 = nBlksz; 138 *pRc = lsm_new(tdb_lsm_env(), &db); 139 if( *pRc==0 ){ 140 if( n1 ) lsm_config(db, LSM_CONFIG_PAGE_SIZE, &n1); 141 if( n2 ) lsm_config(db, LSM_CONFIG_BLOCK_SIZE, &n2); 142 *pRc = lsm_open(db, "testdb.lsm"); 143 } 144 } 145 return db; 146 } 147 148 static void testPagesize(lsm_db *db, int nPgsz, int nBlksz, int *pRc){ 149 if( *pRc==0 ){ 150 int n1 = 0; 151 int n2 = 0; 152 153 lsm_config(db, LSM_CONFIG_PAGE_SIZE, &n1); 154 lsm_config(db, LSM_CONFIG_BLOCK_SIZE, &n2); 155 156 testCompareInt(n1, nPgsz, pRc); 157 testCompareInt(n2, nBlksz, pRc); 158 } 159 } 160 161 /* 162 ** Test case "api2" tests that the default page and block sizes of a 163 ** database may only be modified before lsm_open() is called. And that 164 ** after lsm_open() is called lsm_config() may be used to read the 165 ** actual page and block size of the db. 166 */ 167 static void do_test_api2(const char *zPattern, int *pRc){ 168 if( *pRc==0 && testCaseBegin(pRc, zPattern, "api2.lsm") ){ 169 lsm_db *db1 = 0; 170 lsm_db *db2 = 0; 171 172 testDeleteLsmdb("testdb.lsm"); 173 db1 = newLsmConnection("testdb.lsm", 0, 0, pRc); 174 testPagesize(db1, 4096, 1024, pRc); 175 db2 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); 176 testPagesize(db2, 4096, 1024, pRc); 177 lsm_close(db1); 178 lsm_close(db2); 179 180 testDeleteLsmdb("testdb.lsm"); 181 db1 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); 182 testPagesize(db1, 1024, 64*1024, pRc); 183 db2 = newLsmConnection("testdb.lsm", 0, 0, pRc); 184 testPagesize(db2, 1024, 64*1024, pRc); 185 lsm_close(db1); 186 lsm_close(db2); 187 188 testDeleteLsmdb("testdb.lsm"); 189 db1 = newLsmConnection("testdb.lsm", 8192, 2*1024, pRc); 190 testPagesize(db1, 8192, 2*1024, pRc); 191 db2 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); 192 testPagesize(db2, 8192, 2*1024, pRc); 193 lsm_close(db1); 194 lsm_close(db2); 195 196 testCaseFinish(*pRc); 197 } 198 } 199 200 void test_api( 201 const char *zPattern, /* Run test cases that match this pattern */ 202 int *pRc /* IN/OUT: Error code */ 203 ){ 204 do_test_api1(zPattern, pRc); 205 do_test_api2(zPattern, pRc); 206 }