summaryrefslogtreecommitdiff
path: root/src/mod_carboncopy_mnesia.erl
blob: bf69bd21c776b97455de3c8e92de9ee9ae49ef5b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
%%%===================================================================