Consistent support for merge ops

This commit is contained in:
Ulf Wiger 2025-06-02 20:07:05 +02:00
parent 56d78768d9
commit 2ca7f36eb1
2 changed files with 24 additions and 6 deletions

View File

@ -1489,11 +1489,7 @@ open_db_(MP, Alias, Opts, CFs0, CreateIfMissing) ->
%% not yet created %% not yet created
CFs = cfs(CFs0), CFs = cfs(CFs0),
file:make_dir(MP), file:make_dir(MP),
OpenOpts = [ {create_if_missing, true} OpenRes = rocksdb_open(MP, Opts, CFs),
, {create_missing_column_families, true}
, {merge_operator, erlang_merge_operator}
| Opts ],
OpenRes = mnesia_rocksdb_lib:open_rocksdb(MP, OpenOpts, CFs),
map_cfs(OpenRes, CFs, Alias, Acc0); map_cfs(OpenRes, CFs, Alias, Acc0);
false -> false ->
{error, enoent}; {error, enoent};
@ -1504,9 +1500,15 @@ open_db_(MP, Alias, Opts, CFs0, CreateIfMissing) ->
map_cfs(rocksdb_open(MP, Opts, CFs1), CFs1, Alias, Acc0) map_cfs(rocksdb_open(MP, Opts, CFs1), CFs1, Alias, Acc0)
end. 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) ->
%% 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}) -> is_open(Alias, #st{backends = Bs}) ->
case maps:find(Alias, Bs) of case maps:find(Alias, Bs) of

View File

@ -53,6 +53,7 @@
, delete/2 , delete/3 , delete/2 , delete/3
, delete_object/2, delete_object/3 , delete_object/2, delete_object/3
, match_delete/2 , match_delete/2
, merge/3 , merge/4
, clear_table/1 , clear_table/1
, batch_write/2 , batch_write/3 , batch_write/2 , batch_write/3
, update_counter/3, update_counter/4 , update_counter/3, update_counter/4
@ -740,6 +741,21 @@ insert(Tab, Obj0, Opts) ->
EncVal = encode_val(Obj, Ref), EncVal = encode_val(Obj, Ref),
insert_(Ref, Key, encode_key(Key, Ref), EncVal, Obj, Opts). 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}) -> validate_obj(Obj, #{mode := mnesia}) ->
Obj; Obj;
validate_obj(Obj, #{attr_pos := AP, validate_obj(Obj, #{attr_pos := AP,