From 00ccb119eacc729c5bb622d6adbfb1a2cd00e415 Mon Sep 17 00:00:00 2001 From: Christoph Scholz Date: Fri, 27 Dec 2019 13:05:18 +0100 Subject: [PATCH] allow storage of emojis in archive on mssql --- sql/mssql.sql | 4 +- src/mod_mam_sql.erl | 93 +++++++++++++++++++++++++++++++-------------- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/sql/mssql.sql b/sql/mssql.sql index 7c3713b76..7aca5933b 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -26,8 +26,8 @@ CREATE TABLE [dbo].[archive] ( [timestamp] [bigint] NOT NULL, [peer] [varchar] (250) NOT NULL, [bare_peer] [varchar] (250) NOT NULL, - [xml] [text] NOT NULL, - [txt] [text] NULL, + [xml] [ntext] NOT NULL, + [txt] [ntext] NULL, [id] [bigint] IDENTITY(1,1) NOT NULL, [kind] [varchar] (10) NULL, [nick] [varchar] (250) NULL, diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 654e1f42f..676d622e1 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -105,6 +105,7 @@ store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir, TS) -> jid:tolower(Peer)), Body = fxml:get_subtag_cdata(Pkt, <<"body">>), SType = misc:atom_to_binary(Type), + SqlType = ejabberd_option:sql_type(LHost), XML = case mod_mam_opt:compress_xml(LServer) of true -> J1 = case Type of @@ -115,24 +116,44 @@ store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir, TS) -> _ -> fxml:element_to_binary(Pkt) end, - case ejabberd_sql:sql_query( - LServer, - ?SQL_INSERT( - "archive", - ["username=%(SUser)s", - "server_host=%(LServer)s", - "timestamp=%(TS)d", - "peer=%(LPeer)s", - "bare_peer=%(BarePeer)s", - "xml=%(XML)s", - "txt=%(Body)s", - "kind=%(SType)s", - "nick=%(Nick)s"])) of - {updated, _} -> - ok; - Err -> - Err - end. + case SqlType of + mssql -> case ejabberd_sql:sql_query( + LServer, + ?SQL_INSERT( + "archive", + ["username=%(SUser)s", + "server_host=%(LServer)s", + "timestamp=%(TS)d", + "peer=%(LPeer)s", + "bare_peer=%(BarePeer)s", + "xml=N%(XML)s", + "txt=N%(Body)s", + "kind=%(SType)s", + "nick=%(Nick)s"])) of + {updated, _} -> + ok; + Err -> + Err + end; + _ -> case ejabberd_sql:sql_query( + LServer, + ?SQL_INSERT( + "archive", + ["username=%(SUser)s", + "server_host=%(LServer)s", + "timestamp=%(TS)d", + "peer=%(LPeer)s", + "bare_peer=%(BarePeer)s", + "xml=%(XML)s", + "txt=%(Body)s", + "kind=%(SType)s", + "nick=%(Nick)s"])) of + {updated, _} -> + ok; + Err -> + Err + end + end. write_prefs(LUser, _LServer, #archive_prefs{default = Default, never = Never, @@ -304,17 +325,31 @@ export(_Server) -> XML = fxml:element_to_binary(Pkt), Body = fxml:get_subtag_cdata(Pkt, <<"body">>), SType = misc:atom_to_binary(Type), - [?SQL_INSERT( - "archive", - ["username=%(SUser)s", - "server_host=%(LServer)s", - "timestamp=%(TStmp)d", - "peer=%(LPeer)s", - "bare_peer=%(BarePeer)s", - "xml=%(XML)s", - "txt=%(Body)s", - "kind=%(SType)s", - "nick=%(Nick)s"])]; + SqlType = ejabberd_option:sql_type(Host), + case SqlType of + mssql -> [?SQL_INSERT( + "archive", + ["username=%(SUser)s", + "server_host=%(LServer)s", + "timestamp=%(TStmp)d", + "peer=%(LPeer)s", + "bare_peer=%(BarePeer)s", + "xml=N%(XML)s", + "txt=N%(Body)s", + "kind=%(SType)s", + "nick=%(Nick)s"])]; + _ -> [?SQL_INSERT( + "archive", + ["username=%(SUser)s", + "server_host=%(LServer)s", + "timestamp=%(TStmp)d", + "peer=%(LPeer)s", + "bare_peer=%(BarePeer)s", + "xml=%(XML)s", + "txt=%(Body)s", + "kind=%(SType)s", + "nick=%(Nick)s"])] + end; (_Host, _R) -> [] end}].