diff --git a/src/mnesia_rocksdb_admin.erl b/src/mnesia_rocksdb_admin.erl index 3ae2c22..73953e3 100644 --- a/src/mnesia_rocksdb_admin.erl +++ b/src/mnesia_rocksdb_admin.erl @@ -1489,11 +1489,7 @@ open_db_(MP, Alias, Opts, CFs0, CreateIfMissing) -> %% not yet created CFs = cfs(CFs0), file:make_dir(MP), - OpenOpts = [ {create_if_missing, true} - , {create_missing_column_families, true} - , {merge_operator, erlang_merge_operator} - | Opts ], - OpenRes = mnesia_rocksdb_lib:open_rocksdb(MP, OpenOpts, CFs), + OpenRes = rocksdb_open(MP, Opts, CFs), map_cfs(OpenRes, CFs, Alias, Acc0); false -> {error, enoent}; @@ -1504,9 +1500,15 @@ open_db_(MP, Alias, Opts, CFs0, CreateIfMissing) -> map_cfs(rocksdb_open(MP, Opts, CFs1), CFs1, Alias, Acc0) end. +open_opts(Opts) -> + [ {create_if_missing, true} + , {create_missing_column_families, true} + , {merge_operator, erlang_merge_operator} + | Opts ]. + rocksdb_open(MP, Opts, CFs) -> %% rocksdb:open(MP, Opts, CFs), - mnesia_rocksdb_lib:open_rocksdb(MP, Opts, CFs). + mnesia_rocksdb_lib:open_rocksdb(MP, open_opts(Opts), CFs). is_open(Alias, #st{backends = Bs}) -> case maps:find(Alias, Bs) of diff --git a/src/mrdb.erl b/src/mrdb.erl index 9be0a4a..74025a0 100644 --- a/src/mrdb.erl +++ b/src/mrdb.erl @@ -53,6 +53,7 @@ , delete/2 , delete/3 , delete_object/2, delete_object/3 , match_delete/2 + , merge/3 , merge/4 , clear_table/1 , batch_write/2 , batch_write/3 , update_counter/3, update_counter/4 @@ -740,6 +741,21 @@ insert(Tab, Obj0, Opts) -> EncVal = encode_val(Obj, Ref), insert_(Ref, Key, encode_key(Key, Ref), EncVal, Obj, Opts). +merge(Tab, Key, MergeOp) -> + merge(Tab, Key, MergeOp, []). + +merge(Tab, Key, MergeOp, Opts) -> + #{encoding := Enc} = Ref = ensure_ref(Tab), + case Enc of + {_, {value, term}} -> + merge_(Ref, Key, MergeOp, Opts); + _ -> + abort(badarg) + end. + +merge_(Ref, Key, MergeOp, Opts) -> + rdb_merge(Ref, encode_key(Key), MergeOp, Opts). + validate_obj(Obj, #{mode := mnesia}) -> Obj; validate_obj(Obj, #{attr_pos := AP,