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