./ct_report/coverage/mod_event_pusher_push_rdbms.COVER.html

1 %%%-------------------------------------------------------------------
2 %%% @copyright (C) 2019 Erlang Solutions Ltd.
3 %%% @end
4 %%%-------------------------------------------------------------------
5 %%% @doc
6 %%% RDBMS backend for mod_event_pusher_push.
7 %%% @end
8 %%%-------------------------------------------------------------------
9 -module(mod_event_pusher_push_rdbms).
10 -behavior(mod_event_pusher_push_backend).
11
12 -include("mongoose.hrl").
13 -include_lib("jid/include/jid.hrl").
14 %%--------------------------------------------------------------------
15 %% Exports
16 %%--------------------------------------------------------------------
17
18 -export([init/2]).
19 -export([enable/4,
20 disable/1,
21 disable/3,
22 get_publish_services/1]).
23
24 %%--------------------------------------------------------------------
25 %% Backend callbacks
26 %%--------------------------------------------------------------------
27
28 -spec init(Host :: jid:server(), Opts :: list()) -> ok.
29 init(_Host, _Opts) ->
30
:-(
prepare_queries().
31
32 -spec enable(User, PubSub, Node, Form) -> Result when
33 User :: jid:jid(),
34 PubSub :: jid:jid(),
35 Node :: mod_event_pusher_push:pubsub_node(),
36 Form :: mod_event_pusher_push:form(),
37 Result :: ok | {error, term()}.
38 enable(#jid{lserver = LServer} = User, PubSub, Node, Forms) ->
39
:-(
ExtUser = jid:to_binary(jid:to_lus(User)),
40
:-(
ExtPubSub = jid:to_binary(PubSub),
41
:-(
ExtForms = encode_form(Forms),
42
:-(
execute_delete(LServer, ExtUser, Node, ExtPubSub),
43
:-(
CreatedAt = os:system_time(microsecond),
44
:-(
case execute_insert(LServer, ExtUser, Node, ExtPubSub, ExtForms, CreatedAt) of
45
:-(
{updated, 1} -> ok;
46
:-(
Other -> Other
47 end.
48
49 -spec disable(User :: jid:jid()) -> ok.
50 disable(#jid{lserver = LServer} = User) ->
51
:-(
ExtUser = jid:to_binary(jid:to_lus(User)),
52
:-(
execute_delete(LServer, ExtUser),
53
:-(
ok.
54
55 -spec disable(User :: jid:jid(), PubSub :: jid:jid(),
56 Node :: mod_event_pusher_push:pubsub_node() | undefined) -> ok.
57 disable(#jid{lserver = LServer} = User, PubSub, undefined) ->
58
:-(
ExtUser = jid:to_binary(jid:to_lus(User)),
59
:-(
ExtPubSub = jid:to_binary(PubSub),
60
:-(
execute_delete(LServer, ExtUser, ExtPubSub),
61
:-(
ok;
62 disable(#jid{lserver = LServer} = User, PubSub, Node) ->
63
:-(
ExtUser = jid:to_binary(jid:to_lus(User)),
64
:-(
ExtPubSub = jid:to_binary(PubSub),
65
:-(
execute_delete(LServer, ExtUser, Node, ExtPubSub),
66
:-(
ok.
67
68 -spec get_publish_services(User :: jid:jid()) ->
69 {ok, [{PubSub :: jid:jid(),
70 Node :: mod_event_pusher_push:pubsub_node(),
71 Form :: mod_event_pusher_push:form()}]}.
72 get_publish_services(#jid{lserver = LServer} = User) ->
73
:-(
ExtUser = jid:to_binary(jid:to_lus(User)),
74
:-(
{selected, Rows} = execute_select(LServer, ExtUser),
75
:-(
{ok, decode_rows(Rows)}.
76
77 decode_rows(Rows) ->
78
:-(
[decode_row(Row) || Row <- Rows].
79
80 decode_row({NodeID, PubSubBin, FormJSON}) ->
81
:-(
{jid:from_binary(PubSubBin),
82 NodeID,
83 decode_form(FormJSON)}.
84
85 encode_form(Forms) ->
86
:-(
jiffy:encode({Forms}).
87
88 decode_form(FormJSON) ->
89
:-(
{Items} = jiffy:decode(FormJSON),
90
:-(
Items.
91
92 %% Prepared queries
93
94 -spec prepare_queries() -> ok.
95 prepare_queries() ->
96
:-(
mongoose_rdbms:prepare(event_pusher_push_insert, event_pusher_push_subscription,
97 [owner_jid, node, pubsub_jid, form, created_at],
98 <<"INSERT INTO event_pusher_push_subscription VALUES (?, ?, ?, ?, ?)">>),
99
:-(
mongoose_rdbms:prepare(event_pusher_push_select, event_pusher_push_subscription,
100 [owner_jid],
101 <<"SELECT node, pubsub_jid, form FROM event_pusher_push_subscription "
102 "WHERE owner_jid = ?">>),
103
:-(
mongoose_rdbms:prepare(event_pusher_push_delete, event_pusher_push_subscription,
104 [owner_jid],
105 <<"DELETE FROM event_pusher_push_subscription "
106 "WHERE owner_jid = ?">>),
107
:-(
mongoose_rdbms:prepare(event_pusher_push_delete_pubsub_jid, event_pusher_push_subscription,
108 [owner_jid, pubsub_jid],
109 <<"DELETE FROM event_pusher_push_subscription "
110 "WHERE owner_jid = ? AND pubsub_jid = ?">>),
111
:-(
mongoose_rdbms:prepare(event_pusher_push_delete_node, event_pusher_push_subscription,
112 [owner_jid, node, pubsub_jid],
113 <<"DELETE FROM event_pusher_push_subscription "
114 "WHERE owner_jid = ? AND node = ? AND pubsub_jid = ?">>),
115
:-(
ok.
116
117 -spec execute_insert(jid:lserver(), jid:literal_jid(), mod_event_pusher_push:pubsub_node(),
118 jid:literal_jid(), iodata(), non_neg_integer()) ->
119 mongoose_rdbms:query_result().
120 execute_insert(LServer, OwnerJid, Node, PubSubJid, Form, CreatedAt) ->
121
:-(
mongoose_rdbms:execute_successfully(LServer, event_pusher_push_insert,
122 [OwnerJid, Node, PubSubJid, Form, CreatedAt]).
123
124 -spec execute_select(jid:lserver(), jid:literal_jid()) -> mongoose_rdbms:query_result().
125 execute_select(LServer, OwnerJid) ->
126
:-(
mongoose_rdbms:execute_successfully(LServer, event_pusher_push_select, [OwnerJid]).
127
128 -spec execute_delete(jid:lserver(), jid:literal_jid()) -> mongoose_rdbms:query_result().
129 execute_delete(LServer, OwnerJid) ->
130
:-(
mongoose_rdbms:execute_successfully(LServer, event_pusher_push_delete, [OwnerJid]).
131
132 -spec execute_delete(jid:lserver(), jid:literal_jid(), jid:literal_jid()) ->
133 mongoose_rdbms:query_result().
134 execute_delete(LServer, OwnerJid, PubSubJid) ->
135
:-(
mongoose_rdbms:execute_successfully(LServer, event_pusher_push_delete_pubsub_jid,
136 [OwnerJid, PubSubJid]).
137
138 -spec execute_delete(jid:lserver(), jid:literal_jid(), mod_event_pusher_push:pubsub_node(),
139 jid:literal_jid()) ->
140 mongoose_rdbms:query_result().
141 execute_delete(LServer, OwnerJid, Node, PubSubJid) ->
142
:-(
mongoose_rdbms:execute_successfully(LServer, event_pusher_push_delete_node,
143 [OwnerJid, Node, PubSubJid]).
Line Hits Source