diff --git a/extra/forestdb/lib/lib-tests.factor b/extra/forestdb/lib/lib-tests.factor index 62b84c3a07..f00b80a9db 100644 --- a/extra/forestdb/lib/lib-tests.factor +++ b/extra/forestdb/lib/lib-tests.factor @@ -27,6 +27,9 @@ IN: forestdb.lib : set-kv-n ( n -- ) make-kv-n [ fdb-set-kv ] assoc-each ; +: del-kv-n ( n -- ) + make-kv-n keys [ fdb-del-kv ] each ; + : set-kv-nth ( n -- ) make-kv-nth fdb-set-kv ; @@ -363,7 +366,38 @@ IN: forestdb.lib 0 10 [ [ seqnum>> ] [ [ key>> ] [ keylen>> ] bi alien/length>string ] bi 2array , - ] with-fdb-byseq-iterator + ] with-fdb-byseq-each ] { } make ] with-forestdb-path ] unit-test + +! Test byseq mapping +{ + V{ 1 2 3 4 5 } +} [ + delete-test-db-1 + test-db-1 [ + 5 set-kv-n + fdb-commit-normal + 0 10 [ + fdb_doc>doc + ] with-fdb-byseq-map + [ seqnum>> ] map + ] with-forestdb-path +] unit-test + +! Deleting 5 keys gives you 5 new seqnums that are those docs, but deleted +{ + V{ { 6 t } { 7 t } { 8 t } { 9 t } { 10 t } } +} [ + delete-test-db-1 + test-db-1 [ + 5 set-kv-n + 5 del-kv-n + fdb-commit-normal + 0 10 [ + fdb_doc>doc + ] with-fdb-byseq-map + [ [ seqnum>> ] [ deleted?>> ] bi 2array ] map + ] with-forestdb-path +] unit-test diff --git a/extra/forestdb/lib/lib.factor b/extra/forestdb/lib/lib.factor index 730ae7de36..4d44ee44bc 100644 --- a/extra/forestdb/lib/lib.factor +++ b/extra/forestdb/lib/lib.factor @@ -333,6 +333,24 @@ T{ doc ] curry loop ] with-destructors ; inline + + +: with-fdb-map ( start-key end-key fdb_iterator_opt_t iterator-init iterator-next quot: ( obj -- ) -- ) + [ execute ] 2dip + '[ + _ &dispose handle>> [ + _ execute [ _ with-doc t ] [ f 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 @@ -341,10 +359,14 @@ T{ doc [ FDB_ITR_NONE \ fdb-iterator-init \ fdb-iterator-next-meta-only ] dip with-fdb-iterator ; inline -: with-fdb-byseq-iterator ( start-seq end-seq quot -- ) +: with-fdb-byseq-each ( start-seq end-seq quot -- ) [ FDB_ITR_NONE \ fdb-iterator-byseq-init \ fdb-iterator-next-meta-only ] 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 + with-fdb-map ; 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