forestdb: Embrace the forestdb handle vs kvs handle idiom. Update tests.

db4
Doug Coleman 2015-02-10 14:21:21 -08:00
parent 5e48dfb1e6
commit 91ba68cafe
4 changed files with 103 additions and 72 deletions

View File

@ -232,7 +232,7 @@ FUNCTION: fdb_status fdb_end_transaction ( fdb_file_handle* fhandle, fdb_commit_
FUNCTION: fdb_status fdb_abort_transaction ( fdb_file_handle* fhandle ) ;
FUNCTION: fdb_status fdb_kvs_open ( fdb_file_handle* fhandle,
fdb_kvs_handle** ptr_handle,
char* kvs_name,
c-string kvs_name,
fdb_kvs_config* config ) ;
@ -242,5 +242,5 @@ FUNCTION: fdb_status fdb_kvs_open_default ( fdb_file_handle* fhandle,
FUNCTION: fdb_status fdb_kvs_close ( fdb_kvs_handle* handle ) ;
FUNCTION: fdb_status fdb_kvs_remove ( fdb_file_handle* fhandle, char* kvs_name ) ;
FUNCTION: fdb_status fdb_kvs_remove ( fdb_file_handle* fhandle, c-string kvs_name ) ;
FUNCTION: char* fdb_error_msg ( fdb_status err_code ) ;

View File

@ -6,7 +6,7 @@ combinators.short-circuit constructors continuations destructors
forestdb.ffi forestdb.utils fry generalizations io.directories
io.encodings.string io.encodings.utf8 io.files.temp io.pathnames
kernel layouts libc make math math.parser math.ranges multiline
namespaces sequences system tools.test ;
namespaces sequences system tools.test nested-comments ;
IN: forestdb.lib
{ [ cell-bits 32 = ] [ os windows? ] } 0&& [
@ -18,17 +18,21 @@ IN: forestdb.lib
{ "val123" } [
delete-test-db-0
test-db-0 [
"key123" "val123" fdb-set-kv
"key123" fdb-get-kv
] with-forestdb-path
"test123" [
"key123" "val123" fdb-set-kv
"key123" fdb-get-kv
] with-kvs
] with-forestdb
] unit-test
{ "val12345" } [
delete-test-db-0
test-db-0 [
"key123" "val12345" fdb-set-kv
"key123" fdb-get-kv
] with-forestdb-path
"test123" [
"key123" "val12345" fdb-set-kv
"key123" fdb-get-kv
] with-kvs
] with-forestdb
] unit-test
! Get
@ -42,9 +46,10 @@ IN: forestdb.lib
"key1" "meta" "val" [
fdb_doc>doc [ key>> ] [ body>> ] bi 2array
] with-create-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
{
{ "key1" f "val1" }
} [
@ -55,7 +60,7 @@ IN: forestdb.lib
fdb-get
fdb_doc>doc [ key>> ] [ meta>> ] [ body>> ] tri 3array
] with-create-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
@ -69,7 +74,7 @@ IN: forestdb.lib
fdb-get-byseq fdb_doc>doc
[ key>> ] [ meta>> ] [ body>> ] tri 3array
] with-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
{
@ -82,16 +87,15 @@ IN: forestdb.lib
fdb-get-byseq fdb_doc>doc
[ key>> ] [ meta>> ] [ body>> ] tri 3array
] with-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Filename is only valid inside with-forestdb
{ f } [
delete-test-db-0
test-db-0 [
fdb-get-info filename>> alien>native-string empty?
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Test fdb_doc_create
@ -101,7 +105,7 @@ IN: forestdb.lib
"key123" "meta blah" "some body" [
[ keylen>> ] [ metalen>> ] [ bodylen>> ] tri
] with-create-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
{ 7 8 15 } [
@ -111,7 +115,7 @@ IN: forestdb.lib
[ "new meta" "some other body" fdb-doc-update ]
[ [ keylen>> ] [ metalen>> ] [ bodylen>> ] tri ] bi
] with-create-doc
] with-forestdb-path
] with-forestdb-tester
] unit-test
{ 1 1 } [
@ -120,7 +124,7 @@ IN: forestdb.lib
1 set-kv-n
fdb-commit-normal
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi
] with-forestdb-path
] with-forestdb-tester
] unit-test
{ 6 5 } [
@ -130,7 +134,7 @@ IN: forestdb.lib
5 set-kv-nth
fdb-commit-normal
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi
] with-forestdb-path
] with-forestdb-tester
] unit-test
{ 5 5 } [
@ -139,10 +143,12 @@ IN: forestdb.lib
5 set-kv-n
fdb-commit-normal
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Snapshots
/*
{ 5 5 } [
delete-test-db-1
test-db-1 [
@ -151,8 +157,10 @@ IN: forestdb.lib
FDB_SNAPSHOT_INMEM [
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi
] with-forestdb-snapshot
] with-forestdb-path
] with-forestdb-tester
] unit-test
*/
/*
! Snapshots can only occur on commits. If you commit five keys at once,
@ -167,11 +175,10 @@ IN: forestdb.lib
FDB_SNAPSHOT_INMEM [
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi
] with-forestdb-snapshot
] with-forestdb-path
] with-forestdb-tester
] [
T{ fdb-error { error FDB_RESULT_NO_DB_INSTANCE } } =
] must-fail-with
*/
! Test that we take two snapshots and their seqnums/doc counts are right.
! XXX: Buggy, want to see the first snapshot's document count at 5 too
@ -194,9 +201,10 @@ IN: forestdb.lib
FDB_SNAPSHOT_INMEM [
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi 2array
] with-forestdb-snapshot
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Same test as above, but with buggy behavior for now so it passes
{
7
@ -217,10 +225,12 @@ IN: forestdb.lib
FDB_SNAPSHOT_INMEM [
fdb-get-kvs-info last_seqnum>>
] with-forestdb-snapshot
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Rollback test
! Make sure the doc_count is correct after a rollback
{
@ -244,9 +254,11 @@ IN: forestdb.lib
FDB_SNAPSHOT_INMEM [
fdb-get-kvs-info [ last_seqnum>> ] [ doc_count>> ] bi 2array
] with-forestdb-snapshot
] with-forestdb-path
] with-forestdb-tester
] unit-test
*/
! Iterators test
! No matching keys
@ -262,7 +274,7 @@ IN: forestdb.lib
fdb_doc>doc [ seqnum>> ] [ key>> ] [ body>> ] tri 3array ,
] with-fdb-normal-iterator
] { } make
] with-forestdb-path
] with-forestdb-tester
] unit-test
! All the keys
@ -284,7 +296,7 @@ IN: forestdb.lib
fdb_doc>doc [ seqnum>> ] [ key>> ] [ body>> ] tri 3array ,
] with-fdb-normal-iterator
] { } make
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Test that keys at extremes get returned
@ -302,7 +314,7 @@ IN: forestdb.lib
fdb_doc>doc [ seqnum>> ] [ key>> ] [ body>> ] tri 3array ,
] with-fdb-normal-iterator
] { } make
] with-forestdb-path
] with-forestdb-tester
] unit-test
{
@ -319,7 +331,7 @@ IN: forestdb.lib
fdb_doc>doc [ seqnum>> ] [ key>> ] [ body>> ] tri 3array ,
] with-fdb-normal-iterator
] { } make
] with-forestdb-path
] with-forestdb-tester
] unit-test
@ -335,7 +347,7 @@ IN: forestdb.lib
fdb_doc>doc
] with-fdb-byseq-map
[ seqnum>> ] map
] with-forestdb-path
] with-forestdb-tester
] unit-test
! Deleting 5 keys gives you 5 new seqnums that are those docs, but deleted
@ -351,7 +363,7 @@ IN: forestdb.lib
fdb_doc>doc
] with-fdb-byseq-map
[ [ seqnum>> ] [ deleted?>> ] bi 2array ] map
] with-forestdb-path
] with-forestdb-tester
] unit-test
{
@ -373,7 +385,7 @@ IN: forestdb.lib
[ [ key>> ] [ keylen>> ] bi alien/length>string ] bi 2array ,
] with-fdb-byseq-each
] { } make
] with-forestdb-path
] with-forestdb-tester
] unit-test
] unless

