This commit is contained in:
niamtokik
2023-11-05 20:19:02 +00:00
parent 4098bc6af0
commit 194fbcd4b0
3 changed files with 113 additions and 32 deletions

View File

@@ -61,7 +61,7 @@
Return :: ok.
add_aliases(Aliases) ->
?LOG_DEBUG("~p",[{?MODULE, self(), add_aliases, [Aliases]}]),
?LOG_DEBUG("~p",[{self(), ?MODULE, add_aliases, [Aliases]}]),
% throw({todo, ?MODULE, add_aliases, [Aliases]}).
ok.

View File

@@ -6,6 +6,33 @@
%%% perhaps macros will be also created here and shared for other
%%% projects.
%%%
%%% == Usage ==
%%%
%%% ```
%%% % set this module in debug mode
%%% logger:set_module_level(mnesia_unixfs, all).
%%%
%%% % create a new schema if it does not exist
%%% mnesia:create_schema([node()]).
%%%
%%% % start mnesia
%%% mnesia:start().
%%%
%%% % add mnesia_unixfs set as unixfs_copies
%%% mnesia:add_backend_type(unixfs_copies, mnesia_unixfs).
%%%
%%% % create a new default table without any options
%%% mnesia:create_table(test, [{unixfs_copies, [node()]}]).
%%%
%%% % insert a new data. the key is converted with term_to_binary
%%% % and, hashed with sha256 and then converted as hex string.
%%% mnesia:dirty_write({test, key, value}).
%%% ls("Mnesia.nonode@nohost/test").
%%%
%%% % to read the value of the key
%%% mnesia:dirty_read(test, key).
%%% '''
%%%
%%% == Database Structure ==
%%%
%%% ```
@@ -125,18 +152,6 @@
-type cont_fun() :: any().
-type continuation() :: '$end_of_table' | cont_fun().
%%--------------------------------------------------------------------
%% @doc
%% @end
%%--------------------------------------------------------------------
-spec add_aliases(Aliases) -> Return when
Aliases :: aliases(),
Return :: ok.
add_aliases(Aliases) ->
?LOG_DEBUG("~p",[{?MODULE, self(), add_aliases, [Aliases]}]),
throw(todo).
%%--------------------------------------------------------------------
%% @doc
%% @end
@@ -165,18 +180,41 @@ create_schema(Nodes, Aliases)
mnesia:create_schema(Nodes, [{backend_types, Backends}]).
%%--------------------------------------------------------------------
%% @doc
%% @doc `mnesia_backend_type' mandatory callback. Adds a new alias.
%%
%% @end
%%--------------------------------------------------------------------
-spec add_aliases(Aliases) -> Return when
Aliases :: aliases(),
Return :: ok.
add_aliases(Aliases) ->
?LOG_DEBUG("~p",[{?MODULE, self(), add_aliases, [Aliases]}]),
ok.
%%--------------------------------------------------------------------
%% @doc `mnesia_backend_type` mandatory callback. Creates a new table.
%%
%% @end
%%--------------------------------------------------------------------
-spec create_table(Alias, Table, Properties) -> Return when
Alias :: alias(),
Table :: table(),
Properties :: proplists:proplist(),
Return :: table().
Return :: ok.
create_table(Alias, Table, Properties) ->
?LOG_DEBUG("~p",[{?MODULE, self(), create_table, [Alias, Table, Properties]}]),
throw(todo).
TableString = atom_to_list(Table),
MnesiaDirectory = mnesia_monitor:get_env(dir),
TablePath = filename:join(MnesiaDirectory , TableString),
case filelib:is_dir(TablePath) of
false ->
file:make_dir(TablePath),
ok;
true ->
ok
end.
%%--------------------------------------------------------------------
%% @doc Close an open and active table. This callback is called by
@@ -200,18 +238,22 @@ create_table(Alias, Table, Properties) ->
close_table(Alias, Table) ->
?LOG_DEBUG("~p",[{?MODULE, self(), close_table, [Alias, Table]}]),
throw(todo).
ok.
%%--------------------------------------------------------------------
%% @doc Initialize the environment for the backend. This callback is
%% called by `mnesia_schema:init_backend/2' and must return ok to
%% continue the execution and add aliases.
%% continue the execution and add aliases. If an application is
%% required by this backend it can be started there.
%%
%% @end
%%--------------------------------------------------------------------
-spec init_backend() -> Return when
Return :: ok.
init_backend() ->
application:start(mnesia_unixfs),
throw(todo).
application:ensure_all_started(mnesia_unixfs),
ok.
%%--------------------------------------------------------------------
%% @doc this callback is called by
@@ -228,7 +270,7 @@ init_backend() ->
check_definition(Alias, Table, Nodes, Properties) ->
?LOG_DEBUG("~p",[{?MODULE, self(), check_definition, [Alias, Table, Nodes, Properties]}]),
ok.
{ok, Properties}.
%%--------------------------------------------------------------------
%% @doc Delete a key in an opened and active table. This callback is
@@ -274,7 +316,7 @@ delete(Alias, Table, Key) ->
delete_table(Alias, Table) ->
?LOG_DEBUG("~p",[{?MODULE, self(), delete_table, [Alias, Table]}]),
throw(todo).
ok.
%%--------------------------------------------------------------------
%% @doc this callback is called by `mnesia_lib:db_fixtable/3'.
@@ -366,7 +408,15 @@ info(TypeAlias, Table, Item) ->
insert(TypeAlias, Table, Object) ->
?LOG_DEBUG("~p",[{?MODULE, self(), insert, [TypeAlias, Table, Object]}]),
throw(todo).
TableString = atom_to_list(Table),
MnesiaDirectory = mnesia_monitor:get_env(dir),
TablePath = filename:join(MnesiaDirectory, TableString),
Key = element(2, Object),
Value = element(3, Object),
KeyEncoded = binary:encode_hex(crypto:hash(sha256,term_to_binary(Key, [deterministic]))),
KeyPath = filename:join(TablePath, KeyEncoded),
file:write_file(KeyPath, term_to_binary(Value)),
ok.
%%--------------------------------------------------------------------
%% @doc Called by
@@ -387,7 +437,18 @@ insert(TypeAlias, Table, Object) ->
lookup(TypeAlias, Table, Key) ->
?LOG_DEBUG("~p",[{?MODULE, self(), lookup, [TypeAlias, Table, Key]}]),
throw(todo).
TableString = atom_to_list(Table),
MnesiaDirectory = mnesia_monitor:get_env(dir),
TablePath = filename:join(MnesiaDirectory, TableString),
KeyEncoded = binary:encode_hex(crypto:hash(sha256,term_to_binary(Key, [deterministic]))),
KeyPath = filename:join(TablePath, KeyEncoded),
case file:read_file(KeyPath) of
{ok, File} ->
Value = binary_to_term(File),
{Table, Key, Value};
Elsewise ->
Elsewise
end.
%%--------------------------------------------------------------------
%% @doc Called by
@@ -411,7 +472,7 @@ lookup(TypeAlias, Table, Key) ->
load_table(TypeAlias, Table, Reason, CsList) ->
?LOG_DEBUG("~p",[{?MODULE, self(), load_table, [TypeAlias, Table, Reason, CsList]}]),
throw(todo).
ok.
%%--------------------------------------------------------------------
%% @doc
@@ -583,7 +644,8 @@ sender_init(TypeAlias, Table, LoadReason, Pid) ->
throw(todo).
%%--------------------------------------------------------------------
%% @doc
%% @doc unixfs store all its data on disc only by default.
%%
%% @end
%%--------------------------------------------------------------------
-spec semantics(TypeAlias, Item) -> Return when
@@ -593,9 +655,19 @@ sender_init(TypeAlias, Table, LoadReason, Pid) ->
| set | ordered_set | bag
| function() | ordered | bag.
semantics(TypeAlias, Item) ->
?LOG_DEBUG("~p",[{?MODULE, self(), semantics, [TypeAlias, Item]}]),
throw(todo).
semantics(Alias, Item) ->
?LOG_DEBUG("~p",[{?MODULE, self(), semantics, [Alias, Item]}]),
case Item of
storage -> disc_only_copies;
types -> [set, ordered_set, bag];
index_types -> [ordered];
index_fun -> fun semantics_index_fun/4;
_ -> undefined
end.
semantics_index_fun(Alias, Table, Pos, Object) ->
?LOG_DEBUG("~p",[{?MODULE, self(), semantics, [Alias, Table, Pos, Object]}]),
ok.
%%--------------------------------------------------------------------
%% @doc
@@ -638,7 +710,7 @@ sync_close_table(TypeAlias, Table) ->
tmp_suffixes() ->
?LOG_DEBUG("~p",[{?MODULE, self(), tmp_suffixes, []}]),
throw(todo).
[].
%%--------------------------------------------------------------------
%% @doc
@@ -687,7 +759,7 @@ validate_key(Alias, Table, RecordName, Arity, Type, Key) ->
validate_record(Alias, Table, RecordName, Arity, Type, Object) ->
?LOG_DEBUG("~p",[{?MODULE, self(), validate_record, [Alias, Table, RecordName, Arity, Type, Object]}]),
throw(todo).
{RecordName, Arity, Type}.
%%--------------------------------------------------------------------
%% @doc

View File

@@ -169,12 +169,21 @@ Based on `mnesia_rocksdb` implementation, `semantics/2` is needed to
define which kind of plugins are supported by this backend.
```erlang
% type of storage used
-type storage() :: ram_copies | disc_copies | disc_only_copies.
-type types() :: [bag | set | ordered_set].
% method to store data
-type type() :: bag | set | ordered_set.
-type types() :: [type()].
% type of index
-type index_type() :: bag | ordered
-type index_types() :: [index_type].
-type index_fun() :: fun(Alias, Tab, Pos, Object) -> [IndexxValue].
-spec semantics(_Alias, storage) -> storage();
semantics(_Alias, types) -> types();
semantics(_alias, index_types -> index_types();
semantics(_Alias, index_fun) -> index_fun();
semantics(_Alias, any()) -> undefined.
```