]> granicus.if.org Git - ejabberd/commitdiff
Serialize records to proplists before storing then in Riak
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 14 Jul 2014 03:49:02 +0000 (07:49 +0400)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 14 Jul 2014 04:24:44 +0000 (08:24 +0400)
15 files changed:
src/ejabberd_auth_riak.erl
src/ejabberd_riak.erl
src/mod_announce.erl
src/mod_blocking.erl
src/mod_caps.erl
src/mod_irc.erl
src/mod_last.erl
src/mod_muc.erl
src/mod_offline.erl
src/mod_privacy.erl
src/mod_private.erl
src/mod_roster.erl
src/mod_shared_roster.erl
src/mod_vcard.erl
src/mod_vcard_xupdate.erl

index 71f87e186d1aac6787574091f37f3741ee119aad..e5d901cfc850e03ec1b1291331568f040da2e2a3 100644 (file)
@@ -40,6 +40,7 @@
         get_password_s/2, is_user_exists/2, remove_user/2,
         remove_user/3, store_type/0, export/1, import/3,
         plain_password_required/0]).
+-export([passwd_schema/0]).
 
 -include("ejabberd.hrl").
 
@@ -63,10 +64,13 @@ store_type() ->
       true -> scram %% allows: PLAIN SCRAM
     end.
 
