]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_private_odbc.erl: Support for MySQL and MSSQL.
authorMickaël Rémond <mickael.remond@process-one.net>
Sun, 5 Nov 2006 15:51:26 +0000 (15:51 +0000)
committerMickaël Rémond <mickael.remond@process-one.net>
Sun, 5 Nov 2006 15:51:26 +0000 (15:51 +0000)
* src/odbc/odbc_queries.erl: Likewise.
* src/odbc/mysql.sql: Likewise.
* src/odbc/mssql.sql: Likewise.

SVN Revision: 674

ChangeLog
src/mod_private_odbc.erl
src/odbc/mssql.sql
src/odbc/mysql.sql
src/odbc/odbc_queries.erl

index e6fe10bfc1ccc3e314ccc4554923f95033254438..c823aad78999fe84470a0190f99a5a5a1de655a3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-11-05  Mickael Remond  <mickael.remond@process-one.net>
+
+       * src/mod_private_odbc.erl: Support for MySQL and MSSQL.
+       * src/odbc/odbc_queries.erl: Likewise.
+       * src/odbc/mysql.sql: Likewise.
+       * src/odbc/mssql.sql: Likewise.
+
 2006-11-04  Mickael Remond  <mickael.remond@process-one.net>
 
        * src/eldap_utils.erl: Fixed missing export.
index d6f5805a47110aa43cbfa0c0f8c542bd9d076b95..45e07233acb7517b3f864b59534ec223f2df401a 100644 (file)
@@ -46,7 +46,7 @@ process_sm_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
                                          set_data(LUser, LServer, El)
                                  end, Els)
                        end,
-                   ejabberd_odbc:sql_transaction(LServer, F),
+                   odbc_queries:sql_transaction(LServer, F),
                    IQ#iq{type = result,
                          sub_el = [{xmlelement, Name, Attrs, []}]};
                get ->
@@ -64,7 +64,7 @@ process_sm_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
            IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
     end.
 
-set_data(LUser, _LServer, El) ->
+set_data(LUser, LServer, El) ->
     case El of
        {xmlelement, _Name, Attrs, _Els} ->
            XMLNS = xml:get_attr_s("xmlns", Attrs),
@@ -76,14 +76,7 @@ set_data(LUser, _LServer, El) ->
                    LXMLNS = ejabberd_odbc:escape(XMLNS),
                    SData = ejabberd_odbc:escape(
                               lists:flatten(xml:element_to_string(El))),
-                   ejabberd_odbc:sql_query_t(
-                     ["delete from private_storage "
-                      "where username='", Username, "' and "
-                      "namespace='", LXMLNS, "';"]),
-                   ejabberd_odbc:sql_query_t(
-                     ["insert into private_storage(username, namespace, data) "
-                      "values ('", Username, "', '", LXMLNS, "', "
-                      "'", SData, "');"])
+                       odbc_queries:set_private_data(LServer, Username, LXMLNS, SData)
            end;
        _ ->
            ignore
@@ -100,17 +93,14 @@ get_data(LUser, LServer, [El | Els], Res) ->
            XMLNS = xml:get_attr_s("xmlns", Attrs),
            Username = ejabberd_odbc:escape(LUser),
            LXMLNS = ejabberd_odbc:escape(XMLNS),
-           case catch ejabberd_odbc:sql_query(
-                        LServer,
-                        ["select data from private_storage "
-                         "where username='", Username, "' and "
-                         "namespace='", LXMLNS, "';"]) of
+           case catch odbc_queries:get_private_data(LServer, Username, LXMLNS) of
                {selected, ["data"], [{SData}]} ->
                    case xml_stream:parse_element(SData) of
                        Data when element(1, Data) == xmlelement ->
                            get_data(LUser, LServer, Els,
                                     [Data | Res])
                    end;
+               %% MREMOND: I wonder when the query could return a vcard ?
                {selected, ["vcard"], []} ->
                    get_data(LUser, LServer, Els,
                             [El | Res])
