]> granicus.if.org Git - ejabberd/commitdiff
Don't store xdata() in Mnesia table
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Fri, 27 Oct 2017 08:46:37 +0000 (11:46 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Fri, 27 Oct 2017 08:46:37 +0000 (11:46 +0300)
include/mod_push.hrl
src/mod_push_mnesia.erl
src/mod_push_sql.erl

index 6b6e898c2c22b6aebd6fd679882e908894f46abf..f8c98b3f3286585394efa8328411b33c5f0ca554 100644 (file)
@@ -21,4 +21,4 @@
          timestamp = p1_time_compat:timestamp() :: erlang:timestamp(),
          service = {<<"">>, <<"">>, <<"">>}     :: ljid(),
          node = <<"">>                          :: binary(),
-         xdata = #xdata{}                       :: xdata()}).
+         xml = undefined                        :: xmlel()}).
index 3e68505be32bdc6754ee5cd481d1232da8fbc1ac..ff12150f25cb9278d2b900031d15296cf84b12e7 100644 (file)
@@ -31,7 +31,7 @@
 %% API
 -export([init/2, store_session/6, lookup_session/4, lookup_session/3,
         lookup_sessions/3, lookup_sessions/2, lookup_sessions/1,
-        delete_session/3, delete_old_sessions/2]).
+        delete_session/3, delete_old_sessions/2, transform/1]).
 
 -include_lib("stdlib/include/ms_transform.hrl").
 -include("logger.hrl").
@@ -61,7 +61,7 @@ store_session(LUser, LServer, TS, PushJID, Node, XData) ->
                                           timestamp = TS,
                                           service = PushLJID,
                                           node = Node,
-                                          xdata = XData})
+                                          xml = encode_xdata(XData)})
        end,
     case mnesia:transaction(F) of
        {atomic, ok} ->
@@ -83,8 +83,8 @@ lookup_session(LUser, LServer, PushJID, Node) ->
                          Rec
                  end),
     case mnesia:dirty_select(push_session, MatchSpec) of
-       [#push_session{timestamp = TS, xdata = XData}] ->
-           {ok, {TS, PushLJID, Node, XData}};
+       [#push_session{timestamp = TS, xml = El}] ->
+           {ok, {TS, PushLJID, Node, decode_xdata(El)}};
        [] ->
            ?DEBUG("No push session found for ~s@~s (~p, ~s)",
                   [LUser, LServer, PushJID, Node]),
@@ -100,8 +100,8 @@ lookup_session(LUser, LServer, TS) ->
                          Rec
                  end),
     case mnesia:dirty_select(push_session, MatchSpec) of
-       [#push_session{service = PushLJID, node = Node, xdata = XData}] ->
-           {ok, {TS, PushLJID, Node, XData}};
+       [#push_session{service = PushLJID, node = Node, xml = El}] ->
+           {ok, {TS, PushLJID, Node, decode_xdata(El)}};
        [] ->
            ?DEBUG("No push session found for ~s@~s (~p)",
                   [LUser, LServer, TS]),
@@ -113,22 +113,18 @@ lookup_sessions(LUser, LServer, PushJID) ->
     MatchSpec = ets:fun2ms(
                  fun(#push_session{us = {U, S}, service = P,
                                    node = Node, timestamp = TS,
-                                   xdata = XData} = Rec)
+                                   xml = El} = Rec)
                        when U == LUser,
                             S == LServer,
                             P == PushLJID ->
-                         {TS, PushLJID, Node, XData}
+                         Rec
                  end),
-    {ok, mnesia:dirty_select(push_session, MatchSpec)}.
+    Records = mnesia:dirty_select(push_session, MatchSpec),
+    {ok, records_to_sessions(Records)}.
 
 lookup_sessions(LUser, LServer) ->
     Records = mnesia:dirty_read(push_session, {LUser, LServer}),
-    Clients = [{TS, PushLJID, Node, XData}
-              || #push_session{timestamp = TS,
-                               service = PushLJID,
-                               node = Node,
-                               xdata = XData} <- Records],
-    {ok, Clients}.
+    {ok, records_to_sessions(Records)}.
 
 lookup_sessions(LServer) ->
     MatchSpec = ets:fun2ms(
@@ -136,11 +132,12 @@ lookup_sessions(LServer) ->
                                    timestamp = TS,
                                    service = PushLJID,
                                    node = Node,
-                                   xdata = XData})
+                                   xml = El})
                        when S == LServer ->
-                         {TS, PushLJID, Node, XData}
+                         {TS, PushLJID, Node, El}
                  end),
-    {ok, mnesia:dirty_select(push_session, MatchSpec)}.
+    Records = mnesia:dirty_select(push_session, MatchSpec),
+    {ok, records_to_sessions(Records)}.
 
 delete_session(LUser, LServer, TS) ->
     MatchSpec = ets:fun2ms(
@@ -180,6 +177,11 @@ delete_old_sessions(_LServer, Time) ->
            {error, db_failure}
     end.
 
+transform({push_session, US, TS, Service, Node, XData}) ->
+    ?INFO_MSG("Transforming push_session Mnesia table", []),
+    #push_session{us = US, timestamp = TS, service = Service,
+                 node = Node, xml = encode_xdata(XData)}.
+
 %%--------------------------------------------------------------------
 %% Internal functions.
 %%--------------------------------------------------------------------
@@ -198,3 +200,20 @@ enforce_max_sessions({U, S} = US, Max) ->
        true ->
            ok
     end.
+
+decode_xdata(undefined) ->
+    undefined;
+decode_xdata(El) ->
+    xmpp:decode(El).
+
+encode_xdata(undefined) ->
+    undefined;
+encode_xdata(XData) ->
+    xmpp:encode(XData).
+
+records_to_sessions(Records) ->
+    [{TS, PushLJID, Node, decode_xdata(El)}
+     || #push_session{timestamp = TS,
+                     service = PushLJID,
+                     node = Node,
+                     xml = El} <- Records].
index f969e7c85a86351813c2db42909ec26e14c2f1a3..e4634a34e4a5f9a16888d9eec499ad1aaec2a96d 100644 (file)
@@ -177,7 +177,7 @@ export(_Server) ->
                              timestamp = NowTS,
                              service = PushLJID,
                              node = Node,
-                             xdata = XData})
+                             xml = XData})
            when LServer == Host ->
              TS = misc:now_to_usec(NowTS),
              Service = jid:encode(PushLJID),