diff options
Diffstat (limited to 'src/mod_mam_sql.erl')
| -rw-r--r-- | src/mod_mam_sql.erl | 119 | 
1 files changed, 85 insertions, 34 deletions
diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index 7e02b5791..53ccd94a4 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -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,23 +53,32 @@ 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() -> @@ -86,16 +101,17 @@ 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=%(TSinteger)d", +               "peer=%(LPeer)s", +               "bare_peer=%(BarePeer)s", +               "xml=%(XML)s", +               "txt=%(Body)s", +               "kind=%(SType)s", +               "nick=%(Nick)s"])) of  	{updated, _} ->  	    {ok, ID};  	Err -> @@ -113,6 +129,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 +143,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 +209,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 +234,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 +331,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 +363,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,  | 