@@ -124,8 +114,4 @@ remove_user(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
     Username = ejabberd_odbc:escape(LUser),
-    ejabberd_odbc:sql_transaction(
-      LServer,
-      ["delete from private_storage where username='", Username, "';"]).
-
-
+    odbc_queries:del_user_private_storage(LServer, Username).
index c92fa776c3a80f688fa3f561449c42d32744093b..00ad9db4555412be57c4b142049d45202ac6d599 100644 (file)
@@ -84,6 +84,10 @@ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[vcard]') a
 drop table [dbo].[vcard]\r
 GO\r
 \r
+if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[private_storage]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)\r
+drop table [dbo].[private_storage]\r
+GO\r
+\r
 CREATE TABLE [dbo].[last] (\r
        [username] [varchar] (250) NOT NULL ,\r
        [seconds] [varchar] (50) NOT NULL ,\r
@@ -151,6 +155,13 @@ CREATE TABLE [dbo].[vcard] (
 ) ON [PRIMARY]\r
 GO\r
 \r
+CREATE TABLE [dbo].[private_storage] (\r
+    [username] [varchar] (250) NOT NULL ,\r
+    [namespace] [varchar] (250) NOT NULL ,\r
+    [data] [text] NOT NULL\r
+) ON [PRIMARY]\r
+GO\r
+\r
 ALTER TABLE [dbo].[last] WITH NOCHECK ADD \r
        CONSTRAINT [PK_last] PRIMARY KEY  CLUSTERED \r
        (\r
@@ -227,6 +238,12 @@ GO
  CREATE  INDEX [IK_Spool_Created] ON [dbo].[spool]([created]) WITH  FILLFACTOR = 90 ON [PRIMARY]\r
 GO\r
 \r
+ CREATE  INDEX [IX_private_user] ON [dbo].[private_storage]([username]) WITH  FILLFACTOR = 90 ON [PRIMARY]\r
+GO\r
+ CREATE  INDEX [IX_private_user_ns] ON [dbo].[private_storage]([username], [namespace]) WITH  FILLFACTOR = 90 ON [PRIMARY]\r
+GO\r
+\r
+\r
 /*********************************************************/\r
 /** These store procedures are for use with ejabberd    **/\r
 /** 1.1 and Microsoft Sql Server 2000                   **/\r
@@ -484,6 +501,7 @@ BEGIN
     END\r
 END\r
 GO\r
+\r
 /******************************************************************/\r
 /****** Object:  StoredProcedure [dbo].[get_password]            **/\r
 /** Retrive the user password                                    **/\r
@@ -557,7 +575,6 @@ BEGIN
     DELETE FROM rostergroups \r
     WITH (ROWLOCK)\r
     WHERE (rostergroups.username = @Username) AND (rostergroups.jid = @JID);\r
-\r
   COMMIT\r
 END\r
 GO\r
@@ -627,7 +644,6 @@ BEGIN
     DELETE FROM rostergroups \r
     WITH (ROWLOCK)\r
     WHERE rostergroups.username = @Username;\r
-\r
   COMMIT\r
 END\r
 GO\r
@@ -682,7 +698,7 @@ GO
 /** Retrive the user roster                                      **/\r
 /******************************************************************/\r
 CREATE PROCEDURE [dbo].[get_roster]\r
-  @Username varchar(200)\r
+  @Username varchar(250)\r
 AS\r
 DECLARE\r
   @vRosterusers table( username      varchar(1), \r
@@ -855,7 +871,7 @@ GO
 \r
 /******************************************************************/\r
 /****** Object:  StoredProcedure [dbo].[list_users]              **/\r
-/** Retrive a list of all users                                  **/\r
+/** Retrieve a list of all users                                 **/\r
 /******************************************************************/\r
 CREATE PROCEDURE [dbo].[list_users]\r
 AS\r
@@ -897,3 +913,76 @@ BEGIN
     END\r
 END\r
 GO\r
+\r
+/******************************************************************/\r
+/****** Object:  StoredProcedure [dbo].[set_private_data]        **/\r
+/** store user private data by namespace                         **/\r
+/******************************************************************/\r
+CREATE PROCEDURE [dbo].[set_private_data]\r
+    @Username  varchar(250),\r
+    @Namespace varchar(250),\r
+    @Data varchar(8000)\r
+AS\r
+BEGIN\r
+  IF EXISTS (SELECT username FROM private_storage with (nolock) WHERE private_storage.username = @Username AND private_storage.namespace = @Namespace)\r
+    BEGIN\r
+        UPDATE [private_storage]\r
+        SET [private_storage].username = @Username,\r
+            [private_storage].namespace = @Namespace,\r
+            [private_storage].data = @Data\r
+            WHERE private_storage.username = @Username AND private_storage.namespace = @Namespace;\r
+    END\r
+  ELSE\r
+    BEGIN\r
+        INSERT INTO [private_storage]\r
+            ( [private_storage].username,\r
+              [private_storage].namespace,\r
+              [private_storage].data\r
+            )\r
+        VALUES\r
+            ( @Username,\r
+              @Namespace,\r
+              @Data\r
+            )\r
+    END\r
+END\r
+GO\r
+\r
+ejabberd_odbc:sql_query_t(\r
+  ["delete from private_storage "\r
+ "where username='", Username, "' and "\r
+         "namespace='", LXMLNS, "';"]),\r
+      ejabberd_odbc:sql_query_t(\r
+        ["insert into private_storage(username, namespace, data) "\r
+         "values ('", Username, "', '", LXMLNS, "', "\r
+         "'", SData, "');"]).\r
+\r
+/******************************************************************/\r
+/****** Object:  StoredProcedure [dbo].[get_private_data]        **/\r
+/** Retrieve user private data by namespace                      **/\r
+/******************************************************************/\r
+CREATE PROCEDURE [dbo].[get_private_data]\r
+    @Username  varchar(250),\r
+    @Namespace varchar(250)\r
+AS\r
+BEGIN\r
+  SELECT private_storage.data AS data\r
+  FROM private_storage WITH (NOLOCK)\r
+  WHERE username=@Username and namespace=@Namespace;\r
+END\r
+GO\r
+\r
+/***************************************************************/\r
+/****** Object:  StoredProcedure [dbo].[del_user_storage] ******/\r
+/** Delete private storage area for a given user              **/\r
+/***************************************************************/\r
+CREATE PROCEDURE [dbo].[del_user_storage]\r
+  @Username  varchar(250)\r
+AS\r
+BEGIN\r
+  DELETE FROM [private_storage]\r
+  WITH (ROWLOCK)\r
+  WHERE [private_storage].username=@Username;\r
+END\r
+GO\r
+\r
index 2394f9901fbb9ef58f1f22c005106f0c797b42d7..607a7407f4a522191df9b3d9edf1626e1b563303 100644 (file)
@@ -93,6 +93,15 @@ CREATE INDEX i_vcard_search_lemail    ON vcard_search(lemail);
 CREATE INDEX i_vcard_search_lorgname  ON vcard_search(lorgname);
 CREATE INDEX i_vcard_search_lorgunit  ON vcard_search(lorgunit);
 
+CREATE TABLE private_storage (
+    username varchar(250) NOT NULL,
+    namespace varchar(250) NOT NULL,
+    data text NOT NULL
+) CHARACTER SET utf8;
+
+CREATE INDEX i_private_storage_username USING BTREE ON private_storage(username);
+CREATE UNIQUE INDEX i_private_storage_username_namespace USING BTREE ON private_storage(username, namespace);
+
 --- To update from 1.x:
 -- ALTER TABLE rosterusers ADD COLUMN askmessage text AFTER ask;
 -- UPDATE rosterusers SET askmessage = '';
index 7732e62a7cee43c7b68cb0b430f81922053c7194..d91a007debd592a4494fa9348d6009e1022b2165 100644 (file)
@@ -31,6 +31,9 @@
         update_roster_sql/4,
         roster_subscribe/4,
         get_subscription/3,
+        set_private_data/4,
+        get_private_data/3,
+        del_user_private_storage/2,
         escape/1]).
 
 %-define(generic, true).
@@ -250,6 +253,28 @@ get_subscription(LServer, Username, SJID) ->
        "where username='", Username, "' "
        "and jid='", SJID, "'"]).
 