+passwd_schema() ->
+    {record_info(fields, passwd), #passwd{}}.
+
 check_password(User, Server, Password) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
         {ok, #passwd{password = Password}} when is_binary(Password) ->
             Password /= <<"">>;
         {ok, #passwd{password = Scram}} when is_record(Scram, scram) ->
@@ -79,7 +83,7 @@ check_password(User, Server, Password, Digest,
               DigestGen) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
       {ok, #passwd{password = Passwd}} when is_binary(Passwd) ->
          DigRes = if Digest /= <<"">> ->
                          Digest == DigestGen(Passwd);
@@ -114,6 +118,7 @@ set_password(User, Server, Password) ->
                             false -> Password
                         end,
             ok = ejabberd_riak:put(#passwd{us = US, password = Password2},
+                                  passwd_schema(),
                                    [{'2i', [{<<"host">>, LServer}]}])
     end.
 
@@ -125,7 +130,7 @@ try_register(User, Server, PasswordList) ->
     if (LUser == error) or (LServer == error) ->
           {error, invalid_jid};
        true ->
-            case ejabberd_riak:get(passwd, US) of
+            case ejabberd_riak:get(passwd, passwd_schema(), US) of
                 {error, notfound} ->
                     Password2 = case is_scrammed() and
                                     is_binary(Password)
@@ -136,6 +141,7 @@ try_register(User, Server, PasswordList) ->
                     {atomic, ejabberd_riak:put(
                                #passwd{us = US,
                                        password = Password2},
+                              passwd_schema(),
                                [{'2i', [{<<"host">>, LServer}]}])};
                 {ok, _} ->
                     exists;
@@ -177,7 +183,7 @@ get_vh_registered_users_number(Server, _) ->
 get_password(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
       {ok, #passwd{password = Password}}
          when is_binary(Password) ->
          Password;
@@ -193,7 +199,7 @@ get_password(User, Server) ->
 get_password_s(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
       {ok, #passwd{password = Password}}
          when is_binary(Password) ->
          Password;
@@ -206,7 +212,7 @@ get_password_s(User, Server) ->
 is_user_exists(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
       {error, notfound} -> false;
       {ok, _} -> true;
       Err -> Err
@@ -221,7 +227,7 @@ remove_user(User, Server) ->
 remove_user(User, Server, Password) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
-    case ejabberd_riak:get(passwd, {LUser, LServer}) of
+    case ejabberd_riak:get(passwd, passwd_schema(), {LUser, LServer}) of
         {ok, #passwd{password = Password}}
           when is_binary(Password) ->
             ejabberd_riak:delete(passwd, {LUser, LServer}),
@@ -285,6 +291,6 @@ export(_Server) ->
       end}].
 
 import(LServer, riak, #passwd{} = Passwd) ->
-    ejabberd_riak:put(Passwd, [{'2i', [{<<"host">>, LServer}]}]);
+    ejabberd_riak:put(Passwd, passwd_schema(), [{'2i', [{<<"host">>, LServer}]}]);
 import(_, _, _) ->
     pass.
index ec9fc471651355a0080f4870c17b7c484325b957..d80a77d3ed10a4b3dc5e570eac8c949013aa9b3c 100644 (file)
@@ -27,9 +27,9 @@
 -behaviour(gen_server).
 
 %% API
--export([start_link/4, get_proc/1, make_bucket/1, put/1, put/2,
-         get/1, get/2, get_by_index/3, delete/1, delete/2,
-         count_by_index/3, get_by_index_range/4,
+-export([start_link/4, get_proc/1, make_bucket/1, put/2, put/3,
+         get/2, get/3, get_by_index/4, delete/1, delete/2,
+         count_by_index/3, get_by_index_range/5,
          get_keys/1, get_keys_by_index/3, is_connected/0,
          count/1, delete_by_index/3]).
 %% For debugging
 
 -type index_info() :: [{i, any()} | {'2i', [index()]}].
 
+%% The `record_schema()' is just a tuple:
+%% {record_info(fields, some_record), #some_record{}}
+
+-type record_schema() :: {[atom()], tuple()}.
+
 %% The `index_info()' is used in put/delete functions:
 %% `i' defines a primary index, `` '2i' '' defines secondary indexes.
 %% There must be only one primary index. If `i' is not specified,
@@ -81,19 +86,19 @@ get_proc(I) ->
 make_bucket(Table) ->
     erlang:atom_to_binary(Table, utf8).
 
--spec put(tuple()) -> ok | {error, any()}.
+-spec put(tuple(), record_schema()) -> ok | {error, any()}.
 %% @equiv put(Record, [])
-put(Record) ->
-    ?MODULE:put(Record, []).
+put(Record, RecFields) ->
+    ?MODULE:put(Record, RecFields, []).
 
--spec put(tuple(), index_info()) -> ok | {error, any()}.
+-spec put(tuple(), record_schema(), index_info()) -> ok | {error, any()}.
 %% @doc Stores a record `Rec' with indexes described in ``IndexInfo''
-put(Rec, IndexInfo) ->
+put(Rec, RecSchema, IndexInfo) ->
     Key = encode_key(proplists:get_value(i, IndexInfo, element(2, Rec))),
     SecIdxs = [encode_index_key(K, V) ||
                   {K, V} <- proplists:get_value('2i', IndexInfo, [])],
     Table = element(1, Rec),
-    Value = term_to_binary(Rec),
+    Value = encode_record(Rec, RecSchema),
     case put_raw(Table, Key, Value, SecIdxs) of
         ok ->
             ok;
@@ -118,9 +123,9 @@ get_object_raw(Table, Key) ->
     Bucket = make_bucket(Table),
     catch riakc_pb_socket:get(get_random_pid(), Bucket, Key).
 
--spec get(atom()) -> {ok, [any()]} | {error, any()}.
+-spec get(atom(), record_schema()) -> {ok, [any()]} | {error, any()}.
 %% @doc Returns all objects from table `Table'
-get(Table) ->
+get(Table, RecSchema) ->
     Bucket = make_bucket(Table),
     case catch riakc_pb_socket:mapred(
                 get_random_pid(),
@@ -130,7 +135,7 @@ get(Table) ->
         {ok, [{_, Objs}]} ->
             {ok, lists:flatmap(
                    fun(Obj) ->
-                           case catch binary_to_term(Obj) of
+                           case catch decode_record(Obj, RecSchema) of
                                {'EXIT', _} ->
                                    Error = {error, make_invalid_object(Obj)},
                                    log_error(Error, get,
@@ -148,12 +153,12 @@ get(Table) ->
             Error
     end.
 
--spec get(atom(), any()) -> {ok, any()} | {error, any()}.
+-spec get(atom(), record_schema(), any()) -> {ok, any()} | {error, any()}.
 %% @doc Reads record by `Key' from table `Table'
-get(Table, Key) ->
+get(Table, RecSchema, Key) ->
     case get_raw(Table, encode_key(Key)) of
         {ok, Val} ->
-            case catch binary_to_term(Val) of
+            case catch decode_record(Val, RecSchema) of
                 {'EXIT', _} ->
                     Error = {error, make_invalid_object(Val)},
                     log_error(Error, get, [{table, Table}, {key, Key}]),
@@ -167,15 +172,16 @@ get(Table, Key) ->
             Error
     end.
 
--spec get_by_index(atom(), binary(), any()) -> {ok, [any()]} | {error, any()}.
+-spec get_by_index(atom(), record_schema(), binary(), any()) ->
+                         {ok, [any()]} | {error, any()}.
 %% @doc Reads records by `Index' and value `Key' from `Table' 
-get_by_index(Table, Index, Key) ->
+get_by_index(Table, RecSchema, Index, Key) ->
     {NewIndex, NewKey} = encode_index_key(Index, Key),
     case get_by_index_raw(Table, NewIndex, NewKey) of
         {ok, Vals} ->
             {ok, lists:flatmap(
                    fun(Val) ->
-                           case catch binary_to_term(Val) of
+                           case catch decode_record(Val, RecSchema) of
                                {'EXIT', _} ->
                                    Error = {error, make_invalid_object(Val)},
                                    log_error(Error, get_by_index,
@@ -197,17 +203,17 @@ get_by_index(Table, Index, Key) ->
             Error
     end.
 
--spec get_by_index_range(atom(), binary(), any(), any()) ->
+-spec get_by_index_range(atom(), record_schema(), binary(), any(), any()) ->
                                 {ok, [any()]} | {error, any()}.
 %% @doc Reads records by `Index' in the range `FromKey'..`ToKey' from `Table'
-get_by_index_range(Table, Index, FromKey, ToKey) ->
+get_by_index_range(Table, RecSchema, Index, FromKey, ToKey) ->
     {NewIndex, NewFromKey} = encode_index_key(Index, FromKey),
     {NewIndex, NewToKey} = encode_index_key(Index, ToKey),
     case get_by_index_range_raw(Table, NewIndex, NewFromKey, NewToKey) of
         {ok, Vals} ->
             {ok, lists:flatmap(
                    fun(Val) ->
-                           case catch binary_to_term(Val) of
+                           case catch decode_record(Val, RecSchema) of
                                {'EXIT', _} ->
                                    Error = {error, make_invalid_object(Val)},
                                    log_error(Error, get_by_index_range,
@@ -518,3 +524,31 @@ get_random_pid() ->
        {'EXIT', Err} ->
            throw({error, Err})
     end.
+
+encode_record(Rec, {Fields, DefRec}) ->
+    term_to_binary(encode_record(Rec, Fields, DefRec, 2)).
+
+encode_record(Rec, [FieldName|Fields], DefRec, Pos) ->
+    Value = element(Pos, Rec),
+    DefValue = element(Pos, DefRec),
+    if Value == DefValue ->
+           encode_record(Rec, Fields, DefRec, Pos+1);
+       true ->
+           [{FieldName, Value}|encode_record(Rec, Fields, DefRec, Pos+1)]
+    end;
+encode_record(_, [], _, _) ->
+    [].
+
+decode_record(Bin, {Fields, DefRec}) ->
+    decode_record(binary_to_term(Bin), Fields, DefRec, 2).
+
+decode_record(KeyVals, [FieldName|Fields], Rec, Pos) ->
+    case lists:keyfind(FieldName, 1, KeyVals) of
+       {_, Value} ->
+           NewRec = setelement(Pos, Rec, Value),
+           decode_record(KeyVals, Fields, NewRec, Pos+1);
+       false ->
+           decode_record(KeyVals, Fields, Rec, Pos+1)
+    end;
+decode_record(_, [], Rec, _) ->
+    Rec.
index fd215772a54ae46d27df8d299dc1c03fbfb42114..40204da808199896c94df5af287f569529c3085b 100644 (file)
@@ -797,6 +797,7 @@ announce_motd(Host, Packet) ->
                 lists:foreach(
                   fun({U, S, _R}) ->
                           ok = ejabberd_riak:put(#motd_users{us = {U, S}},
+                                                motd_users_schema(),
                                                  [{'2i', [{<<"server">>, S}]}])
                   end, Sessions),
                 {atomic, ok}
@@ -850,7 +851,8 @@ announce_motd_update(LServer, Packet) ->
             mnesia:transaction(F);
         riak ->
             {atomic, ejabberd_riak:put(#motd{server = LServer,
-                                             packet = Packet})};
+                                             packet = Packet},
+                                      motd_schema())};
         odbc ->
             XML = ejabberd_odbc:escape(xml:element_to_binary(Packet)),
             F = fun() ->
@@ -940,17 +942,17 @@ send_motd(#jid{luser = LUser, lserver = LServer} = JID, mnesia) ->
            ok
     end;
 send_motd(#jid{luser = LUser, lserver = LServer} = JID, riak) ->
-    case catch ejabberd_riak:get(motd, LServer) of
+    case catch ejabberd_riak:get(motd, motd_schema(), LServer) of
         {ok, #motd{packet = Packet}} ->
             US = {LUser, LServer},
-            case ejabberd_riak:get(motd_users, US) of
+            case ejabberd_riak:get(motd_users, motd_users_schema(), US) of
                 {ok, #motd_users{}} ->
                     ok;
                 _ ->
                     Local = jlib:make_jid(<<>>, LServer, <<>>),
                    ejabberd_router:route(Local, JID, Packet),
                     {atomic, ejabberd_riak:put(
-                               #motd_users{us = US},
+                               #motd_users{us = US}, motd_users_schema(),
                                [{'2i', [{<<"server">>, LServer}]}])}
             end;
         _ ->
@@ -1007,7 +1009,7 @@ get_stored_motd_packet(LServer, mnesia) ->
            error
     end;
 get_stored_motd_packet(LServer, riak) ->
-    case ejabberd_riak:get(motd, LServer) of
+    case ejabberd_riak:get(motd, motd_schema(), LServer) of
         {ok, #motd{packet = Packet}} ->
             {ok, Packet};
        _ ->
@@ -1100,6 +1102,12 @@ update_motd_users_table() ->
            mnesia:transform_table(motd_users, ignore, Fields)
     end.
 
+motd_schema() ->
+    {record_info(fields, motd), #motd{}}.
+
+motd_users_schema() ->
+    {record_info(fields, motd_users), #motd_users{}}.
+
 export(_Server) ->
     [{motd,
       fun(Host, #motd{server = LServer, packet = El})
@@ -1138,8 +1146,9 @@ import(_LServer, mnesia, #motd{} = Motd) ->
 import(_LServer, mnesia, #motd_users{} = Users) ->
     mnesia:dirty_write(Users);
 import(_LServer, riak, #motd{} = Motd) ->
-    ejabberd_riak:put(Motd);
+    ejabberd_riak:put(Motd, motd_schema());
 import(_LServer, riak, #motd_users{us = {_, S}} = Users) ->
-    ejabberd_riak:put(Users, [{'2i', [{<<"server">>, S}]}]);
+    ejabberd_riak:put(Users, motd_users_schema(),
+                     [{'2i', [{<<"server">>, S}]}]);
 import(_, _, _) ->
     pass.
index 1bd7ae3b5403a380447016b5a9985d89ca40f830..968f3c814fb929e3e3e067faebe4298a5996966c 100644 (file)
@@ -185,7 +185,8 @@ process_blocklist_block(LUser, LServer, Filter,
                        riak) ->
     {atomic,
      begin
-         case ejabberd_riak:get(privacy, {LUser, LServer}) of
+         case ejabberd_riak:get(privacy, mod_privacy:privacy_schema(),
+                               {LUser, LServer}) of
              {ok, #privacy{default = Default, lists = Lists} = P} ->
                  case lists:keysearch(Default, 1, Lists) of
                      {value, {_, List}} ->
@@ -205,7 +206,8 @@ process_blocklist_block(LUser, LServer, Filter,
          NewList = Filter(List),
          NewLists = [{NewDefault, NewList} | NewLists1],
          case ejabberd_riak:put(P#privacy{default = NewDefault,
-                                          lists = NewLists}) of
+                                          lists = NewLists},
+                               mod_privacy:privacy_schema()) of
              ok ->
                  {ok, NewDefault, NewList};
              Err ->
@@ -389,7 +391,8 @@ process_blocklist_unblock(LUser, LServer, Filter,
 process_blocklist_unblock(LUser, LServer, Filter,
                           riak) ->
     {atomic,
-     case ejabberd_riak:get(privacy, {LUser, LServer}) of
+     case ejabberd_riak:get(privacy, mod_privacy:privacy_schema(),
+                           {LUser, LServer}) of
          {error, _} ->
              %% No lists, nothing to unblock
              ok;
@@ -399,7 +402,8 @@ process_blocklist_unblock(LUser, LServer, Filter,
                      NewList = Filter(List),
                      NewLists1 = lists:keydelete(Default, 1, Lists),
                      NewLists = [{Default, NewList} | NewLists1],
-                     case ejabberd_riak:put(P#privacy{lists = NewLists}) of
+                     case ejabberd_riak:put(P#privacy{lists = NewLists},
+                                           mod_privacy:privacy_schema()) of
                          ok ->
                              {ok, Default, NewList};
                          Err ->
@@ -489,7 +493,8 @@ process_blocklist_get(LUser, LServer, mnesia) ->
          end
     end;
 process_blocklist_get(LUser, LServer, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, {LUser, LServer},
+                          mod_privacy:privacy_schema()) of
         {ok, #privacy{default = Default, lists = Lists}} ->
             case lists:keysearch(Default, 1, Lists) of
                 {value, {_, List}} -> List;
index 75ca2299bb3f793bc6ac3605e30c6a92cceaf683..e54b75eee72b0ba56fe91cb069d7bf73e7ea8cd4 100644 (file)
@@ -444,7 +444,7 @@ caps_read_fun(_LServer, Node, mnesia) ->
     end;
 caps_read_fun(_LServer, Node, riak) ->
     fun() ->
-            case ejabberd_riak:get(caps_features, Node) of
+            case ejabberd_riak:get(caps_features, caps_features_schema(), Node) of
                 {ok, #caps_features{features = Features}} -> {ok, Features};
                 _ -> error
             end
@@ -482,7 +482,8 @@ caps_write_fun(_LServer, Node, Features, mnesia) ->
 caps_write_fun(_LServer, Node, Features, riak) ->
     fun () ->
             ejabberd_riak:put(#caps_features{node_pair = Node,
-                                             features = Features})
+                                             features = Features},
+                             caps_features_schema())
     end;
 caps_write_fun(LServer, NodePair, Features, odbc) ->
     fun () ->
@@ -676,6 +677,9 @@ sql_write_features_t({Node, SubNode}, Features) ->
        <<"values ('">>, SNode, <<"', '">>, SSubNode, <<"', '">>,
        ejabberd_odbc:escape(F), <<"');">>] || F <- NewFeatures]].
 
+caps_features_schema() ->
+    {record_info(fields, caps_features), #caps_features{}}.
+
 export(_Server) ->
     [{caps_features,
       fun(_Host, #caps_features{node_pair = NodePair,
@@ -717,13 +721,15 @@ import_next(LServer, DBType, NodePair) ->
               #caps_features{node_pair = NodePair, features = I});
         [I] when is_integer(I), DBType == riak ->
             ejabberd_riak:put(
-              #caps_features{node_pair = NodePair, features = I});
+              #caps_features{node_pair = NodePair, features = I},
+             caps_features_schema());
         _ when DBType == mnesia ->
             mnesia:dirty_write(
               #caps_features{node_pair = NodePair, features = Features});
         _ when DBType == riak ->
             ejabberd_riak:put(
-              #caps_features{node_pair = NodePair, features = Features});
+              #caps_features{node_pair = NodePair, features = Features},
+             caps_features_schema());
         _ when DBType == odbc ->
             ok
     end,
index a93a96b316a6ff153a2b6cb94b64ba1047927a0a..f6e7bb77418324ae871999ea3a88886419062f99 100644 (file)
@@ -594,7 +594,7 @@ get_data(_LServer, Host, From, mnesia) ->
 get_data(LServer, Host, From, riak) ->
     #jid{luser = LUser, lserver = LServer} = From,
     US = {LUser, LServer},
-    case ejabberd_riak:get(irc_custom, {US, Host}) of
+    case ejabberd_riak:get(irc_custom, irc_custom_schema(), {US, Host}) of
         {ok, #irc_custom{data = Data}} ->
             Data;
         {error, notfound} ->
@@ -738,7 +738,8 @@ set_data(LServer, Host, From, Data, riak) ->
     {LUser, LServer, _} = jlib:jid_tolower(From),
     US = {LUser, LServer},
     {atomic, ejabberd_riak:put(#irc_custom{us_host = {US, Host},
-                                           data = Data})};
+                                           data = Data},
+                              irc_custom_schema())};
 set_data(LServer, Host, From, Data, odbc) ->
     SJID =
        ejabberd_odbc:escape(jlib:jid_to_string(jlib:jid_tolower(jlib:jid_remove_resource(From)))),
@@ -1284,6 +1285,9 @@ conn_params_to_list(Params) ->
                Port, binary_to_list(P)}
       end, Params).
 
+irc_custom_schema() ->
+    {record_info(fields, irc_custom), #irc_custom{}}.
+
 update_table() ->
     Fields = record_info(fields, irc_custom),
     case mnesia:table_info(irc_custom, attributes) of
@@ -1338,6 +1342,6 @@ import(_LServer) ->
 import(_LServer, mnesia, #irc_custom{} = R) ->
     mnesia:dirty_write(R);
 import(_LServer, riak, #irc_custom{} = R) ->
-    ejabberd_riak:put(R);
+    ejabberd_riak:put(R, irc_custom_schema());
 import(_, _, _) ->
     pass.
index d3ec3284a25f267323084ad604375ef962719554..a20da3130e83bdc3727b95ee9fe3438bd38444e2 100644 (file)
@@ -169,7 +169,8 @@ get_last(LUser, LServer, mnesia) ->
          {ok, TimeStamp, Status}
     end;
 get_last(LUser, LServer, riak) ->
-    case ejabberd_riak:get(last_activity, {LUser, LServer}) of
+    case ejabberd_riak:get(last_activity, last_activity_schema(),
+                          {LUser, LServer}) of
         {ok, #last_activity{timestamp = TimeStamp,
                             status = Status}} ->
             {ok, TimeStamp, Status};
@@ -250,7 +251,8 @@ store_last_info(LUser, LServer, TimeStamp, Status,
     US = {LUser, LServer},
     {atomic, ejabberd_riak:put(#last_activity{us = US,
                                               timestamp = TimeStamp,
-                                              status = Status})};
+                                              status = Status},
+                              last_activity_schema())};
 store_last_info(LUser, LServer, TimeStamp, Status,
                odbc) ->
     Username = ejabberd_odbc:escape(LUser),
@@ -301,6 +303,9 @@ update_table() ->
          mnesia:transform_table(last_activity, ignore, Fields)
     end.
 
+last_activity_schema() ->
+    {record_info(fields, last_activity), #last_activity{}}.
+
 export(_Server) ->
     [{last_activity,
       fun(Host, #last_activity{us = {LUser, LServer},
@@ -331,7 +336,7 @@ import(LServer) ->
 import(_LServer, mnesia, #last_activity{} = LA) ->
     mnesia:dirty_write(LA);
 import(_LServer, riak, #last_activity{} = LA) ->
-    ejabberd_riak:put(LA);
+    ejabberd_riak:put(LA, last_activity_schema());
 import(_, _, _) ->
     pass.
 
index 52c9d2e229663aa59bf05b9bfda89e0d63413841..fe8d4f95e895243ca7a3a7748d6fe32cec75235a 100644 (file)
@@ -149,7 +149,8 @@ store_room(_LServer, Host, Name, Opts, mnesia) ->
     mnesia:transaction(F);
 store_room(_LServer, Host, Name, Opts, riak) ->
     {atomic, ejabberd_riak:put(#muc_room{name_host = {Name, Host},
-                                         opts = Opts})};
+                                         opts = Opts},
+                              muc_room_schema())};
 store_room(LServer, Host, Name, Opts, odbc) ->
     SName = ejabberd_odbc:escape(Name),
     SHost = ejabberd_odbc:escape(Host),
@@ -174,7 +175,7 @@ restore_room(_LServer, Host, Name, mnesia) ->
       _ -> error
     end;
 restore_room(_LServer, Host, Name, riak) ->
-    case ejabberd_riak:get(muc_room, {Name, Host}) of
+    case ejabberd_riak:get(muc_room, muc_room_schema(), {Name, Host}) of
         {ok, #muc_room{opts = Opts}} -> Opts;
         _ -> error
     end;
@@ -245,6 +246,7 @@ can_use_nick(LServer, Host, JID, Nick, riak) ->
     {LUser, LServer, _} = jlib:jid_tolower(JID),
     LUS = {LUser, LServer},
     case ejabberd_riak:get_by_index(muc_registered,
+                                   muc_registered_schema(),
                                     <<"nick_host">>, {Nick, Host}) of
         {ok, []} ->
             true;
@@ -640,7 +642,7 @@ get_rooms(_LServer, Host, mnesia) ->
       Rs -> Rs
     end;
 get_rooms(_LServer, Host, riak) ->
-    case ejabberd_riak:get(muc_room) of
+    case ejabberd_riak:get(muc_room, muc_room_schema()) of
         {ok, Rs} ->
             lists:filter(
               fun(#muc_room{name_host = {_, H}}) ->
@@ -874,7 +876,9 @@ get_nick(_LServer, Host, From, mnesia) ->
 get_nick(LServer, Host, From, riak) ->
     {LUser, LServer, _} = jlib:jid_tolower(From),
     US = {LUser, LServer},
-    case ejabberd_riak:get(muc_registered, {US, Host}) of
+    case ejabberd_riak:get(muc_registered,
+                          muc_registered_schema(),
+                          {US, Host}) of
         {ok, #muc_registered{nick = Nick}} -> Nick;
         {error, _} -> error
     end;
@@ -971,6 +975,7 @@ set_nick(LServer, Host, From, Nick, riak) ->
          _ ->
              Allow = case ejabberd_riak:get_by_index(
                             muc_registered,
+                           muc_registered_schema(),
                             <<"nick_host">>, {Nick, Host}) of
                          {ok, []} ->
                              true;
@@ -982,6 +987,7 @@ set_nick(LServer, Host, From, Nick, riak) ->
              if Allow ->
                      ejabberd_riak:put(#muc_registered{us_host = {LUS, Host},
                                                        nick = Nick},
+                                      muc_registered_schema(),
                                        [{'2i', [{<<"nick_host">>,
                                                  {Nick, Host}}]}]);
                 true ->
@@ -1173,6 +1179,12 @@ update_tables(Host) ->
     update_muc_room_table(Host),
     update_muc_registered_table(Host).
 
+muc_room_schema() ->
+    {record_info(fields, muc_room), #muc_room{}}.
+
+muc_registered_schema() ->
+    {record_info(fields, muc_registered), #muc_registered{}}.
+
 update_muc_room_table(_Host) ->
     Fields = record_info(fields, muc_room),
     case mnesia:table_info(muc_room, attributes) of
@@ -1269,9 +1281,10 @@ import(_LServer, mnesia, #muc_room{} = R) ->
 import(_LServer, mnesia, #muc_registered{} = R) ->
     mnesia:dirty_write(R);
 import(_LServer, riak, #muc_room{} = R) ->
-    ejabberd_riak:put(R);
+    ejabberd_riak:put(R, muc_room_schema());
 import(_LServer, riak,
        #muc_registered{us_host = {_, Host}, nick = Nick} = R) ->
-    ejabberd_riak:put(R, [{'2i', [{<<"nick_host">>, {Nick, Host}}]}]);
+    ejabberd_riak:put(R, muc_registered_schema(),
+                     [{'2i', [{<<"nick_host">>, {Nick, Host}}]}]);
 import(_, _, _) ->
     pass.
index 369b9ec7a15c662b294975e6bfbb0f48fabe206a..d81022fdd27e1aa991bdf70ca7eb457b070d96df 100644 (file)
@@ -189,7 +189,8 @@ store_offline_msg(Host, {User, _}, Msgs, Len, MaxOfflineMsgs,
             lists:foreach(
               fun(#offline_msg{us = US,
                                timestamp = TS} = M) ->
-                      ejabberd_riak:put(M, [{i, TS}, {'2i', [{<<"us">>, US}]}])
+                      ejabberd_riak:put(M, offline_msg_schema(),
+                                       [{i, TS}, {'2i', [{<<"us">>, US}]}])
               end, Msgs)
     end.
 
@@ -440,7 +441,7 @@ pop_offline_messages(Ls, LUser, LServer, odbc) ->
       _ -> Ls
     end;
 pop_offline_messages(Ls, LUser, LServer, riak) ->
-    case ejabberd_riak:get_by_index(offline_msg,
+    case ejabberd_riak:get_by_index(offline_msg, offline_msg_schema(),
                                     <<"us">>, {LUser, LServer}) of
         {ok, Rs} ->
             try
@@ -655,7 +656,8 @@ read_all_msgs(LUser, LServer, mnesia) ->
                  mnesia:dirty_read({offline_msg, US}));
 read_all_msgs(LUser, LServer, riak) ->
     case ejabberd_riak:get_by_index(
-           offline_msg, <<"us">>, {LUser, LServer}) of
+           offline_msg, offline_msg_schema(),
+          <<"us">>, {LUser, LServer}) of
         {ok, Rs} ->
             lists:keysort(#offline_msg.timestamp, Rs);
         _Err ->
@@ -1014,6 +1016,9 @@ count_offline_messages(_Acc, User, Server) ->
     N = count_offline_messages(User, Server),
     {stop, N}.
 
+offline_msg_schema() ->
+    {record_info(fields, offline_msg), #offline_msg{}}.
+
 export(_Server) ->
     [{offline_msg,
       fun(Host, #offline_msg{us = {LUser, LServer},
@@ -1073,6 +1078,7 @@ import(LServer) ->
 import(_LServer, mnesia, #offline_msg{} = Msg) ->
     mnesia:dirty_write(Msg);
 import(_LServer, riak, #offline_msg{us = US, timestamp = TS} = M) ->
-    ejabberd_riak:put(M, [{i, TS}, {'2i', [{<<"us">>, US}]}]);
+    ejabberd_riak:put(M, offline_msg_schema(),
+                     [{i, TS}, {'2i', [{<<"us">>, US}]}]);
 import(_, _, _) ->
     pass.
index f93f26f7f45a99fb541b3d3d6926617923bc7f4b..9c9ec919f35c0c8f420119d821c4e2363427db9c 100644 (file)
@@ -43,7 +43,7 @@
         sql_get_privacy_list_data_by_id_t/1,
         sql_get_privacy_list_id_t/2,
         sql_set_default_privacy_list/2,
-        sql_set_privacy_list/2]).
+        sql_set_privacy_list/2, privacy_schema/0]).
 
 -include("ejabberd.hrl").
 -include("logger.hrl").
@@ -52,6 +52,9 @@
 
 -include("mod_privacy.hrl").
 
+privacy_schema() ->
+    {record_info(fields, privacy), #privacy{}}.
+
 start(Host, Opts) ->
     IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1,
                              one_queue),
@@ -161,7 +164,7 @@ process_lists_get(LUser, LServer, _Active, mnesia) ->
          {Default, LItems}
     end;
 process_lists_get(LUser, LServer, _Active, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
         {ok, #privacy{default = Default, lists = Lists}} ->
             LItems = lists:map(fun ({N, _}) ->
                                        #xmlel{name = <<"list">>,
@@ -225,7 +228,7 @@ process_list_get(LUser, LServer, Name, mnesia) ->
          end
     end;
 process_list_get(LUser, LServer, Name, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
         {ok, #privacy{lists = Lists}} ->
             case lists:keysearch(Name, 1, Lists) of
                 {value, {_, List}} -> List;
@@ -383,12 +386,13 @@ process_default_set(LUser, LServer, {value, Name},
     mnesia:transaction(F);
 process_default_set(LUser, LServer, {value, Name}, riak) ->
     {atomic,
-     case ejabberd_riak:get(privacy, {LUser, LServer}) of
+     case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
          {ok, #privacy{lists = Lists} = P} ->
              case lists:keymember(Name, 1, Lists) of
                  true ->
                      ejabberd_riak:put(P#privacy{default = Name,
-                                                 lists = Lists});
+                                                 lists = Lists},
+                                      privacy_schema());
                  false ->
                      not_found
              end;
@@ -418,9 +422,9 @@ process_default_set(LUser, LServer, false, mnesia) ->
     mnesia:transaction(F);
 process_default_set(LUser, LServer, false, riak) ->
     {atomic,
-     case ejabberd_riak:get(privacy, {LUser, LServer}) of
+     case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
          {ok, R} ->
-             ejabberd_riak:put(R#privacy{default = none});
+             ejabberd_riak:put(R#privacy{default = none}, privacy_schema());
          {error, _} ->
              ok
      end};
@@ -457,7 +461,7 @@ process_active_set(LUser, LServer, Name, mnesia) ->
          end
     end;
 process_active_set(LUser, LServer, Name, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
         {ok, #privacy{lists = Lists}} ->
             case lists:keysearch(Name, 1, Lists) of
                 {value, {_, List}} -> List;
@@ -499,13 +503,14 @@ remove_privacy_list(LUser, LServer, Name, mnesia) ->
     mnesia:transaction(F);
 remove_privacy_list(LUser, LServer, Name, riak) ->
     {atomic,
-     case ejabberd_riak:get(privacy, {LUser, LServer}) of
+     case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
          {ok, #privacy{default = Default, lists = Lists} = P} ->
              if Name == Default ->
                      conflict;
                 true ->
                      NewLists = lists:keydelete(Name, 1, Lists),
-                     ejabberd_riak:put(P#privacy{lists = NewLists})
+                     ejabberd_riak:put(P#privacy{lists = NewLists},
+                                      privacy_schema())
              end;
          {error, _} ->
              ok
@@ -539,15 +544,16 @@ set_privacy_list(LUser, LServer, Name, List, mnesia) ->
     mnesia:transaction(F);
 set_privacy_list(LUser, LServer, Name, List, riak) ->
     {atomic,
-     case ejabberd_riak:get(privacy, {LUser, LServer}) of
+     case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
          {ok, #privacy{lists = Lists} = P} ->
              NewLists1 = lists:keydelete(Name, 1, Lists),
              NewLists = [{Name, List} | NewLists1],
-             ejabberd_riak:put(P#privacy{lists = NewLists});
+             ejabberd_riak:put(P#privacy{lists = NewLists}, privacy_schema());
          {error, _} ->
              NewLists = [{Name, List}],
              ejabberd_riak:put(#privacy{us = {LUser, LServer},
-                                        lists = NewLists})
+                                        lists = NewLists},
+                              privacy_schema())
      end};
 set_privacy_list(LUser, LServer, Name, List, odbc) ->
     RItems = lists:map(fun item_to_raw/1, List),
@@ -734,7 +740,7 @@ get_user_list(_, LUser, LServer, mnesia) ->
       _ -> {none, []}
     end;
 get_user_list(_, LUser, LServer, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
         {ok, #privacy{default = Default, lists = Lists}} ->
             case Default of
                 none -> {none, []};
@@ -779,7 +785,7 @@ get_user_lists(LUser, LServer, mnesia) ->
             error
     end;
 get_user_lists(LUser, LServer, riak) ->
-    case ejabberd_riak:get(privacy, {LUser, LServer}) of
+    case ejabberd_riak:get(privacy, privacy_schema(), {LUser, LServer}) of
         {ok, #privacy{} = P} ->
             {ok, P};
         {error, _} ->
@@ -1242,6 +1248,6 @@ import(LServer) ->
 import(_LServer, mnesia, #privacy{} = P) ->
     mnesia:dirty_write(P);
 import(_LServer, riak, #privacy{} = P) ->
-    ejabberd_riak:put(P);
+    ejabberd_riak:put(P, privacy_schema());
 import(_, _, _) ->
     pass.
index ce002a3e02352ece9f54d469ae580d287f07048c..9fdf09dd8b7a21edc2a01c99291c08fdb4738187 100644 (file)
@@ -154,6 +154,7 @@ set_data(LUser, LServer, {XMLNS, El}, odbc) ->
 set_data(LUser, LServer, {XMLNS, El}, riak) ->
     ejabberd_riak:put(#private_storage{usns = {LUser, LServer, XMLNS},
                                        xml = El},
+                     private_storage_schema(),
                       [{'2i', [{<<"us">>, {LUser, LServer}}]}]).
 
 get_data(LUser, LServer, Data) ->
@@ -191,7 +192,8 @@ get_data(LUser, LServer, odbc, [{XMLNS, El} | Els],
     end;
 get_data(LUser, LServer, riak, [{XMLNS, El} | Els],
         Res) ->
-    case ejabberd_riak:get(private_storage, {LUser, LServer, XMLNS}) of
+    case ejabberd_riak:get(private_storage, private_storage_schema(),
+                          {LUser, LServer, XMLNS}) of
         {ok, #private_storage{xml = NewEl}} ->
             get_data(LUser, LServer, riak, Els, [NewEl|Res]);
         _ ->
@@ -226,13 +228,17 @@ get_all_data(LUser, LServer, odbc) ->
     end;
 get_all_data(LUser, LServer, riak) ->
     case ejabberd_riak:get_by_index(
-           private_storage, <<"us">>, {LUser, LServer}) of
+           private_storage, private_storage_schema(),
+          <<"us">>, {LUser, LServer}) of
         {ok, Res} ->
             [El || #private_storage{xml = El} <- Res];
         _ ->
             []
     end.
 
+private_storage_schema() ->
+    {record_info(fields, private_storage), #private_storage{}}.
+
 remove_user(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
@@ -307,7 +313,9 @@ import(LServer) ->
 
 import(_LServer, mnesia, #private_storage{} = PS) ->
     mnesia:dirty_write(PS);
+
 import(_LServer, riak, #private_storage{usns = {LUser, LServer, _}} = PS) ->
-    ejabberd_riak:put(PS, [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
+    ejabberd_riak:put(PS, private_storage_schema(),
+                     [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
 import(_, _, _) ->
     pass.
index d1888035349729872b6d80db8f108b3b45042279..6ca02dc787d84f5c1340e8f1d6a4edf29a6d0c1d 100644 (file)
@@ -206,7 +206,8 @@ read_roster_version(LUser, LServer, odbc) ->
       {selected, [<<"version">>], []} -> error
     end;
 read_roster_version(LServer, LUser, riak) ->
-    case ejabberd_riak:get(roster_version, {LUser, LServer}) of
+    case ejabberd_riak:get(roster_version, roster_version_schema(),
+                          {LUser, LServer}) of
         {ok, #roster_version{version = V}} -> V;
         _Err -> error
     end.
@@ -248,7 +249,8 @@ write_roster_version(LUser, LServer, InTransaction, Ver,
 write_roster_version(LUser, LServer, _InTransaction, Ver,
                     riak) ->
     US = {LUser, LServer},
-    ejabberd_riak:put(#roster_version{us = US, version = Ver}).
+    ejabberd_riak:put(#roster_version{us = US, version = Ver},
+                     roster_version_schema()).
 
 %% Load roster from DB only if neccesary. 
 %% It is neccesary if
@@ -357,7 +359,8 @@ get_roster(LUser, LServer, mnesia) ->
       _ -> []
     end;
 get_roster(LUser, LServer, riak) ->
-    case ejabberd_riak:get_by_index(roster, <<"us">>, {LUser, LServer}) of
+    case ejabberd_riak:get_by_index(roster, roster_schema(),
+                                   <<"us">>, {LUser, LServer}) of
         {ok, Items} -> Items;
         _Err -> []
     end;
@@ -471,7 +474,7 @@ get_roster_by_jid_t(LUser, LServer, LJID, odbc) ->
          end
     end;
 get_roster_by_jid_t(LUser, LServer, LJID, riak) ->
-    case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of
+    case ejabberd_riak:get(roster, roster_schema(), {LUser, LServer, LJID}) of
         {ok, I} ->
             I#roster{jid = LJID, name = <<"">>, groups = [],
                      xs = []};
@@ -660,7 +663,8 @@ get_subscription_lists(_, LUser, LServer, odbc) ->
       _ -> []
     end;
 get_subscription_lists(_, LUser, LServer, riak) ->
-    case ejabberd_riak:get_by_index(roster, <<"us">>, {LUser, LServer}) of
+    case ejabberd_riak:get_by_index(roster, roster_schema(),
+                                   <<"us">>, {LUser, LServer}) of
         {ok, Items} -> Items;
         _Err -> []
     end.
@@ -703,7 +707,7 @@ roster_subscribe_t(LUser, LServer, LJID, Item, odbc) ->
     odbc_queries:roster_subscribe(LServer, Username, SJID,
                                  ItemVals);
 roster_subscribe_t(LUser, LServer, _LJID, Item, riak) ->
-    ejabberd_riak:put(Item,
+    ejabberd_riak:put(Item, roster_schema(),
                       [{'2i', [{<<"us">>, {LUser, LServer}}]}]).
 
 transaction(LServer, F) ->
@@ -763,7 +767,7 @@ get_roster_by_jid_with_groups_t(LUser, LServer, LJID,
                  us = {LUser, LServer}, jid = LJID}
     end;
 get_roster_by_jid_with_groups_t(LUser, LServer, LJID, riak) ->
-    case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of
+    case ejabberd_riak:get(roster, roster_schema(), {LUser, LServer, LJID}) of
         {ok, I} ->
             I;
         {error, notfound} ->
@@ -1057,7 +1061,7 @@ update_roster_t(LUser, LServer, LJID, Item, odbc) ->
     odbc_queries:update_roster(LServer, Username, SJID, ItemVals,
                                ItemGroups);
 update_roster_t(LUser, LServer, _LJID, Item, riak) ->
-    ejabberd_riak:put(Item,
+    ejabberd_riak:put(Item, roster_schema(),
                       [{'2i', [{<<"us">>, {LUser, LServer}}]}]).
 
 del_roster_t(LUser, LServer, LJID) ->
@@ -1254,7 +1258,7 @@ read_subscription_and_groups(LUser, LServer, LJID,
     end;
 read_subscription_and_groups(LUser, LServer, LJID,
                             riak) ->
-    case ejabberd_riak:get(roster, {LUser, LServer, LJID}) of
+    case ejabberd_riak:get(roster, roster_schema(), {LUser, LServer, LJID}) of
         {ok, #roster{subscription = Subscription,
                      groups = Groups}} ->
             {Subscription, Groups};
@@ -1698,6 +1702,11 @@ is_managed_from_id(<<"roster-remotely-managed">>) ->
 is_managed_from_id(_Id) ->
     false.
 
+roster_schema() ->
+    {record_info(fields, roster), #roster{}}.
+
+roster_version_schema() ->
+    {record_info(fields, roster_version), #roster_version{}}.
 
 export(_Server) ->
     [{roster,
@@ -1749,8 +1758,9 @@ import(_LServer, mnesia, #roster{} = R) ->
 import(_LServer, mnesia, #roster_version{} = RV) ->
     mnesia:dirty_write(RV);
 import(_LServer, riak, #roster{us = {LUser, LServer}} = R) ->
-    ejabberd_riak:put(R, [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
+    ejabberd_riak:put(R, roster_schema(),
+                     [{'2i', [{<<"us">>, {LUser, LServer}}]}]);
 import(_LServer, riak, #roster_version{} = RV) ->
-    ejabberd_riak:put(RV);
+    ejabberd_riak:put(RV, roster_version_schema());
 import(_, _, _) ->
     pass.
index 8765eeddcea79bf42ecf1cf54823f61016e89694..9539dfb65cbbe133398ecb544e113272b6cd21fe 100644 (file)
@@ -425,7 +425,8 @@ groups_with_opts(Host, mnesia) ->
                               [], [['$1', '$2']]}]),
     lists:map(fun ([G, O]) -> {G, O} end, Gs);
 groups_with_opts(Host, riak) ->
-    case ejabberd_riak:get_by_index(sr_group, <<"host">>, Host) of
+    case ejabberd_riak:get_by_index(sr_group, sr_group_schema(),
+                                   <<"host">>, Host) of
         {ok, Rs} ->
             [{G, O} || #sr_group{group_host = {G, _}, opts = O} <- Rs];
         _ ->
@@ -455,6 +456,7 @@ create_group(Host, Group, Opts, mnesia) ->
 create_group(Host, Group, Opts, riak) ->
     {atomic, ejabberd_riak:put(#sr_group{group_host = {Group, Host},
                                          opts = Opts},
+                              sr_group_schema(),
                                [{'2i', [{<<"host">>, Host}]}])};
 create_group(Host, Group, Opts, odbc) ->
     SGroup = ejabberd_odbc:escape(Group),
@@ -511,7 +513,7 @@ get_group_opts(Host, Group, mnesia) ->
       _ -> error
     end;
 get_group_opts(Host, Group, riak) ->
-    case ejabberd_riak:get(sr_group, {Group, Host}) of
+    case ejabberd_riak:get(sr_group, sr_group_schema(), {Group, Host}) of
         {ok, #sr_group{opts = Opts}} -> Opts;
         _ -> error
     end;
@@ -537,6 +539,7 @@ set_group_opts(Host, Group, Opts, mnesia) ->
 set_group_opts(Host, Group, Opts, riak) ->
     {atomic, ejabberd_riak:put(#sr_group{group_host = {Group, Host},
                                          opts = Opts},
+                              sr_group_schema(),
                                [{'2i', [{<<"host">>, Host}]}])};
 set_group_opts(Host, Group, Opts, odbc) ->
     SGroup = ejabberd_odbc:escape(Group),
@@ -562,7 +565,7 @@ get_user_groups(US, Host, mnesia) ->
       _ -> []
     end;
 get_user_groups(US, Host, riak) ->
-    case ejabberd_riak:get_by_index(sr_user, <<"us">>, US) of
+    case ejabberd_riak:get_by_index(sr_user, sr_user_schema(), <<"us">>, US) of
         {ok, Rs} ->
             [Group || #sr_user{group_host = {Group, H}} <- Rs, H == Host];
         _ ->
@@ -639,8 +642,8 @@ get_group_explicit_users(Host, Group, mnesia) ->
       _ -> []
     end;
 get_group_explicit_users(Host, Group, riak) ->
-    case ejabberd_riak:get_by_index(sr_user, <<"group_host">>,
-                                    {Group, Host}) of
+    case ejabberd_riak:get_by_index(sr_user, sr_user_schema(),
+                                   <<"group_host">>, {Group, Host}) of
         {ok, Rs} ->
             [R#sr_user.us || R <- Rs];
         _ ->
@@ -733,7 +736,7 @@ get_user_displayed_groups(LUser, LServer, GroupsOpts,
     end;
 get_user_displayed_groups(LUser, LServer, GroupsOpts,
                           riak) ->
-    case ejabberd_riak:get_by_index(sr_user,
+    case ejabberd_riak:get_by_index(sr_user, sr_user_schema(),
                                     <<"us">>, {LUser, LServer}) of
         {ok, Rs} ->
             [{Group, proplists:get_value(Group, GroupsOpts, [])}
@@ -788,7 +791,7 @@ is_user_in_group(US, Group, Host, mnesia) ->
       _ -> true
     end;
 is_user_in_group(US, Group, Host, riak) ->
-    case ejabberd_riak:get_by_index(sr_user, <<"us">>, US) of
+    case ejabberd_riak:get_by_index(sr_user, sr_user_schema(), <<"us">>, US) of
         {ok, Rs} ->
             case lists:any(
                    fun(#sr_user{group_host = {G, H}}) ->
@@ -844,6 +847,7 @@ add_user_to_group(Host, US, Group, mnesia) ->
 add_user_to_group(Host, US, Group, riak) ->
     {atomic, ejabberd_riak:put(
                #sr_user{us = US, group_host = {Group, Host}},
+              sr_user_schema(),
                [{i, {US, {Group, Host}}},
                 {'2i', [{<<"us">>, US},
                         {<<"group_host">>, {Group, Host}}]}])};
@@ -1358,6 +1362,12 @@ opts_to_binary(Opts) ->
               Opt
       end, Opts).
 
+sr_group_schema() ->
+    {record_info(fields, sr_group), #sr_group{}}.
+
+sr_user_schema() ->
+    {record_info(fields, sr_user), #sr_user{}}.
+
 update_tables() ->
     update_sr_group_table(),
     update_sr_user_table().
@@ -1439,12 +1449,13 @@ import(LServer) ->
 
 import(_LServer, mnesia, #sr_group{} = G) ->
     mnesia:dirty_write(G);
+
 import(_LServer, mnesia, #sr_user{} = U) ->
     mnesia:dirty_write(U);
 import(_LServer, riak, #sr_group{group_host = {_, Host}} = G) ->
-    ejabberd_riak:put(G, [{'2i', [{<<"host">>, Host}]}]);
+    ejabberd_riak:put(G, sr_group_schema(), [{'2i', [{<<"host">>, Host}]}]);
 import(_LServer, riak, #sr_user{us = US, group_host = {Group, Host}} = User) ->
-    ejabberd_riak:put(User,
+    ejabberd_riak:put(User, sr_user_schema(),
                       [{i, {US, {Group, Host}}},
                        {'2i', [{<<"us">>, US},
                                {<<"group_host">>, {Group, Host}}]}]);
index 6bfdcd22044ae56998593284f98953844afb0a59..0451a5193d22e07bdef8ec2ee2a35774bb371aac 100644 (file)
@@ -214,7 +214,7 @@ get_vcard(LUser, LServer, odbc) ->
       _ -> error
     end;
 get_vcard(LUser, LServer, riak) ->
-    case ejabberd_riak:get(vcard, {LUser, LServer}) of
+    case ejabberd_riak:get(vcard, vcard_schema(), {LUser, LServer}) of
         {ok, R} ->
             [R#vcard.vcard];
         {error, notfound} ->
@@ -301,6 +301,7 @@ set_vcard(User, LServer, VCARD) ->
              riak ->
                  US = {LUser, LServer},
                  ejabberd_riak:put(#vcard{us = US, vcard = VCARD},
+                                  vcard_schema(),
                                    [{'2i', [{<<"user">>, User},
                                             {<<"luser">>, LUser},
                                             {<<"fn">>, FN},
@@ -972,6 +973,9 @@ update_vcard_search_table() ->
          mnesia:transform_table(vcard_search, ignore, Fields)
     end.
 
+vcard_schema() ->
+    {record_info(fields, vcard), #vcard{}}.
+
 export(_Server) ->   
     [{vcard,
       fun(Host, #vcard{us = {LUser, LServer}, vcard = VCARD})
@@ -1121,7 +1125,7 @@ import(_LServer, riak, #vcard{us = {LUser, _}, vcard = El} = VCard) ->
     LEMail = string2lower(EMail),
     LOrgName = string2lower(OrgName),
     LOrgUnit = string2lower(OrgUnit),
-    ejabberd_riak:put(VCard,
+    ejabberd_riak:put(VCard, vcard_schema(),
                       [{'2i', [{<<"user">>, LUser},
                                {<<"luser">>, LUser},
                                {<<"fn">>, FN},
index 267b75ec594586c85054d616211da8b6b0aae56c..97d9abbb46fc81f3b92d76042bfcd4399bbd40fb 100644 (file)
@@ -90,7 +90,8 @@ add_xupdate(LUser, LServer, Hash, mnesia) ->
     mnesia:transaction(F);
 add_xupdate(LUser, LServer, Hash, riak) ->
     {atomic, ejabberd_riak:put(#vcard_xupdate{us = {LUser, LServer},
-                                              hash = Hash})};
+                                              hash = Hash},
+                              vcard_xupdate_schema())};
 add_xupdate(LUser, LServer, Hash, odbc) ->
     Username = ejabberd_odbc:escape(LUser),
     SHash = ejabberd_odbc:escape(Hash),
@@ -113,7 +114,8 @@ get_xupdate(LUser, LServer, mnesia) ->
       _ -> undefined
     end;
 get_xupdate(LUser, LServer, riak) ->
-    case ejabberd_riak:get(vcard_xupdate, {LUser, LServer}) of
+    case ejabberd_riak:get(vcard_xupdate, vcard_xupdate_schema(),
+                          {LUser, LServer}) of
         {ok, #vcard_xupdate{hash = Hash}} -> Hash;
         _ -> undefined
     end;
@@ -182,6 +184,9 @@ build_xphotoel(User, Host) ->
           attrs = [{<<"xmlns">>, ?NS_VCARD_UPDATE}],
           children = PhotoEl}.
 
+vcard_xupdate_schema() ->
+    {record_info(fields, vcard_xupdate), #vcard_xupdate{}}.
+
 update_table() ->
     Fields = record_info(fields, vcard_xupdate),
     case mnesia:table_info(vcard_xupdate, attributes) of
@@ -223,6 +228,6 @@ import(LServer) ->
 import(_LServer, mnesia, #vcard_xupdate{} = R) ->
     mnesia:dirty_write(R);
 import(_LServer, riak, #vcard_xupdate{} = R) ->
-    ejabberd_riak:put(R);
+    ejabberd_riak:put(R, vcard_xupdate_schema());
 import(_, _, _) ->
     pass.