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

View File

@ -10,8 +10,7 @@ IN: forestdb.lib
/* /*
! Issues ! Issues
! 4) byseq iteration doesn't have bodies, weird. ! Get byseq ignores seqnum and uses key instead if key is set
! 5) Get byseq ignores seqnum and uses key instead if key is set
*/ */
ERROR: fdb-error error ; ERROR: fdb-error error ;
@ -19,6 +18,7 @@ ERROR: fdb-error error ;
: fdb-check-error ( ret -- ) : fdb-check-error ( ret -- )
dup FDB_RESULT_SUCCESS = [ drop ] [ fdb-error ] if ; dup FDB_RESULT_SUCCESS = [ drop ] [ fdb-error ] if ;
TUPLE: fdb-kvs-handle < disposable handle ; TUPLE: fdb-kvs-handle < disposable handle ;
: <fdb-kvs-handle> ( handle -- obj ) : <fdb-kvs-handle> ( handle -- obj )
fdb-kvs-handle new-disposable fdb-kvs-handle new-disposable
@ -36,35 +36,10 @@ TUPLE: fdb-file-handle < disposable handle ;
M: fdb-file-handle dispose* M: fdb-file-handle dispose*
handle>> fdb_close fdb-check-error ; handle>> fdb_close fdb-check-error ;
SYMBOL: current-fdb-file-handle SYMBOL: current-fdb-file-handle
SYMBOL: current-fdb-kvs-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 ) : get-file-handle ( -- handle )
current-fdb-file-handle get handle>> ; current-fdb-file-handle get handle>> ;
@ -174,16 +149,6 @@ SYMBOL: current-fdb-kvs-handle
: fdb-compact-commit ( new-path -- ) : fdb-compact-commit ( new-path -- )
fdb-compact fdb-commit-wal-flush ; 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 ! Call from within with-foresdb
: fdb-open-snapshot ( seqnum -- handle ) : fdb-open-snapshot ( seqnum -- handle )
@ -328,6 +293,33 @@ T{ doc
PRIVATE> 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 -- ) -- ) : with-fdb-map ( start-key end-key fdb_iterator_opt_t iterator-init iterator-next quot: ( obj -- ) -- )
[ execute ] 2dip [ execute ] 2dip
swap swap
@ -351,6 +343,27 @@ PRIVATE>
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb_iterator_next ] dip [ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb_iterator_next ] dip
with-fdb-map ; inline 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 ! 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 ! 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 ! Therefore, only clean up fdb-current once, and clean it up at the end
@ -398,3 +411,4 @@ PRIVATE>
: with-forestdb-path ( path quot -- ) : 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-handles-commit-wal ; inline
! [ absolute-path fdb-open-default-config ] dip with-forestdb-handle-commit-normal ; 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. ! Copyright (C) 2014 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license. ! 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 ; io.files.temp kernel math.parser math.ranges sequences ;
IN: forestdb.utils IN: forestdb.utils
: test-db-0 ( -- path ) "0.forestdb.0" temp-file ; : test-db-0 ( -- path ) "0.forestdb.0" temp-file ;
: test-db-1 ( -- path ) "1.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-0 ( -- ) [ test-db-0 delete-file ] ignore-errors ;
: delete-test-db-1 ( -- ) [ test-db-1 delete-file ] ignore-errors ; : delete-test-db-1 ( -- ) [ test-db-1 delete-file ] ignore-errors ;