forestdb: Update for recent changes.

db4
Doug Coleman 2014-12-11 14:42:19 -08:00
parent 1f3dc639db
commit 1f16d1933b
3 changed files with 118 additions and 123 deletions

View File

@ -11,12 +11,15 @@ IN: forestdb.ffi
LIBRARY: forestdb
! Begin fdb_types.h
CONSTANT: FDB_MAX_KEYLEN 3840
CONSTANT: FDB_MAX_METALEN 65535
CONSTANT: FDB_MAX_BODYLEN 4294967295
CONSTANT: FDB_SNAPSHOT_INMEM -1
TYPEDEF: uint64_t fdb_seqnum_t
TYPEDEF: int64_t cs_off_t
TYPEDEF: void* fdb_custom_cmp_fixed
TYPEDEF: void* fdb_custom_cmp_variable
@ -25,6 +28,10 @@ TYPEDEF: void* fdb_file_handle
TYPEDEF: void* fdb_kvs_handle
TYPEDEF: void* fdb_iterator
ENUM: fdb_open_flags
{ FDB_OPEN_FLAG_CREATE 1 }
{ FDB_OPEN_FLAG_RDONLY 2 } ;
ENUM: fdb_commit_opt_t
{ FDB_COMMIT_NORMAL 0 }
{ FDB_COMMIT_MANUAL_WAL_FLUSH 1 } ;
@ -33,10 +40,6 @@ ENUM: fdb_seqtree_opt_t
{ FDB_SEQTREE_NOT_USE 0 }
{ FDB_SEQTREE_USE 1 } ;
ENUM: fdb_open_flags
{ FDB_OPEN_FLAG_CREATE 1 }
{ FDB_OPEN_FLAG_RDONLY 2 } ;
ENUM: fdb_durability_opt_t
{ FDB_DRB_NONE 0 }
{ FDB_DRB_ODIRECT 1 }
@ -47,55 +50,22 @@ ENUM: fdb_compaction_mode_t
{ FDB_COMPACTION_MANUAL 0 }
{ FDB_COMPACTION_AUTO 1 } ;
ENUM: fdb_iterator_opt_t
{ FDB_ITR_NONE 0 }
{ FDB_ITR_METAONLY 1 }
{ FDB_ITR_NO_DELETES 2 } ;
ENUM: fdb_isolation_level_t
{ FDB_ISOLATION_SERIALIZABLE 0 }
{ FDB_ISOLATION_REPEATABLE_READ 1 }
{ FDB_ISOLATION_READ_COMMITTED 2 }
{ FDB_ISOLATION_READ_UNCOMMITTED 3 } ;
ENUM: fdb_status
{ FDB_RESULT_SUCCESS 0 }
{ FDB_RESULT_INVALID_ARGS -1 }
{ FDB_RESULT_OPEN_FAIL -2 }
{ FDB_RESULT_NO_SUCH_FILE -3 }
{ FDB_RESULT_WRITE_FAIL -4 }
{ FDB_RESULT_READ_FAIL -5 }
{ FDB_RESULT_CLOSE_FAIL -6 }
{ FDB_RESULT_COMMIT_FAIL -7 }
{ FDB_RESULT_ALLOC_FAIL -8 }
{ FDB_RESULT_KEY_NOT_FOUND -9 }
{ FDB_RESULT_RONLY_VIOLATION -10 }
{ FDB_RESULT_COMPACTION_FAIL -11 }
{ FDB_RESULT_ITERATOR_FAIL -12 }
{ FDB_RESULT_SEEK_FAIL -13 }
{ FDB_RESULT_FSYNC_FAIL -14 }
{ FDB_RESULT_CHECKSUM_ERROR -15 }
{ FDB_RESULT_FILE_CORRUPTION -16 }
{ FDB_RESULT_COMPRESSION_FAIL -17 }
{ FDB_RESULT_NO_DB_INSTANCE -18 }
{ FDB_RESULT_FAIL_BY_ROLLBACK -19 }
{ FDB_RESULT_INVALID_CONFIG -20 }
{ FDB_RESULT_MANUAL_COMPACTION_FAIL -21 }
{ FDB_RESULT_INVALID_COMPACTION_MODE -22 }
{ FDB_RESULT_FILE_IS_BUSY -23 }
{ FDB_RESULT_FILE_REMOVE_FAIL -24 }
{ FDB_RESULT_FILE_RENAME_FAIL -25 }
{ FDB_RESULT_TRANSACTION_FAIL -26 }
{ FDB_RESULT_FAIL_BY_TRANSACTION -27 }
{ FDB_RESULT_FAIL_BY_COMPACTION -28 }
{ FDB_RESULT_TOO_LONG_FILENAME -29 }
{ FDB_RESULT_INVALID_HANDLE -30 }
{ FDB_RESULT_KV_STORE_NOT_FOUND -31 }
{ FDB_RESULT_KV_STORE_BUSY -32 }
{ FDB_RESULT_INVALID_KV_INSTANCE_NAME -33 }
{ FDB_RESULT_INVALID_CMP_FUNCTION -34 }
{ FDB_RESULT_IN_USE_BY_COMPACTOR -35 }
{ FDB_RESULT_FAIL -100 } ;
ENUM: fdb_iterator_opt_t
{ FDB_ITR_NONE 0 }
{ FDB_ITR_NO_DELETES 2 }
{ FDB_ITR_SKIP_MIN_KEY 4 }
{ FDB_ITR_SKIP_MAX_KEY 8 } ;
ENUM: fdb_iterator_seek_opt_t
{ FDB_ITR_SEEK_HIGHER 0 }
{ FDB_ITR_SEEK_LOWER 1 } ;
! cmp_fixed and cmp_variable have their own open() functions
STRUCT: fdb_config
@ -115,7 +85,8 @@ STRUCT: fdb_config
{ compaction_threshold uint8_t }
{ compaction_minimum_filesize uint64_t }
{ compactor_sleep_duration uint64_t }
{ multi_kv_instances bool } ;
{ multi_kv_instances bool }
{ prefetch_duration uint64_t } ;
STRUCT: fdb_kvs_config
{ create_if_missing bool }
@ -154,6 +125,50 @@ STRUCT: fdb_kvs_name_list
{ num_kvs_names size_t }
{ kvs_names char** } ;
! end fdb_types.h
! Begin fdb_errors.h
ENUM: fdb_status
{ FDB_RESULT_SUCCESS 0 }
{ FDB_RESULT_INVALID_ARGS -1 }
{ FDB_RESULT_OPEN_FAIL -2 }
{ FDB_RESULT_NO_SUCH_FILE -3 }
{ FDB_RESULT_WRITE_FAIL -4 }
{ FDB_RESULT_READ_FAIL -5 }
{ FDB_RESULT_CLOSE_FAIL -6 }
{ FDB_RESULT_COMMIT_FAIL -7 }
{ FDB_RESULT_ALLOC_FAIL -8 }
{ FDB_RESULT_KEY_NOT_FOUND -9 }
{ FDB_RESULT_RONLY_VIOLATION -10 }
{ FDB_RESULT_COMPACTION_FAIL -11 }
{ FDB_RESULT_ITERATOR_FAIL -12 }
{ FDB_RESULT_SEEK_FAIL -13 }
{ FDB_RESULT_FSYNC_FAIL -14 }
{ FDB_RESULT_CHECKSUM_ERROR -15 }
{ FDB_RESULT_FILE_CORRUPTION -16 }
{ FDB_RESULT_COMPRESSION_FAIL -17 }
{ FDB_RESULT_NO_DB_INSTANCE -18 }
{ FDB_RESULT_FAIL_BY_ROLLBACK -19 }
{ FDB_RESULT_INVALID_CONFIG -20 }
{ FDB_RESULT_MANUAL_COMPACTION_FAIL -21 }
{ FDB_RESULT_INVALID_COMPACTION_MODE -22 }
{ FDB_RESULT_FILE_IS_BUSY -23 }
{ FDB_RESULT_FILE_REMOVE_FAIL -24 }
{ FDB_RESULT_FILE_RENAME_FAIL -25 }
{ FDB_RESULT_TRANSACTION_FAIL -26 }
{ FDB_RESULT_FAIL_BY_TRANSACTION -27 }
{ FDB_RESULT_FAIL_BY_COMPACTION -28 }
{ FDB_RESULT_TOO_LONG_FILENAME -29 }
{ FDB_RESULT_INVALID_HANDLE -30 }
{ FDB_RESULT_KV_STORE_NOT_FOUND -31 }
{ FDB_RESULT_KV_STORE_BUSY -32 }
{ FDB_RESULT_INVALID_KV_INSTANCE_NAME -33 }
{ FDB_RESULT_INVALID_CMP_FUNCTION -34 }
{ FDB_RESULT_IN_USE_BY_COMPACTOR -35 } ;
! End fdb_errors.h
! Begin forestdb.h
FUNCTION: fdb_status fdb_init ( fdb_config* config ) ;
FUNCTION: fdb_config fdb_get_default_config ( ) ;
FUNCTION: fdb_kvs_config fdb_get_default_kvs_config ( ) ;
@ -164,8 +179,8 @@ FUNCTION: fdb_status fdb_open_custom_cmp ( fdb_file_handle** ptr_fhandle, c-stri
FUNCTION: fdb_status fdb_set_log_callback ( fdb_kvs_handle* handle, fdb_log_callback log_callback, void* ctx_data ) ;
! doc is calloc'd
FUNCTION: fdb_status fdb_doc_create ( fdb_doc** doc, c-string key, size_t keylen, c-string meta, size_t metalen, c-string body, size_t bodylen ) ;
FUNCTION: fdb_status fdb_doc_update ( fdb_doc** doc, c-string meta, size_t metalen, c-string body, size_t bodylen ) ;
FUNCTION: fdb_status fdb_doc_create ( fdb_doc** doc, void* key, size_t keylen, void* meta, size_t metalen, void* body, size_t bodylen ) ;
FUNCTION: fdb_status fdb_doc_update ( fdb_doc** doc, void* meta, size_t metalen, void* body, size_t bodylen ) ;
FUNCTION: fdb_status fdb_doc_free ( fdb_doc* doc ) ;
FUNCTION: fdb_status fdb_get ( fdb_kvs_handle* handle, fdb_doc* doc ) ;
@ -177,21 +192,26 @@ FUNCTION: fdb_status fdb_get_byoffset ( fdb_kvs_handle* handle, fdb_doc* doc ) ;
FUNCTION: fdb_status fdb_set ( fdb_kvs_handle* handle, fdb_doc* doc ) ;
FUNCTION: fdb_status fdb_del ( fdb_kvs_handle* handle, fdb_doc* doc ) ;
FUNCTION: fdb_status fdb_get_kv ( fdb_kvs_handle* handle, c-string key, size_t keylen, void** value_out, size_t* valuelen_out ) ;
FUNCTION: fdb_status fdb_set_kv ( fdb_kvs_handle* handle, c-string key, size_t keylen, c-string value, size_t valuelen ) ;
FUNCTION: fdb_status fdb_del_kv ( fdb_kvs_handle* handle, c-string key, size_t keylen ) ;
FUNCTION: fdb_status fdb_get_kv ( fdb_kvs_handle* handle, void* key, size_t keylen, void** value_out, size_t* valuelen_out ) ;
FUNCTION: fdb_status fdb_set_kv ( fdb_kvs_handle* handle, void* key, size_t keylen, void* value, size_t valuelen ) ;
FUNCTION: fdb_status fdb_del_kv ( fdb_kvs_handle* handle, void* key, size_t keylen ) ;
FUNCTION: fdb_status fdb_commit ( fdb_file_handle* fhandle, fdb_commit_opt_t opt ) ;
FUNCTION: fdb_status fdb_snapshot_open ( fdb_kvs_handle* handle_in, fdb_kvs_handle** handle_out, fdb_seqnum_t snapshot_seqnum ) ;
! Swaps out the handle for a new one
FUNCTION: fdb_status fdb_rollback ( fdb_kvs_handle** handle_ptr, fdb_seqnum_t rollback_seqnum ) ;
FUNCTION: fdb_status fdb_iterator_init ( fdb_kvs_handle* handle, fdb_iterator** iterator, c-string start_key, size_t start_keylen, c-string end_key, size_t end_keylen, fdb_iterator_opt_t opt ) ;
FUNCTION: fdb_status fdb_iterator_sequence_init ( fdb_kvs_handle* handle, fdb_iterator** iterator, fdb_seqnum_t start_seq, fdb_seqnum_t end_seq, fdb_iterator_opt_t opt ) ;
FUNCTION: fdb_status fdb_iterator_prev ( fdb_iterator* iterator, fdb_doc** doc ) ;
FUNCTION: fdb_status fdb_iterator_next ( fdb_iterator* iterator, fdb_doc** doc ) ;
FUNCTION: fdb_status fdb_iterator_next_metaonly ( fdb_iterator* iterator, fdb_doc** doc ) ;
FUNCTION: fdb_status fdb_iterator_seek ( fdb_iterator* iterator, c-string seek_key, size_t seek_keylen ) ;
FUNCTION: fdb_status fdb_iterator_init ( fdb_kvs_handle* handle, fdb_iterator** iterator, void* min_key, size_t min_keylen, void* max_key, size_t max_keylen, fdb_iterator_opt_t opt ) ;
FUNCTION: fdb_status fdb_iterator_sequence_init ( fdb_kvs_handle* handle, fdb_iterator** iterator, fdb_seqnum_t min_seq, fdb_seqnum_t max_seq, fdb_iterator_opt_t opt ) ;
FUNCTION: fdb_status fdb_iterator_prev ( fdb_iterator* iterator ) ;
FUNCTION: fdb_status fdb_iterator_next ( fdb_iterator* iterator ) ;
FUNCTION: fdb_status fdb_iterator_get ( fdb_iterator* iterator, fdb_doc **doc ) ;
FUNCTION: fdb_status fdb_iterator_get_metaonly ( fdb_iterator* iterator, fdb_doc **doc ) ;
FUNCTION: fdb_status fdb_iterator_seek ( fdb_iterator* iterator, void* seek_key, size_t seek_keylen, fdb_iterator_seek_opt_t direction ) ;
FUNCTION: fdb_status fdb_iterator_seek_to_min ( fdb_iterator* iterator ) ;
FUNCTION: fdb_status fdb_iterator_seek_to_max ( fdb_iterator* iterator ) ;
FUNCTION: fdb_status fdb_iterator_close ( fdb_iterator* iterator ) ;
FUNCTION: fdb_status fdb_compact ( fdb_file_handle* handle, c-string new_filename ) ;
@ -199,12 +219,12 @@ FUNCTION: size_t fdb_estimate_space_used ( fdb_file_handle* fhandle ) ;
FUNCTION: fdb_status fdb_get_file_info ( fdb_file_handle* handle, fdb_file_info* info ) ;
FUNCTION: fdb_status fdb_get_kvs_info ( fdb_kvs_handle* handle, fdb_kvs_info* info ) ;
FUNCTION: fdb_status fdb_get_kvs_seqnum ( fdb_kvs_handle* handle, fdb_seqnum_t* seqnum ) ;
FUNCTION: fdb_status fdb_get_kvs_name_list ( fdb_kvs_handle* handle, fdb_kvs_name_list* kvs_name_list ) ;
FUNCTION: fdb_status fdb_free_kvs_name_list ( fdb_kvs_name_list* kvs_name_list ) ;
FUNCTION: fdb_status fdb_switch_compaction_mode ( fdb_file_handle* fhandle, fdb_compaction_mode_t mode, size_t new_threshold ) ;
FUNCTION: fdb_status fdb_get_kvs_name_list ( fdb_file_handle *fhandle, fdb_kvs_name_list *kvs_name_list ) ;
FUNCTION: fdb_status fdb_free_kvs_name_list ( fdb_kvs_name_list *kvs_name_list ) ;
FUNCTION: fdb_status fdb_close ( fdb_file_handle* fhandle ) ;
FUNCTION: fdb_status fdb_destroy ( c-string filename, fdb_config* fconfig ) ;
FUNCTION: fdb_status fdb_shutdown ( ) ;

View File

@ -321,28 +321,6 @@ IN: forestdb.lib
] unit-test
{
{
{ 1 "key1" }
{ 2 "key2" }
{ 3 "key3" }
{ 4 "key4" }
{ 5 "key5" }
}
} [
delete-test-db-1
test-db-1 [
5 set-kv-n
fdb-commit-normal
[
0 10 [
[ seqnum>> ]
[ [ key>> ] [ keylen>> ] bi alien/length>string ] bi 2array ,
] with-fdb-byseq-each
] { } make
] with-forestdb-path
] unit-test
! Test byseq mapping
{
V{ 1 2 3 4 5 }

View File

@ -10,9 +10,6 @@ IN: forestdb.lib
/*
! Issues
! 2) build on macosx doesn't search /usr/local for libsnappy
! 3) build on macosx doesn't include -L/usr/local/lib when it finds snappy
! - link_directories(/usr/local/lib) or some other fix
! 4) byseq iteration doesn't have bodies, weird.
! 5) Get byseq ignores seqnum and uses key instead if key is set
*/
@ -80,7 +77,7 @@ SYMBOL: current-fdb-kvs-handle
: fdb-set-kv ( key value -- )
[ get-kvs-handle ] 2dip
[ dup length ] bi@ fdb_set_kv fdb-check-error ;
[ utf8 encode dup length ] bi@ fdb_set_kv fdb-check-error ;
: <key-doc> ( key -- doc )
fdb_doc malloc-struct
@ -116,7 +113,7 @@ SYMBOL: current-fdb-kvs-handle
: fdb-get-kv ( key -- value/f )
[ get-kvs-handle ] dip
dup length f void* <ref> 0 size_t <ref>
utf8 encode dup length f void* <ref> 0 size_t <ref>
[ fdb_get_kv ] 2keep
rot {
{ FDB_RESULT_SUCCESS [ ret>string ] }
@ -125,17 +122,18 @@ SYMBOL: current-fdb-kvs-handle
} case ;
: fdb-del-kv ( key -- )
[ get-kvs-handle ] dip dup length fdb_del_kv fdb-check-error ;
[ get-kvs-handle ] dip
utf8 encode dup length fdb_del_kv fdb-check-error ;
: fdb-doc-create ( key meta body -- doc )
[ f void* <ref> ] 3dip
[ dup length ] tri@
[ utf8 encode dup length ] tri@
[ fdb_doc_create fdb-check-error ] 7 nkeep 6 ndrop
void* deref fdb_doc memory>struct ;
: fdb-doc-update ( doc meta body -- )
[ void* <ref> ] 2dip
[ dup length ] bi@
[ utf8 encode dup length ] bi@
fdb_doc_update fdb-check-error ;
: fdb-doc-free ( doc -- )
@ -216,7 +214,7 @@ M: fdb-iterator dispose*
: fdb-iterator-init ( start-key end-key fdb_iterator_opt_t -- iterator )
[ get-kvs-handle f void* <ref> ] 3dip
[ [ dup length ] bi@ ] dip
[ [ utf8 encode dup length ] bi@ ] dip
[ fdb_iterator_init fdb-check-error ] 7 nkeep 5 ndrop nip
void* deref <fdb-iterator> ;
@ -228,25 +226,16 @@ M: fdb-iterator dispose*
: fdb-iterator-init-none ( start-key end-key -- iterator )
FDB_ITR_NONE fdb-iterator-init ;
: fdb-iterator-meta-only ( start-key end-key -- iterator )
FDB_ITR_METAONLY fdb-iterator-init ;
: fdb-iterator-no-deletes ( start-key end-key -- iterator )
FDB_ITR_NO_DELETES fdb-iterator-init ;
: check-iterate-result ( doc fdb_status -- doc/f )
: check-iterate-result ( fdb_status -- ? )
{
{ FDB_RESULT_SUCCESS [ void* deref fdb_doc memory>struct ] }
{ FDB_RESULT_ITERATOR_FAIL [ drop f ] }
{ FDB_RESULT_SUCCESS [ t ] }
{ FDB_RESULT_ITERATOR_FAIL [ f ] }
[ throw ]
} case ;
: fdb-iterate ( iterator word -- doc )
'[
fdb_doc malloc-struct fdb_doc <ref>
[ _ execute ] keep swap check-iterate-result
] call ; inline
! fdb_doc key, meta, body only valid inside with-forestdb
! so make a helper word to preserve them outside
TUPLE: fdb-doc seqnum keylen key metalen meta bodylen body deleted? offset size-ondisk ;
@ -269,8 +258,6 @@ T{ doc
{ metalen 0 } { bodylen 4 }
{ offset 4256 } { size-ondisk 0 }
}
*/
: alien/length>string ( alien n -- string/f )
@ -305,17 +292,28 @@ T{ doc
[ file_size>> ]
} cleave <info> ;
: fdb-iterator-prev ( iterator -- doc/f ) \ fdb_iterator_prev fdb-iterate ;
: fdb-iterator-next ( iterator -- doc/f ) \ fdb_iterator_next fdb-iterate ;
: fdb-iterator-next-meta-only ( iterator -- doc/f ) \ fdb_iterator_next_metaonly fdb-iterate ;
: fdb-iterator-seek ( iterator key -- )
dup length fdb_iterator_seek fdb-check-error ;
: fdb-iterator-get ( iterator -- doc/f )
fdb_doc malloc-struct fdb_doc <ref>
[ fdb_iterator_get check-iterate-result ] keep swap
[ void* deref fdb_doc memory>struct ] [ void* deref free f ] if ;
: with-fdb-iterator ( start-key end-key fdb_iterator_opt_t iterator-init iterator-next quot: ( obj -- ) -- )
: fdb-iterator-seek ( iterator key seek-opt -- )
[ dup length ] dip fdb_iterator_seek fdb-check-error ;
: fdb-iterator-seek-lower ( iterator key -- )
FDB_ITR_SEEK_LOWER fdb-iterator-seek ;
: fdb-iterator-seek-higher ( iterator key -- )
FDB_ITR_SEEK_HIGHER fdb-iterator-seek ;
: with-fdb-iterator ( start-key end-key fdb_iterator_opt_t iterator-init iterator-advance quot: ( obj -- ) -- )
[ execute ] 2dip
swap
'[
_ &dispose handle>> [
_ execute [ _ with-doc t ] [ f ] if*
[ fdb-iterator-get ] keep swap
[ _ with-doc _ execute check-iterate-result ]
[ drop f ] if*
] curry loop
] with-destructors ; inline
@ -331,26 +329,25 @@ PRIVATE>
: with-fdb-map ( start-key end-key fdb_iterator_opt_t iterator-init iterator-next quot: ( obj -- ) -- )
[ execute ] 2dip
swap
'[
_ &dispose handle>> [
_ execute [ _ with-doc t ] [ f f ] if* swap
[ fdb-iterator-get ] keep swap
[ _ with-doc swap _ execute check-iterate-result ]
[ drop f ] if* swap
] curry collector-when [ loop ] dip
] with-destructors ; inline
: with-fdb-normal-iterator ( start-key end-key quot -- )
[ FDB_ITR_NONE \ fdb-iterator-init \ fdb-iterator-next ] dip
with-fdb-iterator ; inline
: with-fdb-normal-meta-iterator ( start-key end-key quot -- )
[ FDB_ITR_NONE \ fdb-iterator-init \ fdb-iterator-next-meta-only ] dip
[ FDB_ITR_NONE \ fdb-iterator-init \ fdb_iterator_next ] dip
with-fdb-iterator ; inline
: with-fdb-byseq-each ( start-seq end-seq quot -- )
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb-iterator-next-meta-only ] dip
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb_iterator_next ] dip
with-fdb-iterator ; inline
: with-fdb-byseq-map ( start-seq end-seq quot -- )
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb-iterator-next-meta-only ] dip
[ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb_iterator_next ] dip
with-fdb-map ; inline
! Do not try to commit here, as it will fail with FDB_RESULT_RONLY_VIOLATION