6 #ifdef HAVE_KYOTOCABINET
11 kyotocabinet::TreeDB
* db
;
16 int test_kc_open(const char *zFilename
, int bClear
, TestDb
**ppDb
){
22 char *zCmd
= sqlite3_mprintf("rm -rf %s\n", zFilename
);
27 pKcDb
= (KcDb
*)malloc(sizeof(KcDb
));
28 memset(pKcDb
, 0, sizeof(KcDb
));
31 pKcDb
->db
= new kyotocabinet::TreeDB();
32 pKcDb
->db
->tune_page(TESTDB_DEFAULT_PAGE_SIZE
);
33 pKcDb
->db
->tune_page_cache(
34 TESTDB_DEFAULT_PAGE_SIZE
* TESTDB_DEFAULT_CACHE_SIZE
36 ok
= pKcDb
->db
->open(zFilename
,
37 kyotocabinet::PolyDB::OWRITER
| kyotocabinet::PolyDB::OCREATE
45 *ppDb
= (TestDb
*)pKcDb
;
49 int test_kc_close(TestDb
*pDb
){
50 KcDb
*pKcDb
= (KcDb
*)pDb
;
52 delete [] pKcDb
->pVal
;
60 int test_kc_write(TestDb
*pDb
, void *pKey
, int nKey
, void *pVal
, int nVal
){
61 KcDb
*pKcDb
= (KcDb
*)pDb
;
64 ok
= pKcDb
->db
->set((const char *)pKey
, nKey
, (const char *)pVal
, nVal
);
68 int test_kc_delete(TestDb
*pDb
, void *pKey
, int nKey
){
69 KcDb
*pKcDb
= (KcDb
*)pDb
;
72 ok
= pKcDb
->db
->remove((const char *)pKey
, nKey
);
76 int test_kc_delete_range(
78 void *pKey1
, int nKey1
,
79 void *pKey2
, int nKey2
82 KcDb
*pKcDb
= (KcDb
*)pDb
;
83 kyotocabinet::DB::Cursor
* pCur
= pKcDb
->db
->cursor();
86 res
= pCur
->jump((const char *)pKey1
, nKey1
);
92 const char *pKey
; size_t nKey
;
93 const char *pVal
; size_t nVal
;
95 pKey
= pCur
->get(&nKey
, &pVal
, &nVal
);
100 res
= memcmp(pKey
, pKey1
, MIN((size_t)nKey1
, nKey
));
101 assert( res
>0 || (res
==0 && nKey
>nKey1
) );
106 res
= memcmp(pKey
, pKey2
, MIN((size_t)nKey2
, nKey
));
107 if( res
>0 || (res
==0 && (size_t)nKey2
<nKey
) ){
127 KcDb
*pKcDb
= (KcDb
*)pDb
;
131 delete [] pKcDb
->pVal
;
135 pKcDb
->pVal
= pKcDb
->db
->get((const char *)pKey
, nKey
, &nVal
);
137 *ppVal
= pKcDb
->pVal
;
148 TestDb
*pDb
, /* Database handle */
149 void *pCtx
, /* Context pointer to pass to xCallback */
150 int bReverse
, /* True for a reverse order scan */
151 void *pKey1
, int nKey1
, /* Start of search */
152 void *pKey2
, int nKey2
, /* End of search */
153 void (*xCallback
)(void *pCtx
, void *pKey
, int nKey
, void *pVal
, int nVal
)
155 KcDb
*pKcDb
= (KcDb
*)pDb
;
156 kyotocabinet::DB::Cursor
* pCur
= pKcDb
->db
->cursor();
161 res
= pCur
->jump((const char *)pKey1
, nKey1
);
167 res
= pCur
->jump_back((const char *)pKey2
, nKey2
);
169 res
= pCur
->jump_back();
174 const char *pKey
; size_t nKey
;
175 const char *pVal
; size_t nVal
;
176 pKey
= pCur
->get(&nKey
, &pVal
, &nVal
);
178 if( bReverse
==0 && pKey2
){
179 res
= memcmp(pKey
, pKey2
, MIN((size_t)nKey2
, nKey
));
180 if( res
>0 || (res
==0 && (size_t)nKey2
<nKey
) ){
184 }else if( bReverse
!=0 && pKey1
){
185 res
= memcmp(pKey
, pKey1
, MIN((size_t)nKey1
, nKey
));
186 if( res
<0 || (res
==0 && (size_t)nKey1
>nKey
) ){
192 xCallback(pCtx
, (void *)pKey
, (int)nKey
, (void *)pVal
, (int)nVal
);
196 res
= pCur
->step_back();
205 #endif /* HAVE_KYOTOCABINET */
220 const char *zFilename
,
229 char *zCmd
= sqlite3_mprintf("rm -rf %s\n", zFilename
);
234 pMdb
= (MdbDb
*)malloc(sizeof(MdbDb
));
235 memset(pMdb
, 0, sizeof(MdbDb
));
237 rc
= mdb_env_create(&pMdb
->env
);
238 if( rc
==0 ) rc
= mdb_env_set_mapsize(pMdb
->env
, 1*1024*1024*1024);
239 if( rc
==0 ) rc
= mdb_env_open(pMdb
->env
, zFilename
, MDB_NOSYNC
|MDB_NOSUBDIR
, 0600);
240 if( rc
==0 ) rc
= mdb_txn_begin(pMdb
->env
, NULL
, 0, &txn
);
242 rc
= mdb_open(txn
, NULL
, 0, &pMdb
->dbi
);
246 *ppDb
= (TestDb
*)pMdb
;
250 int test_mdb_close(TestDb
*pDb
){
251 MdbDb
*pMdb
= (MdbDb
*)pDb
;
253 mdb_close(pMdb
->env
, pMdb
->dbi
);
254 mdb_env_close(pMdb
->env
);
259 int test_mdb_write(TestDb
*pDb
, void *pKey
, int nKey
, void *pVal
, int nVal
){
261 MdbDb
*pMdb
= (MdbDb
*)pDb
;
271 rc
= mdb_txn_begin(pMdb
->env
, NULL
, 0, &txn
);
273 rc
= mdb_put(txn
, pMdb
->dbi
, &key
, &val
, 0);
275 rc
= mdb_txn_commit(txn
);
284 int test_mdb_delete(TestDb
*pDb
, void *pKey
, int nKey
){
286 MdbDb
*pMdb
= (MdbDb
*)pDb
;
292 rc
= mdb_txn_begin(pMdb
->env
, NULL
, 0, &txn
);
294 rc
= mdb_del(txn
, pMdb
->dbi
, &key
, 0);
296 rc
= mdb_txn_commit(txn
);
313 MdbDb
*pMdb
= (MdbDb
*)pDb
;
320 rc
= mdb_txn_begin(pMdb
->env
, NULL
, MDB_RDONLY
, &txn
);
322 MDB_val val
= {0, 0};
323 rc
= mdb_get(txn
, pMdb
->dbi
, &key
, &val
);
324 if( rc
==MDB_NOTFOUND
){
329 *ppVal
= val
.mv_data
;
330 *pnVal
= val
.mv_size
;
339 TestDb
*pDb
, /* Database handle */
340 void *pCtx
, /* Context pointer to pass to xCallback */
341 int bReverse
, /* True for a reverse order scan */
342 void *pKey1
, int nKey1
, /* Start of search */
343 void *pKey2
, int nKey2
, /* End of search */
344 void (*xCallback
)(void *pCtx
, void *pKey
, int nKey
, void *pVal
, int nVal
)
346 MdbDb
*pMdb
= (MdbDb
*)pDb
;
348 MDB_cursor_op op
= bReverse
? MDB_PREV
: MDB_NEXT
;
351 rc
= mdb_txn_begin(pMdb
->env
, NULL
, MDB_RDONLY
, &txn
);
354 MDB_val key
= {0, 0};
355 MDB_val val
= {0, 0};
357 rc
= mdb_cursor_open(txn
, pMdb
->dbi
, &csr
);
359 while( mdb_cursor_get(csr
, &key
, &val
, op
)==0 ){
360 xCallback(pCtx
, key
.mv_data
, key
.mv_size
, val
.mv_data
, val
.mv_size
);
362 mdb_cursor_close(csr
);
369 #endif /* HAVE_MDB */