]> granicus.if.org Git - ejabberd/commitdiff
Update more SQL queries
authorAlexey Shchepin <alexey@process-one.net>
Fri, 26 Feb 2016 12:45:28 +0000 (15:45 +0300)
committerAlexey Shchepin <alexey@process-one.net>
Tue, 1 Mar 2016 21:12:49 +0000 (00:12 +0300)
src/ejabberd_odbc.erl
src/mod_roster.erl
src/mod_vcard.erl
src/odbc_queries.erl

index 6f7ce4c8ba023b9c979d9f0271b88f7bb6b172bd..f756fdeb1ecbe83b74affa76d9261c93bd464b1c 100644 (file)
@@ -121,7 +121,8 @@ start_link(Host, StartInterval) ->
                          [Host, StartInterval],
                          fsm_limit_opts() ++ (?FSMOPTS)).
 
--type sql_query() :: [sql_query() | binary()] | #sql_query{}.
+-type sql_query() :: [sql_query() | binary()] | #sql_query{} |
+                     fun(() -> any()) | fun((atom(), _) -> any()).
 -type sql_query_result() :: {updated, non_neg_integer()} |
                             {error, binary()} |
                             {selected, [binary()],
index 1e5e3b70c22ec61aff484eabb6fe4ea8a9d3dd56..79655af8ad34ed34805c64e8747a51e900ed279f 100644 (file)
@@ -694,12 +694,9 @@ roster_subscribe_t(LUser, LServer, LJID, Item) ->
 roster_subscribe_t(_LUser, _LServer, _LJID, Item,
                   mnesia) ->
     mnesia:write(Item);
-roster_subscribe_t(LUser, LServer, LJID, Item, odbc) ->
-    ItemVals = record_to_string(Item),
-    Username = ejabberd_odbc:escape(LUser),
-    SJID = ejabberd_odbc:escape(jid:to_string(LJID)),
-    odbc_queries:roster_subscribe(LServer, Username, SJID,
-                                 ItemVals);
+roster_subscribe_t(_LUser, _LServer, _LJID, Item, odbc) ->
+    ItemVals = record_to_row(Item),
+    odbc_queries:roster_subscribe(ItemVals);
 roster_subscribe_t(LUser, LServer, _LJID, Item, riak) ->
     ejabberd_riak:put(Item, roster_schema(),
                       [{'2i', [{<<"us">>, {LUser, LServer}}]}]).
@@ -1034,11 +1031,10 @@ update_roster_t(_LUser, _LServer, _LJID, Item,
                mnesia) ->
     mnesia:write(Item);
 update_roster_t(LUser, LServer, LJID, Item, odbc) ->
-    Username = ejabberd_odbc:escape(LUser),
-    SJID = ejabberd_odbc:escape(jid:to_string(LJID)),
-    ItemVals = record_to_string(Item),
-    ItemGroups = groups_to_string(Item),
-    odbc_queries:update_roster(LServer, Username, SJID, ItemVals,
+    SJID = jid:to_string(LJID),
+    ItemVals = record_to_row(Item),
+    ItemGroups = Item#roster.groups,
+    odbc_queries:update_roster(LServer, LUser, SJID, ItemVals,
                                ItemGroups);
 update_roster_t(LUser, LServer, _LJID, Item, riak) ->
     ejabberd_riak:put(Item, roster_schema(),
@@ -1051,9 +1047,8 @@ del_roster_t(LUser, LServer, LJID) ->
 del_roster_t(LUser, LServer, LJID, mnesia) ->
     mnesia:delete({roster, {LUser, LServer, LJID}});
 del_roster_t(LUser, LServer, LJID, odbc) ->
-    Username = ejabberd_odbc:escape(LUser),
-    SJID = ejabberd_odbc:escape(jid:to_string(LJID)),
-    odbc_queries:del_roster(LServer, Username, SJID);
+    SJID = jid:to_string(LJID),
+    odbc_queries:del_roster(LServer, LUser, SJID);
 del_roster_t(LUser, LServer, LJID, riak) ->
     ejabberd_riak:delete(roster, {LUser, LServer, LJID}).
 
@@ -1319,6 +1314,27 @@ record_to_string(#roster{us = {User, _Server},
     [Username, SJID, Nick, SSubscription, SAsk, SAskMessage,
      <<"N">>, <<"">>, <<"item">>].
 
+record_to_row(
+  #roster{us = {LUser, _LServer},
+          jid = JID, name = Name, subscription = Subscription,
+          ask = Ask, askmessage = AskMessage}) ->
+    SJID = jid:to_string(jid:tolower(JID)),
+    SSubscription = case Subscription of
+                     both -> <<"B">>;
+                     to -> <<"T">>;
+                     from -> <<"F">>;
+                     none -> <<"N">>
+                   end,
+    SAsk = case Ask of
+            subscribe -> <<"S">>;
+            unsubscribe -> <<"U">>;
+            both -> <<"B">>;
+            out -> <<"O">>;
+            in -> <<"I">>;
+            none -> <<"N">>
+          end,
+    {LUser, SJID, Name, SSubscription, SAsk, AskMessage}.
+
 groups_to_string(#roster{us = {User, _Server},
                         jid = JID, groups = Groups}) ->
     Username = ejabberd_odbc:escape(User),
index b9b207a7d4f535cb1f891abb891c9b0dea7b8d31..3652fb2af074280fe378d55ebaa4adb6086c69b2 100644 (file)
@@ -25,6 +25,8 @@
 
 -module(mod_vcard).
 
+-compile([{parse_transform, ejabberd_sql_pt}]).
+
 -author('alexey@process-one.net').
 
 -protocol({xep, 54, '1.2'}).
@@ -39,6 +41,7 @@
 
 -include("ejabberd.hrl").
 -include("logger.hrl").
+-include("ejabberd_sql_pt.hrl").
 
 -include("jlib.hrl").
 
@@ -212,14 +215,13 @@ get_vcard(LUser, LServer, mnesia) ->
       {aborted, _Reason} -> error
     end;
 get_vcard(LUser, LServer, odbc) ->
-    Username = ejabberd_odbc:escape(LUser),
-    case catch odbc_queries:get_vcard(LServer, Username) of
-      {selected, [<<"vcard">>], [[SVCARD]]} ->
+    case catch odbc_queries:get_vcard(LServer, LUser) of
+      {selected, [{SVCARD}]} ->
          case fxml_stream:parse_element(SVCARD) of
            {error, _Reason} -> error;
            VCARD -> [VCARD]
          end;
-      {selected, [<<"vcard">>], []} -> [];
+      {selected, []} -> [];
       _ -> error
     end;
 get_vcard(LUser, LServer, riak) ->
@@ -336,39 +338,14 @@ set_vcard(User, LServer, VCARD) ->
                                             {<<"orgunit">>, OrgUnit},
                                             {<<"lorgunit">>, LOrgUnit}]}]);
             odbc ->
