aboutsummaryrefslogtreecommitdiff
path: root/src/pubsub_db_sql.erl
diff options
context:
space:
mode:
authorKonstantinos Kallas <konstantinos.kallas@hotmail.com>2017-08-19 13:42:05 +0300
committerKonstantinos Kallas <konstantinos.kallas@hotmail.com>2017-08-19 13:42:05 +0300
commitf581e391ac71106090c8a79ba915b614cf833587 (patch)
treef80098cdbc46fcebbd039ab69c0000798b8f23ca /src/pubsub_db_sql.erl
parentMerge remove_account_option branch (diff)
parentApply cosmetic changes to previous commit (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/pubsub_db_sql.erl')
-rw-r--r--src/pubsub_db_sql.erl94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/pubsub_db_sql.erl b/src/pubsub_db_sql.erl
index ae7a9fde6..ae28184db 100644
--- a/src/pubsub_db_sql.erl
+++ b/src/pubsub_db_sql.erl
@@ -25,12 +25,16 @@
-module(pubsub_db_sql).
+-compile([{parse_transform, ejabberd_sql_pt}]).
+
-author("pablo.polvorin@process-one.net").
-include("pubsub.hrl").
+-include("ejabberd_sql_pt.hrl").
-export([add_subscription/1, read_subscription/1,
delete_subscription/1, update_subscription/1]).
+-export([export/1]).
%% TODO: Those -spec lines produce errors in old Erlang versions.
%% They can be enabled again in ejabberd 3.0 because it uses R12B or higher.
@@ -139,3 +143,93 @@ sql_to_integer(N) -> binary_to_integer(N).
sql_to_boolean(B) -> B == <<"1">>.
sql_to_timestamp(T) -> xmpp_util:decode_timestamp(T).
+
+%% REVIEW:
+%% * this code takes NODEID from Itemid2, and forgets about Nodeidx
+%% * this code assumes Payload only contains one xmlelement()
+%% * PUBLISHER is taken from Creation
+export(_Server) ->
+ [{pubsub_item,
+ fun(_Host, #pubsub_item{itemid = {Itemid1, NODEID},
+ %nodeidx = _Nodeidx,
+ creation = {{C1, C2, C3}, Cusr},
+ modification = {{M1, M2, M3}, _Musr},
+ payload = Payload}) ->
+ ITEMID = ejabberd_sql:escape(Itemid1),
+ CREATION = ejabberd_sql:escape(list_to_binary(
+ string:join([string:right(integer_to_list(I),6,$0)||I<-[C1,C2,C3]],":"))),
+ MODIFICATION = ejabberd_sql:escape(list_to_binary(
+ string:join([string:right(integer_to_list(I),6,$0)||I<-[M1,M2,M3]],":"))),
+ PUBLISHER = ejabberd_sql:escape(jid:encode(Cusr)),
+ [PayloadEl] = [El || {xmlel,_,_,_} = El <- Payload],
+ PAYLOAD = ejabberd_sql:escape(fxml:element_to_binary(PayloadEl)),
+ [?SQL("delete from pubsub_item where itemid=%(ITEMID)s;"),
+ ?SQL("insert into pubsub_item(itemid,nodeid,creation,modification,publisher,payload) \n"
+ " values (%(ITEMID)s, %(NODEID)d, %(CREATION)s,
+ %(MODIFICATION)s, %(PUBLISHER)s, %(PAYLOAD)s);")];
+ (_Host, _R) ->
+ []
+ end},
+%% REVIEW:
+%% * From the mnesia table, the #pubsub_state.items is not used in ODBC
+%% * Right now AFFILIATION is the first letter of Affiliation
+%% * Right now SUBSCRIPTIONS expects only one Subscription
+%% * Right now SUBSCRIPTIONS letter is the first letter of Subscription
+ {pubsub_state,
+ fun(_Host, #pubsub_state{stateid = {Jid, Stateid},
+ %nodeidx = Nodeidx,
+ items = _Items,
+ affiliation = Affiliation,
+ subscriptions = Subscriptions}) ->
+ STATEID = list_to_binary(integer_to_list(Stateid)),
+ JID = ejabberd_sql:escape(jid:encode(Jid)),
+ NODEID = <<"unknown">>, %% TODO: integer_to_list(Nodeidx),
+ AFFILIATION = list_to_binary(string:substr(atom_to_list(Affiliation),1,1)),
+ SUBSCRIPTIONS = list_to_binary(parse_subscriptions(Subscriptions)),
+ [?SQL("delete from pubsub_state where stateid=%(STATEID)s;"),
+ ?SQL("insert into pubsub_state(stateid,jid,nodeid,affiliation,subscriptions)\n"
+ " values (%(STATEID)s, %(JID)s, %(NODEID)s, %(AFFILIATION)s, %(SUBSCRIPTIONS)s);")];
+ (_Host, _R) ->
+ []
+ end},
+
+%% REVIEW:
+%% * Parents is not migrated to PARENTs
+%% * Probably some option VALs are not correctly represented in mysql
+ {pubsub_node,
+ fun(_Host, #pubsub_node{nodeid = {Hostid, Nodeid},
+ id = Id,
+ parents = _Parents,
+ type = Type,
+ owners = Owners,
+ options = Options}) ->
+ HOST = case Hostid of
+ {U,S,R} -> ejabberd_sql:escape(jid:encode({U,S,R}));
+ _ -> ejabberd_sql:escape(Hostid)
+ end,
+ NODE = ejabberd_sql:escape(Nodeid),
+ PARENT = <<"">>,
+ IdB = integer_to_binary(Id),
+ TYPE = ejabberd_sql:escape(<<Type/binary, "_odbc">>),
+ [?SQL("delete from pubsub_node where nodeid=%(Id)d;"),
+ ?SQL("insert into pubsub_node(host,node,nodeid,parent,type) \n"
+ " values (%(HOST)s, %(NODE)s, %(Id)d, %(PARENT)s, %(TYPE)s);"),
+ ?SQL("delete from pubsub_node_option where nodeid=%(Id)d;"),
+ [["insert into pubsub_node_option(nodeid,name,val)\n"
+ " values (", IdB, ", '", atom_to_list(Name), "', '",
+ io_lib:format("~p", [Val]), "');\n"] || {Name,Val} <- Options],
+ ?SQL("delete from pubsub_node_owner where nodeid=%(Id)d;"),
+ [["insert into pubsub_node_owner(nodeid,owner)\n"
+ " values (", IdB, ", '", jid:encode(Usr), "');\n"] || Usr <- Owners],"\n"];
+ (_Host, _R) ->
+ []
+ end}].
+
+parse_subscriptions([]) ->
+ "";
+parse_subscriptions([{State, Item}]) ->
+ STATE = case State of
+ subscribed -> "s"
+ end,
+ string:join([STATE, Item],":").
+