summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2020-08-06 20:04:58 +0100
committerRobert Newson <rnewson@apache.org>2020-08-06 20:43:05 +0100
commita74675fd03240ae610cb9daefc87b42c0e7def7b (patch)
tree2ac17ef29c5f66dad6a8f37981fca0261fc1a374
parent8ddcc22cd4a492d816361ce5d2495c61b3d80591 (diff)
downloadcouchdb-a74675fd03240ae610cb9daefc87b42c0e7def7b.tar.gz
Pluggable persist_fun
-rw-r--r--src/ebtree/src/ebtree.erl31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index c31f503d5..536d3b139 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -46,7 +46,8 @@
max,
collate_fun,
reduce_fun,
- encode_fun
+ encode_fun,
+ persist_fun
}).
-define(META, 0).
@@ -83,12 +84,14 @@ open(Db, Prefix, Order, Options) when is_binary(Prefix), is_integer(Order), Orde
ReduceFun = proplists:get_value(reduce_fun, Options, fun reduce_noop/2),
CollateFun = proplists:get_value(collate_fun, Options, fun collate_raw/2),
EncodeFun = proplists:get_value(encode_fun, Options, fun encode_erlang/3),
+ PersistFun = proplists:get_value(persist_fun, Options, fun simple_persist/3),
Tree = #tree{
prefix = Prefix,
reduce_fun = ReduceFun,
collate_fun = CollateFun,
- encode_fun = EncodeFun
+ encode_fun = EncodeFun,
+ persist_fun = PersistFun
},
erlfdb:transactional(Db, fun(Tx) ->
@@ -772,8 +775,7 @@ meta_key(Prefix, MetaKey) when is_binary(Prefix) ->
get_node(Tx, #tree{} = Tree, Id) ->
Key = node_key(Tree#tree.prefix, Id),
- Future = erlfdb:get(Tx, Key),
- Value = erlfdb:wait(Future),
+ Value = persist(Tree, Tx, get, Key),
decode_node(Tree, Id, Key, Value).
@@ -785,7 +787,7 @@ clear_nodes(Tx, #tree{} = Tree, Nodes) ->
clear_node(Tx, #tree{} = Tree, #node{} = Node) ->
Key = node_key(Tree#tree.prefix, Node#node.id),
- erlfdb:clear(Tx, Key).
+ persist(Tree, Tx, clear, Key).
set_nodes(Tx, #tree{} = Tree, Nodes) ->
@@ -805,7 +807,7 @@ set_node(Tx, #tree{} = Tree, #node{} = Node) ->
validate_node(Tree, Node),
Key = node_key(Tree#tree.prefix, Node#node.id),
Value = encode_node(Tree, Key, Node),
- erlfdb:set(Tx, Key, Value).
+ persist(Tree, Tx, set, [Key, Value]).
node_key(Prefix, Id) when is_binary(Prefix), is_integer(Id) ->
@@ -1006,6 +1008,23 @@ encode_erlang(encode, _Key, Value) ->
encode_erlang(decode, _Key, Value) ->
binary_to_term(Value, [safe]).
+%% persist function
+
+persist(#tree{} = Tree, Tx, Action, Args) ->
+ #tree{persist_fun = PersistFun} = Tree,
+ PersistFun(Tx, Action, Args).
+
+
+simple_persist(Tx, set, [Key, Value]) ->
+ erlfdb:set(Tx, Key, Value);
+
+simple_persist(Tx, get, Key) ->
+ erlfdb:wait(erlfdb:get(Tx, Key));
+
+simple_persist(Tx, clear, Key) ->
+ erlfdb:clear(Tx, Key).
+
+
%% private functions
init_order(#tree{} = Tree, Order)