-                Username = ejabberd_odbc:escape(User),
-                LUsername = ejabberd_odbc:escape(LUser),
-                SVCARD =
-                    ejabberd_odbc:escape(fxml:element_to_binary(VCARD)),
-                SFN = ejabberd_odbc:escape(FN),
-                SLFN = ejabberd_odbc:escape(LFN),
-                SFamily = ejabberd_odbc:escape(Family),
-                SLFamily = ejabberd_odbc:escape(LFamily),
-                SGiven = ejabberd_odbc:escape(Given),
-                SLGiven = ejabberd_odbc:escape(LGiven),
-                SMiddle = ejabberd_odbc:escape(Middle),
-                SLMiddle = ejabberd_odbc:escape(LMiddle),
-                SNickname = ejabberd_odbc:escape(Nickname),
-                SLNickname = ejabberd_odbc:escape(LNickname),
-                SBDay = ejabberd_odbc:escape(BDay),
-                SLBDay = ejabberd_odbc:escape(LBDay),
-                SCTRY = ejabberd_odbc:escape(CTRY),
-                SLCTRY = ejabberd_odbc:escape(LCTRY),
-                SLocality = ejabberd_odbc:escape(Locality),
-                SLLocality = ejabberd_odbc:escape(LLocality),
-                SEMail = ejabberd_odbc:escape(EMail),
-                SLEMail = ejabberd_odbc:escape(LEMail),
-                SOrgName = ejabberd_odbc:escape(OrgName),
-                SLOrgName = ejabberd_odbc:escape(LOrgName),
-                SOrgUnit = ejabberd_odbc:escape(OrgUnit),
-                SLOrgUnit = ejabberd_odbc:escape(LOrgUnit),
-                odbc_queries:set_vcard(LServer, LUsername, SBDay, SCTRY,
-                                       SEMail, SFN, SFamily, SGiven, SLBDay,
-                                       SLCTRY, SLEMail, SLFN, SLFamily,
-                                       SLGiven, SLLocality, SLMiddle,
-                                       SLNickname, SLOrgName, SLOrgUnit,
-                                       SLocality, SMiddle, SNickname, SOrgName,
-                                       SOrgUnit, SVCARD, Username)
+                SVCARD = fxml:element_to_binary(VCARD),
+                odbc_queries:set_vcard(LServer, LUser, BDay, CTRY,
+                                       EMail, FN, Family, Given, LBDay,
+                                       LCTRY, LEMail, LFN, LFamily,
+                                       LGiven, LLocality, LMiddle,
+                                       LNickname, LOrgName, LOrgUnit,
+                                       Locality, Middle, Nickname, OrgName,
+                                       OrgUnit, SVCARD, User)
           end,
           ejabberd_hooks:run(vcard_set, LServer,
                              [LUser, LServer, VCARD])