View File

@ -10,8 +10,7 @@ IN: forestdb.lib
/*
! Issues
! 4) byseq iteration doesn't have bodies, weird.
! 5) Get byseq ignores seqnum and uses key instead if key is set
! Get byseq ignores seqnum and uses key instead if key is set
*/
ERROR: fdb-error error ;
@ -19,6 +18,7 @@ ERROR: fdb-error error ;
: fdb-check-error ( ret -- )
dup FDB_RESULT_SUCCESS = [ drop ] [ fdb-error ] if ;
TUPLE: fdb-kvs-handle < disposable handle ;
: <fdb-kvs-handle> ( handle -- obj )
fdb-kvs-handle new-disposable
@ -36,35 +36,10 @@ TUPLE: fdb-file-handle < disposable handle ;
M: fdb-file-handle dispose*
handle>> fdb_close fdb-check-error ;
SYMBOL: current-fdb-file-handle
SYMBOL: current-fdb-kvs-handle
: get-kvs-default-config ( -- kvs-config )
S{ fdb_kvs_config
{ create_if_missing t }
{ custom_cmp f }
} clone ;
: fdb-open-kvs' ( file-handle fdb-kvs-handle kvs-config -- file-handle handle )
[ dup handle>> ] 2dip
[ handle>> ] dip
[ fdb_kvs_open_default fdb-check-error ] 2keep drop
void* deref <fdb-kvs-handle> ;
: fdb-open-kvs ( fdb-file-handle kvs-config -- file-handle handle )
[ f void* <ref> <fdb-kvs-handle> ] dip fdb-open-kvs' ;
: fdb-open ( path config kvs-config -- file-handle handle )
[
[ f void* <ref> ] 2dip
[ absolute-path ensure-fdb-filename-directory ] dip
[ fdb_open fdb-check-error ] 3keep
2drop void* deref <fdb-file-handle>
] dip fdb-open-kvs ;
: fdb-open-default-config ( path -- file-handle handle )
fdb_get_default_config get-kvs-default-config fdb-open ;
: get-file-handle ( -- handle )
current-fdb-file-handle get handle>> ;
@ -174,16 +149,6 @@ SYMBOL: current-fdb-kvs-handle
: fdb-compact-commit ( new-path -- )
fdb-compact fdb-commit-wal-flush ;
: fdb-swap-current-db ( new-path -- )
current-fdb-kvs-handle [ dispose f ] change
fdb-open-default-config
[ current-fdb-file-handle set ]
[ current-fdb-kvs-handle set ] bi* ;
: fdb-compact-and-swap-db ( path -- )
next-vnode-version-name
[ fdb-compact fdb-commit-wal-flush ]
[ fdb-swap-current-db ] bi ;
! Call from within with-foresdb
: fdb-open-snapshot ( seqnum -- handle )
@ -328,6 +293,33 @@ T{ doc
PRIVATE>
: get-kvs-default-config ( -- kvs-config )
S{ fdb_kvs_config
{ create_if_missing t }
{ custom_cmp f }
} clone ;
: fdb-open ( path config -- file-handle )
[ f void* <ref> ] 2dip
[ absolute-path ensure-fdb-filename-directory ] dip
[ fdb_open fdb-check-error ] 3keep
2drop void* deref <fdb-file-handle> ;
: fdb-open-default-config ( path -- file-handle )
fdb_get_default_config fdb-open ;
: fdb-kvs-open-config ( name config -- kvs-handle )
[
current-fdb-file-handle get handle>>
f void* <ref>
] 2dip
[ fdb_kvs_open fdb-check-error ] 3keep 2drop
void* deref <fdb-kvs-handle> ;
: fdb-kvs-open ( name -- kvs-handle )
get-kvs-default-config fdb-kvs-open-config ;
: with-fdb-map ( start-key end-key fdb_iterator_opt_t iterator-init iterator-next quot: ( obj -- ) -- )
[ execute ] 2dip
swap
@ -351,6 +343,27 @@ PRIVATE>
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb_iterator_next ] dip
with-fdb-map ; inline
: with-kvs ( name quot -- )
[
[ fdb-kvs-open &dispose current-fdb-kvs-handle ] dip with-variable
] with-destructors ; inline
: with-default-kvs ( quot -- )
[ "default" ] dip with-kvs ; inline
: with-forestdb ( path quot -- )
[
[ fdb-open-default-config &dispose current-fdb-file-handle ] dip with-variable
] with-destructors ; inline
: with-forestdb-kvs ( path name quot -- )
'[
_ _ with-kvs
] with-forestdb ; inline
/*
! Do not try to commit here, as it will fail with FDB_RESULT_RONLY_VIOLATION
! fdb-current is weird, it gets replaced if you call fdb-rollback
! Therefore, only clean up fdb-current once, and clean it up at the end
@ -398,3 +411,4 @@ PRIVATE>
: with-forestdb-path ( path quot -- )
[ absolute-path fdb-open-default-config ] dip with-forestdb-handles-commit-wal ; inline
! [ absolute-path fdb-open-default-config ] dip with-forestdb-handle-commit-normal ; inline
*/

View File

@ -1,12 +1,17 @@
! Copyright (C) 2014 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs continuations forestdb.lib io.directories
USING: assocs continuations forestdb.lib fry io.directories
io.files.temp kernel math.parser math.ranges sequences ;
IN: forestdb.utils
: test-db-0 ( -- path ) "0.forestdb.0" temp-file ;
: test-db-1 ( -- path ) "1.forestdb.0" temp-file ;
: with-forestdb-tester ( path quot -- )
'[
"default" _ with-kvs
] with-forestdb ; inline
: delete-test-db-0 ( -- ) [ test-db-0 delete-file ] ignore-errors ;
: delete-test-db-1 ( -- ) [ test-db-1 delete-file ] ignore-errors ;