]> granicus.if.org Git - ejabberd/commitdiff
Add ODBC exporting function for privacy table
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 2 Apr 2012 02:39:23 +0000 (12:39 +1000)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 2 Apr 2012 02:39:23 +0000 (12:39 +1000)
src/ejd2odbc.erl
src/mod_privacy_odbc.erl

index 5f7b9d4da6c9637b3bb670de84be6f094374891e..a1f3a1eedbce05b7baaa8c53c87473d2c2d18430 100644 (file)
         export_vcard/2,
         export_vcard_search/2,
         export_private_storage/2,
+         export_privacy/2,
          export_muc_room/2,
          export_muc_registered/2]).
 
 -include("ejabberd.hrl").
 -include("jlib.hrl").
 -include("mod_roster.hrl").
+-include("mod_privacy.hrl").
 
 -record(offline_msg, {us, timestamp, expire, from, to, packet}).
 -record(last_activity, {us, timestamp, status}).
@@ -307,6 +309,52 @@ export_muc_registered(Server, Output) ->
               end
       end).
 
+export_privacy(Server, Output) ->
+    case ejabberd_odbc:sql_query(
+           jlib:nameprep(Server),
+           ["select id from privacy_list order by id desc limit 1;"]) of
+        {selected, ["id"], [{I}]} ->
+            put(id, list_to_integer(I));
+        _ ->
+            put(id, 0)
+    end,
+    export_common(
+      Server, privacy, Output,
+      fun(Host, #privacy{us = {LUser, LServer},
+                         lists = Lists,
+                         default = Default}) when LServer == Host ->
+              Username = ejabberd_odbc:escape(LUser),
+              if Default /= none ->
+                      SDefault = ejabberd_odbc:escape(Default),
+                      ["delete from privacy_default_list where ",
+                       "username='", Username, "';",
+                       "insert into privacy_default_list(username, name) ",
+                       "values ('", Username, "', '", SDefault, "');"];
+                 true ->
+                      []
+              end ++
+                  lists:flatmap(
+                    fun({Name, List}) ->
+                            SName = ejabberd_odbc:escape(Name),
+                            RItems = lists:map(
+                                       fun mod_privacy_odbc:item_to_raw/1,
+                                       List),
+                            ID = integer_to_list(get_id()),
+                            ["delete from privacy_list "
+                             "where username='", Username, "' and name='", SName, "';"
+                             "insert into privacy_list(username, name, id) "
+                             "values ('", Username, "', '", SName, "', '", ID, "');",
+                             "delete from privacy_list_data where id='", ID, "';"
+                             |[["insert into privacy_list_data("
+                                "id, t, value, action, ord, match_all, match_iq, "
+                                "match_message, match_presence_in, "
+                                "match_presence_out) values ('", ID, "', '",
+                                string:join(Items, "', '"), "');"] || Items <- RItems]]
+                    end, Lists);
+         (_Host, _R) ->
+              []
+      end).
+
 %%%----------------------------------------------------------------------
 %%% Internal functions
 %%%----------------------------------------------------------------------
@@ -405,3 +453,8 @@ groups_to_string(#roster{usj = {User, _Server, JID},
       "'", Username, "',"
       "'", SJID, "',"
       "'", ejabberd_odbc:escape(Group), "')"] || Group <- Groups].
+
+get_id() ->
+    ID = get(id),
+    put(id, ID+1),
+    ID+1.
index 553264cf369e97239639853e9df5e9154336f42c..432617ebe066ed36be4eca4ed03633c7d86a89d6 100644 (file)
@@ -36,6 +36,7 @@
         get_user_list/3,
         check_packet/6,
         remove_user/2,
+         item_to_raw/1,
         updated_list/3]).
 
 -include("ejabberd.hrl").