Did you know ... | Search Documentation: |
Pack rocksdb -- prolog/rocksdb.pl |
RocksDB is an embeddable persistent key-value store for fast storage. The store can be used only from one process at the same time. It may be used from multiple Prolog threads though. This library provides a SWI-Prolog binding for RocksDB. RocksDB just associates byte arrays. This interface defines several mappings between Prolog datastructures and byte arrays that may be configured to store both keys and values. See rocks_open/3 for details.
rocks_error(Message)
or rocks_error(Message,Blob)
.
Most of the DBOptions in rocksdb/include/rocksdb/options.h
are supported. create_if_exists
defaults to true
.
Additional options are:
rocks_close/1 throws an existence error if RocksDB isn't a valid handle or alias from rocks_open/3. If RocksDB is an anonymous handle that has been closed, rocks_close/1 silently succeeds; if it's an alias name that's already been closed, an existence error is raised (this behavior may change in future).
If you call rocks_close/1 while there is an iterator open (e.g., from rocks_enum/3 that still has a choicepoint), the results are unpredicatable. The code attempts to avoid crashes by reference counting iterators and only allowing a close if there are no active iterators for a database.
alias
option and unify RocksDb with the underlying handle; fails if
there is no open file with the alias Name.
This predicate has two uses:
rocks_open(...,RocksDB,[alias(Name)])
unifies
RocksDB with Name; if alias(Name)
is not specified, RocksDB
is unified with the underlying handle.list(Type)
or set(Type)
, Value must be a list. For
set(Type)
the list is converted into an ordered set.list(Type)
or set(Type)
to be used when opening the database.
Using rocks_merge/3 rather than rocks_get/2, update and
rocks_put/3 makes the operation atomic and reduces disk
accesses.
Options are the same as for rocks_put/4.
Merger is called as below, where two clauses are required:
one with How set to partial
and one with How set to
full
. If full
, MergeValue is a list of values that need
to be merged, if partial
, MergeValue is a single value.
call(:Merger, +How, +Key, +Value0, +MergeValue, -Value)
If Key is not in RocksDB, Value0 is unified with a value that
depends on the value type. If the value type is an atom, it is
unified with the empty atom; if it is string
or binary
it is
unified with an empty string; if it is int32
or int64
it is
unified with the integer 0; and finally if the type is term
it
is unified with the empty list.
For example, if the value is a set of Prolog values we open the
database with value(term)
to allow for Prolog lists as value and
we define merge_set/5 as below.
merge(partial, _Key, Left, Right, Result) :- ord_union(Left, Right, Result). merge(full, _Key, Initial, Additions, Result) :- append([Initial|Additions], List), sort(List, Result).
If the merge callback fails or raises an exception the merge operation fails and the error is logged through the RocksDB logging facilities. Note that the merge callback can be called in a different thread or even in a temporary created thread if RocksDB decides to merge remaining values in the background.
Options are the same as for rocks_put/4.
list(Type)
or set(Type)
this
returns a Prolog list.list(Type)
or set(Type)
Value is a list.
Options are the same as for rocks_get/4.
atom
, string
or binary
. To only
iterate all keys with Prefix, use rocks_enum_prefix/4 or the
construct below.
Options are the same as for rocks_get/4.
rocks_enum_from(DB, Key, Value, Prefix), ( sub_atom(Key, 0, _, _, Prefix) -> handle(Key, Value) ; !, fail )
Options are the same as for rocks_get/4.
Options are the same as for rocks_put/4.
Actions is a list of:
The following example is translated from the RocksDB documentation:
rocks_get(RocksDB, key1, Value), rocks_batch(RocksDB, [ delete(key1), put(key2, Value) ])
The following predicates are exported, but not or incorrectly documented.