@@ -929,12 +906,14 @@ remove_user(LUser, LServer, mnesia) ->
        end,
     mnesia:transaction(F);
 remove_user(LUser, LServer, odbc) ->
-    Username = ejabberd_odbc:escape(LUser),
-    ejabberd_odbc:sql_transaction(LServer,
-                                 [[<<"delete from vcard where username='">>,
-                                   Username, <<"';">>],
-                                  [<<"delete from vcard_search where lusername='">>,
-                                   Username, <<"';">>]]);
+    ejabberd_odbc:sql_transaction(
+      LServer,
+      fun() ->
+              ejabberd_odbc:sql_query_t(
+                ?SQL("delete from vcard where username=%(LUser)s")),
+              ejabberd_odbc:sql_query_t(
+                ?SQL("delete from vcard_search where lusername=%(LUser)s"))
+      end);
 remove_user(LUser, LServer, riak) ->
     {atomic, ejabberd_riak:delete(vcard, {LUser, LServer})}.
 
index 44e2dbfb092bceae671fa6930e7dfeb0f1ecb671..c12931c6e06e4e7608f470905d8018b1ee80e828 100644 (file)
@@ -42,7 +42,7 @@
         get_roster_groups/3, del_user_roster_t/2,
         get_roster_by_jid/3, get_rostergroup_by_jid/3,
         del_roster/3, del_roster_sql/2, update_roster/5,
-        update_roster_sql/4, roster_subscribe/4,
+        update_roster_sql/4, roster_subscribe/1,
         get_subscription/3, set_private_data/4,
         set_private_data_sql/3, get_private_data/3,
         get_private_data/2, del_user_private_storage/2,
@@ -339,15 +339,13 @@ get_rostergroup_by_jid(LServer, LUser, SJID) ->
       ?SQL("select @(grp)s from rostergroups"
            " where username=%(LUser)s and jid=%(SJID)s")).
 
