summaryrefslogtreecommitdiff
path: root/src/mod_carboncopy_mnesia.erl
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-15 15:48:56 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2016-04-15 15:48:56 +0300
commit222572bd5687a53c507d10d8f6bcf9a90f5801ae (patch)
tree0f2630da507ba0fd4f23e5a81e9cf3bfeae18b0d /src/mod_carboncopy_mnesia.erl
parentAdd mod_mam header file (diff)
Clean mod_carboncopy.erl from DB specific code
Diffstat (limited to 'src/mod_carboncopy_mnesia.erl')
-rw-r--r--src/mod_carboncopy_mnesia.erl68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/mod_carboncopy_mnesia.erl b/src/mod_carboncopy_mnesia.erl
new file mode 100644
index 00000000..bf69bd21
--- /dev/null
+++ b/src/mod_carboncopy_mnesia.erl
@@ -0,0 +1,68 @@
+%%%-------------------------------------------------------------------
+%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%% @copyright (C) 2016, Evgeny Khramtsov
+%%% @doc
+%%%
+%%% @end
+%%% Created : 15 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
+%%%-------------------------------------------------------------------
+-module(mod_carboncopy_mnesia).
+
+-behaviour(mod_carboncopy).
+
+%% API
+-export([init/2, enable/4, disable/3, list/2]).
+
+-include("mod_carboncopy.hrl").
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+init(_Host, _Opts) ->
+ Fields = record_info(fields, carboncopy),
+ try mnesia:table_info(carboncopy, attributes) of
+ Fields ->
+ ok;
+ _ ->
+ %% recreate..
+ mnesia:delete_table(carboncopy)
+ catch _:_Error ->
+ %% probably table don't exist
+ ok
+ end,
+ mnesia:create_table(carboncopy,
+ [{ram_copies, [node()]},
+ {attributes, record_info(fields, carboncopy)},
+ {type, bag}]),
+ mnesia:add_table_copy(carboncopy, node(), ram_copies).
+
+enable(LUser, LServer, LResource, NS) ->
+ try mnesia:dirty_write(
+ #carboncopy{us = {LUser, LServer},
+ resource = LResource,
+ version = NS}) of
+ ok -> ok
+ catch _:Error ->
+ {error, Error}
+ end.
+
+disable(LUser, LServer, LResource) ->
+ ToDelete = mnesia:dirty_match_object(
+ #carboncopy{us = {LUser, LServer},
+ resource = LResource,
+ version = '_'}),
+ try lists:foreach(fun mnesia:dirty_delete_object/1, ToDelete) of
+ ok -> ok
+ catch _:Error ->
+ {error, Error}
+ end.
+
+list(LUser, LServer) ->
+ mnesia:dirty_select(
+ carboncopy,
+ [{#carboncopy{us = {LUser, LServer}, resource = '$2', version = '$3'},
+ [], [{{'$2','$3'}}]}]).
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================