aboutsummaryrefslogtreecommitdiff
path: root/src/mod_mam_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_mam_sql.erl')
-rw-r--r--src/mod_mam_sql.erl127
1 files changed, 88 insertions, 39 deletions
diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl
index 7e02b5791..40aa98367 100644
--- a/src/mod_mam_sql.erl
+++ b/src/mod_mam_sql.erl
@@ -30,7 +30,7 @@
%% API
-export([init/2, remove_user/2, remove_room/3, delete_old_messages/3,
- extended_fields/0, store/7, write_prefs/4, get_prefs/2, select/6, export/1]).
+ extended_fields/0, store/8, write_prefs/4, get_prefs/2, select/6, export/1]).
-include_lib("stdlib/include/ms_transform.hrl").
-include("xmpp.hrl").
@@ -38,6 +38,12 @@
-include("logger.hrl").
-include("ejabberd_sql_pt.hrl").
+-ifdef(NEW_SQL_SCHEMA).
+-define(USE_NEW_SCHEMA, true).
+-else.
+-define(USE_NEW_SCHEMA, false).
+-endif.
+
%%%===================================================================
%%% API
%%%===================================================================
@@ -47,31 +53,38 @@ init(_Host, _Opts) ->
remove_user(LUser, LServer) ->
ejabberd_sql:sql_query(
LServer,
- ?SQL("delete from archive where username=%(LUser)s")),
+ ?SQL("delete from archive where username=%(LUser)s and %(LServer)H")),
ejabberd_sql:sql_query(
LServer,
- ?SQL("delete from archive_prefs where username=%(LUser)s")).
+ ?SQL("delete from archive_prefs where username=%(LUser)s and %(LServer)H")).
remove_room(LServer, LName, LHost) ->
LUser = jid:encode({LName, LHost, <<>>}),
remove_user(LUser, LServer).
delete_old_messages(ServerHost, TimeStamp, Type) ->
- TypeClause = if Type == all -> <<"">>;
- true -> [<<" and kind='">>, misc:atom_to_binary(Type), <<"'">>]
- end,
- TS = integer_to_binary(now_to_usec(TimeStamp)),
- ejabberd_sql:sql_query(
- ServerHost, [<<"delete from archive where timestamp<">>,
- TS, TypeClause, <<";">>]),
+ TS = now_to_usec(TimeStamp),
+ case Type of
+ all ->
+ ejabberd_sql:sql_query(
+ ServerHost,
+ ?SQL("delete from archive"
+ " where timestamp < %(TS)d and %(ServerHost)H"));
+ _ ->
+ SType = misc:atom_to_binary(Type),
+ ejabberd_sql:sql_query(
+ ServerHost,
+ ?SQL("delete from archive"
+ " where timestamp < %(TS)d"
+ " and kind=%(SType)s"
+ " and %(ServerHost)H"))
+ end,
ok.
extended_fields() ->
[{withtext, <<"">>}].
-store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir) ->
- TSinteger = p1_time_compat:system_time(micro_seconds),
- ID = integer_to_binary(TSinteger),
+store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir, TS) ->
SUser = case Type of
chat -> LUser;
groupchat -> jid:encode({LUser, LHost, <<>>})
@@ -86,18 +99,19 @@ store(Pkt, LServer, {LUser, LHost}, Type, Peer, Nick, _Dir) ->
SType = misc:atom_to_binary(Type),
case ejabberd_sql:sql_query(
LServer,
- ?SQL("insert into archive (username, timestamp,"
- " peer, bare_peer, xml, txt, kind, nick) values ("
- "%(SUser)s, "
- "%(TSinteger)d, "
- "%(LPeer)s, "
- "%(BarePeer)s, "
- "%(XML)s, "
- "%(Body)s, "
- "%(SType)s, "
- "%(Nick)s)")) of
+ ?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, ID};
+ ok;
Err ->
Err
end.
@@ -113,6 +127,7 @@ write_prefs(LUser, _LServer, #archive_prefs{default = Default,
ServerHost,
"archive_prefs",
["!username=%(LUser)s",
+ "!server_host=%(ServerHost)s",
"def=%(SDefault)s",
"always=%(SAlways)s",
"never=%(SNever)s"]) of
@@ -126,7 +141,7 @@ get_prefs(LUser, LServer) ->
case ejabberd_sql:sql_query(
LServer,
?SQL("select @(def)s, @(always)s, @(never)s from archive_prefs"
- " where username=%(LUser)s")) of
+ " where username=%(LUser)s and %(LServer)H")) of
{selected, [{SDefault, SAlways, SNever}]} ->
Default = erlang:binary_to_existing_atom(SDefault, utf8),
Always = ejabberd_sql:decode_term(SAlways),
@@ -192,8 +207,13 @@ export(_Server) ->
SDefault = erlang:atom_to_binary(Default, utf8),
SAlways = misc:term_to_expr(Always),
SNever = misc:term_to_expr(Never),
- [?SQL("insert into archive_prefs (username, def, always, never) values"
- "(%(LUser)s, %(SDefault)s, %(SAlways)s, %(SNever)s);")];
+ [?SQL_INSERT(
+ "archive_prefs",
+ ["username=%(LUser)s",
+ "server_host=%(LServer)s",
+ "def=%(SDefault)s",
+ "always=%(SAlways)s",
+ "never=%(SNever)s"])];
(_Host, _R) ->
[]
end},
@@ -212,11 +232,17 @@ export(_Server) ->
XML = fxml:element_to_binary(Pkt),
Body = fxml:get_subtag_cdata(Pkt, <<"body">>),
SType = misc:atom_to_binary(Type),
- [?SQL("insert into archive (username, timestamp, "
- "peer, bare_peer, xml, txt, kind, nick) "
- "values (%(SUser)s, %(TStmp)d, %(LPeer)s, "
- "%(BarePeer)s, %(XML)s, %(Body)s, %(SType)s, "
- "%(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"])];
(_Host, _R) ->
[]
end}].
@@ -303,11 +329,24 @@ make_sql_query(User, LServer, MAMQuery, RSM) ->
[]
end,
SUser = Escape(User),
+ SServer = Escape(LServer),
- Query = [<<"SELECT ">>, TopClause, <<" timestamp, xml, peer, kind, nick"
- " FROM archive WHERE username='">>,
- SUser, <<"'">>, WithClause, WithTextClause, StartClause, EndClause,
- PageClause],
+ Query =
+ case ?USE_NEW_SCHEMA of
+ true ->
+ [<<"SELECT ">>, TopClause,
+ <<" timestamp, xml, peer, kind, nick"
+ " FROM archive WHERE username='">>,
+ SUser, <<"' and server_host='">>,
+ SServer, <<"'">>, WithClause, WithTextClause,
+ StartClause, EndClause, PageClause];
+ false ->
+ [<<"SELECT ">>, TopClause,
+ <<" timestamp, xml, peer, kind, nick"
+ " FROM archive WHERE username='">>,
+ SUser, <<"'">>, WithClause, WithTextClause,
+ StartClause, EndClause, PageClause]
+ end,
QueryPage =
case Direction of
@@ -322,9 +361,19 @@ make_sql_query(User, LServer, MAMQuery, RSM) ->
[Query, <<" ORDER BY timestamp ASC ">>,
LimitClause, <<";">>]
end,
- {QueryPage,
- [<<"SELECT COUNT(*) FROM archive WHERE username='">>,
- SUser, <<"'">>, WithClause, WithTextClause, StartClause, EndClause, <<";">>]}.
+ case ?USE_NEW_SCHEMA of
+ true ->
+ {QueryPage,
+ [<<"SELECT COUNT(*) FROM archive WHERE username='">>,
+ SUser, <<"' and server_host='">>,
+ SServer, <<"'">>, WithClause, WithTextClause,
+ StartClause, EndClause, <<";">>]};
+ false ->
+ {QueryPage,
+ [<<"SELECT COUNT(*) FROM archive WHERE username='">>,
+ SUser, <<"'">>, WithClause, WithTextClause,
+ StartClause, EndClause, <<";">>]}
+ end.
-spec get_max_direction_id(rsm_set() | undefined) ->
{integer() | undefined,