-del_roster(_LServer, Username, SJID) ->
-    ejabberd_odbc:sql_query_t([<<"delete from rosterusers       where "
-                                "username='">>,
-                              Username, <<"'         and jid='">>, SJID,
-                              <<"';">>]),
-    ejabberd_odbc:sql_query_t([<<"delete from rostergroups       where "
-                                "username='">>,
-                              Username, <<"'         and jid='">>, SJID,
-                              <<"';">>]).
+del_roster(_LServer, LUser, SJID) ->
+    ejabberd_odbc:sql_query_t(
+      ?SQL("delete from rosterusers"
+           " where username=%(LUser)s and jid=%(SJID)s")),
+    ejabberd_odbc:sql_query_t(
+      ?SQL("delete from rostergroups"
+           " where username=%(LUser)s and jid=%(SJID)s")).
 
 del_roster_sql(Username, SJID) ->
     [[<<"delete from rosterusers       where "
@@ -357,27 +355,19 @@ del_roster_sql(Username, SJID) ->
        "username='">>,
       Username, <<"'         and jid='">>, SJID, <<"';">>]].
 
-update_roster(_LServer, Username, SJID, ItemVals,
+update_roster(_LServer, LUser, SJID, ItemVals,
              ItemGroups) ->
-    update_t(<<"rosterusers">>,
-            [<<"username">>, <<"jid">>, <<"nick">>,
-             <<"subscription">>, <<"ask">>, <<"askmessage">>,
-             <<"server">>, <<"subscribe">>, <<"type">>],
-            ItemVals,
-            [<<"username='">>, Username, <<"' and jid='">>, SJID,
-             <<"'">>]),
-    ejabberd_odbc:sql_query_t([<<"delete from rostergroups       where "
-                                "username='">>,
-                              Username, <<"'         and jid='">>, SJID,
-                              <<"';">>]),
-    lists:foreach(fun (ItemGroup) ->
-                         ejabberd_odbc:sql_query_t([<<"insert into rostergroups(           "
-                                                      "   username, jid, grp)  values ('">>,
-                                                    join(ItemGroup,
-                                                         <<"', '">>),
-                                                    <<"');">>])
-                 end,
-                 ItemGroups).
+    roster_subscribe(ItemVals),
+    ejabberd_odbc:sql_query_t(
+      ?SQL("delete from rostergroups"
+           " where username=%(LUser)s and jid=%(SJID)s")),
+    lists:foreach(
+      fun(ItemGroup) ->
+              ejabberd_odbc:sql_query_t(
+                ?SQL("insert into rostergroups(username, jid, grp) "
+                     "values (%(LUser)s, %(SJID)s, %(ItemGroup)s)"))
+      end,
+      ItemGroups).
 
 update_roster_sql(Username, SJID, ItemVals,
                  ItemGroups) ->
@@ -399,14 +389,18 @@ update_roster_sql(Username, SJID, ItemVals,
        join(ItemGroup, <<"', '">>), <<"');">>]
        || ItemGroup <- ItemGroups].
 
-roster_subscribe(_LServer, Username, SJID, ItemVals) ->
-    update_t(<<"rosterusers">>,
-            [<<"username">>, <<"jid">>, <<"nick">>,
-             <<"subscription">>, <<"ask">>, <<"askmessage">>,
-             <<"server">>, <<"subscribe">>, <<"type">>],
-            ItemVals,
-            [<<"username='">>, Username, <<"' and jid='">>, SJID,
-             <<"'">>]).
+roster_subscribe({LUser, SJID, Name, SSubscription, SAsk, AskMessage}) ->
+    ?SQL_UPSERT_T(
+       "rosterusers",
+       ["!username=%(LUser)s",
+        "!jid=%(SJID)s",
+        "nick=%(Name)s",
+        "subscription=%(SSubscription)s",
+        "ask=%(SAsk)s",
+        "askmessage=%(AskMessage)s",
+        "server='N'",
+        "subscribe=''",
+        "type='item'"]).
 
 get_subscription(LServer, LUser, SJID) ->
     ejabberd_odbc:sql_query(
@@ -447,53 +441,48 @@ del_user_private_storage(LServer, LUser) ->
       ?SQL("delete from private_storage"
            " where username=%(LUser)s")).
 