+set_private_data(_LServer, Username, LXMLNS, SData) ->
+    ejabberd_odbc:sql_query_t(
+      ["delete from private_storage "
+       "where username='", Username, "' and "
+       "namespace='", LXMLNS, "';"]),
+    ejabberd_odbc:sql_query_t(
+      ["insert into private_storage(username, namespace, data) "
+       "values ('", Username, "', '", LXMLNS, "', "
+       "'", SData, "');"]).
+                                      
+get_private_data(LServer, Username, LXMLNS) ->
+    ejabberd_odbc:sql_query(
+                LServer,
+                ["select data from private_storage "
+                 "where username='", Username, "' and "
+                 "namespace='", LXMLNS, "';"]).
+
+del_user_private_storage(LServer, Username) ->
+    ejabberd_odbc:sql_transaction(
+      LServer,
+      ["delete from private_storage where username='", Username, "';"]).
+
 %% Characters to escape
 escape($\0) -> "\\0";
 escape($\n) -> "\\n";
@@ -422,6 +447,21 @@ get_subscription(LServer, Username, SJID) ->
     ejabberd_odbc:sql_query(
       LServer,
       ["EXECUTE dbo.get_subscription '", Username, "' , '", SJID, "'"]).
+      
+set_private_data(_LServer, Username, LXMLNS, SData) ->
+    ejabberd_odbc:sql_query(
+           LServer,
+           ["EXECUTE dbo.set_private_data '", Username, "' , '", LXMLNS, "' , '", SData, "'"]).
+           
+get_private_data(LServer, Username, LXMLNS) ->
+    ejabberd_odbc:sql_query(
+        LServer,
+        ["EXECUTE dbo.get_private_data '", Username, "' , '", LXMLNS, "'"]).
+
+del_user_private_storage(LServer, Username) ->
+    ejabberd_odbc:sql_query(
+        LServer,
+        ["EXECUTE dbo.del_user_storage '", Username, "'"]).
 
 %% Characters to escape
 escape($\0) -> "\\0";