|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.
onceand an alias is given, a second open simply returns a handle to the already open database.
X = f(a), Key = k(X,X)is a different key from
Key = k(f(a),f(a))and
X = [a|X]is a different key from
X = [a,a|X]. Applications for which such keys should match must first normalize the key. Normalization can be based on term_factorized/3 from library(terms).
read_only. The latter uses OpenForReadOnly() to open the database.
Merger is called as below, where two clauses are required:
one with How set to
partial and one with How set to
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
binary it is
unified with an empty string; if it is
int64 it is
unified with the integer 0; and finally if the type is
is unified with the empty list.
For example, if the value is a set of Prolog values we open the
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.
The following example is translated from the RocksDB documentation:
rocks_get(RocksDB, key1, Value), rocks_batch(RocksDB, [ delete(key1), put(key2, Value) ])