-set_vcard(LServer, LUsername, SBDay, SCTRY, SEMail, SFN,
-         SFamily, SGiven, SLBDay, SLCTRY, SLEMail, SLFN,
-         SLFamily, SLGiven, SLLocality, SLMiddle, SLNickname,
-         SLOrgName, SLOrgUnit, SLocality, SMiddle, SNickname,
-         SOrgName, SOrgUnit, SVCARD, Username) ->
-    ejabberd_odbc:sql_transaction(LServer,
-                                 fun () ->
-                                         update_t(<<"vcard">>,
-                                                  [<<"username">>,
-                                                   <<"vcard">>],
-                                                  [LUsername, SVCARD],
-                                                  [<<"username='">>, LUsername,
-                                                   <<"'">>]),
-                                         update_t(<<"vcard_search">>,
-                                                  [<<"username">>,
-                                                   <<"lusername">>, <<"fn">>,
-                                                   <<"lfn">>, <<"family">>,
-                                                   <<"lfamily">>, <<"given">>,
-                                                   <<"lgiven">>, <<"middle">>,
-                                                   <<"lmiddle">>,
-                                                   <<"nickname">>,
-                                                   <<"lnickname">>, <<"bday">>,
-                                                   <<"lbday">>, <<"ctry">>,
-                                                   <<"lctry">>, <<"locality">>,
-                                                   <<"llocality">>,
-                                                   <<"email">>, <<"lemail">>,
-                                                   <<"orgname">>,
-                                                   <<"lorgname">>,
-                                                   <<"orgunit">>,
-                                                   <<"lorgunit">>],
-                                                  [Username, LUsername, SFN,
-                                                   SLFN, SFamily, SLFamily,
-                                                   SGiven, SLGiven, SMiddle,
-                                                   SLMiddle, SNickname,
-                                                   SLNickname, SBDay, SLBDay,
-                                                   SCTRY, SLCTRY, SLocality,
-                                                   SLLocality, SEMail, SLEMail,
-                                                   SOrgName, SLOrgName,
-                                                   SOrgUnit, SLOrgUnit],
-                                                  [<<"lusername='">>,
-                                                   LUsername, <<"'">>])
-                                 end).
-
-get_vcard(LServer, Username) ->
-    ejabberd_odbc:sql_query(LServer,
-                           [<<"select vcard from vcard where username='">>,
-                            Username, <<"';">>]).
+set_vcard(LServer, LUser, BDay, CTRY, EMail, FN,
+         Family, Given, LBDay, LCTRY, LEMail, LFN,
+         LFamily, LGiven, LLocality, LMiddle, LNickname,
+         LOrgName, LOrgUnit, Locality, Middle, Nickname,
+         OrgName, OrgUnit, SVCARD, User) ->
+    ejabberd_odbc:sql_transaction(
+      LServer,
+      fun() ->
+              ?SQL_UPSERT(LServer, "vcard",
+                          ["!username=%(LUser)s",
+                           "vcard=%(SVCARD)s"]),
+              ?SQL_UPSERT(LServer, "vcard_search",
+                          ["username=%(User)s",
+                           "!lusername=%(LUser)s",
+                           "fn=%(FN)s",
+                           "lfn=%(LFN)s",
+                           "family=%(Family)s",
+                           "lfamily=%(LFamily)s",
+                           "given=%(Given)s",
+                           "lgiven=%(LGiven)s",
+                           "middle=%(Middle)s",
+                           "lmiddle=%(LMiddle)s",
+                           "nickname=%(Nickname)s",
+                           "lnickname=%(LNickname)s",
+                           "bday=%(BDay)s",
+                           "lbday=%(LBDay)s",
+                           "ctry=%(CTRY)s",
+                           "lctry=%(LCTRY)s",
+                           "locality=%(Locality)s",
+                           "llocality=%(LLocality)s",
+                           "email=%(EMail)s",
+                           "lemail=%(LEMail)s",
+                           "orgname=%(OrgName)s",
+                           "lorgname=%(LOrgName)s",
+                           "orgunit=%(OrgUnit)s",
+                           "lorgunit=%(LOrgUnit)s"])
+      end).
+
+get_vcard(LServer, LUser) ->
+    ejabberd_odbc:sql_query(
+      LServer,
+      ?SQL("select @(vcard)s from vcard where username=%(LUser)s")).
 
 get_default_privacy_list(LServer, LUser) ->
     ejabberd_odbc:sql_query(