1 |
|
-module(mod_keystore_mnesia). |
2 |
|
-behaviour(mod_keystore_backend). |
3 |
|
|
4 |
|
-export([init/2, |
5 |
|
init_ram_key/1, |
6 |
|
get_key/1]). |
7 |
|
|
8 |
|
-ignore_xref([get_key/1, init/2, init_ram_key/1]). |
9 |
|
|
10 |
|
-include("mod_keystore.hrl"). |
11 |
|
|
12 |
|
-spec init(mongooseim:host_type(), gen_mod:module_opts()) -> ok. |
13 |
|
init(_HostType, _Opts) -> |
14 |
:-( |
mnesia:create_table(key, |
15 |
|
[{ram_copies, [node()]}, |
16 |
|
{type, set}, |
17 |
|
{attributes, record_info(fields, key)}]), |
18 |
:-( |
mnesia:add_table_copy(key, node(), ram_copies), |
19 |
:-( |
ok. |
20 |
|
|
21 |
|
-spec init_ram_key(ProposedKey) -> Result when |
22 |
|
ProposedKey :: mod_keystore:key(), |
23 |
|
Result :: {ok, ActualKey} | {error, any()}, |
24 |
|
ActualKey :: mod_keystore:key(). |
25 |
|
init_ram_key(ProposedKey) -> |
26 |
:-( |
case mnesia:transaction(fun init_ram_key_transaction/1, [ProposedKey]) of |
27 |
:-( |
{aborted, Reason} -> {error, Reason}; |
28 |
:-( |
{atomic, Key} -> {ok, Key} |
29 |
|
end. |
30 |
|
|
31 |
|
init_ram_key_transaction(#key{id = KeyID} = ProposedKey) -> |
32 |
:-( |
case mnesia:wread({key, KeyID}) of |
33 |
|
[#key{} = ActualKey] -> |
34 |
:-( |
ActualKey; |
35 |
|
[] -> |
36 |
:-( |
mnesia:write(ProposedKey), |
37 |
:-( |
ProposedKey |
38 |
|
end. |
39 |
|
|
40 |
|
-spec get_key(ID :: mod_keystore:key_id()) -> mod_keystore:key_list(). |
41 |
|
get_key(ID) -> |
42 |
:-( |
case mnesia:transaction(fun mnesia:read/1, [{key, ID}]) of |
43 |
:-( |
{aborted, Reason} -> error(Reason, [ID]); |
44 |
:-( |
{atomic, []} -> []; |
45 |
:-( |
{atomic, [#key{id = ID, key = Key}]} -> [{ID, Key}] |
46 |
|
end. |