summaryrefslogtreecommitdiff
path: root/src/mod_offline.erl
diff options
context:
space:
mode:
authortmallard <tmallard@null>2005-04-17 18:08:34 +0000
committertmallard <tmallard@null>2005-04-17 18:08:34 +0000
commit374446f8471747c878cdaf760c4bb37d17493ab7 (patch)
treee91bac5669555dcf33627e4745b04236f743126d /src/mod_offline.erl
parent* src/ejabberd_c2s.erl: Send new id for each new stream inside one (diff)
Merged the Process One contributions ( Virtual Hosting )
SVN Revision: 307
Diffstat (limited to 'src/mod_offline.erl')
-rw-r--r--src/mod_offline.erl100
1 files changed, 83 insertions, 17 deletions
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index b59987e4..3d7bd0e0 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -15,16 +15,16 @@
init/0,
stop/0,
store_packet/3,
- resend_offline_messages/1,
- pop_offline_messages/2,
+ resend_offline_messages/2,
+ pop_offline_messages/3,
remove_expired_messages/0,
remove_old_messages/1,
- remove_user/1]).
+ remove_user/2]).
-include("ejabberd.hrl").
-include("jlib.hrl").
--record(offline_msg, {user, timestamp, expire, from, to, packet}).
+-record(offline_msg, {us, timestamp, expire, from, to, packet}).
-define(PROCNAME, ejabberd_offline).
-define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000).
@@ -97,11 +97,11 @@ store_packet(From, To, Packet) ->
(Type /= "error") and (Type /= "groupchat") ->
case check_event(From, To, Packet) of
true ->
- #jid{luser = LUser} = To,
+ #jid{luser = LUser, lserver = LServer} = To,
TimeStamp = now(),
{xmlelement, _Name, _Attrs, Els} = Packet,
Expire = find_x_expire(TimeStamp, Els),
- ?PROCNAME ! #offline_msg{user = LUser,
+ ?PROCNAME ! #offline_msg{us = {LUser, LServer},
timestamp = TimeStamp,
expire = Expire,
from = From,
@@ -189,11 +189,13 @@ find_x_expire(TimeStamp, [El | Els]) ->
end.
-resend_offline_messages(User) ->
+resend_offline_messages(User, Server) ->
LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
F = fun() ->
- Rs = mnesia:wread({offline_msg, LUser}),
- mnesia:delete({offline_msg, LUser}),
+ Rs = mnesia:wread({offline_msg, US}),
+ mnesia:delete({offline_msg, US}),
Rs
end,
case mnesia:transaction(F) of
@@ -216,11 +218,13 @@ resend_offline_messages(User) ->
ok
end.
-pop_offline_messages(Ls, User) ->
+pop_offline_messages(Ls, User, Server) ->
LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
F = fun() ->
- Rs = mnesia:wread({offline_msg, LUser}),
- mnesia:delete({offline_msg, LUser}),
+ Rs = mnesia:wread({offline_msg, US}),
+ mnesia:delete({offline_msg, US}),
Rs
end,
case mnesia:transaction(F) of
@@ -290,10 +294,12 @@ remove_old_messages(Days) ->
end,
mnesia:transaction(F).
-remove_user(User) ->
+remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
+ LServer = jlib:nameprep(Server),
+ US = {LUser, LServer},
F = fun() ->
- mnesia:delete({offline_msg, LUser})
+ mnesia:delete({offline_msg, US})
end,
mnesia:transaction(F).
@@ -302,23 +308,83 @@ update_table() ->
case mnesia:table_info(offline_msg, attributes) of
Fields ->
ok;
+ [user, timestamp, expire, from, to, packet] ->
+ ?INFO_MSG("Converting offline_msg table from "
+ "{user, timestamp, expire, from, to, packet} format", []),
+ Host = ?MYNAME,
+ {atomic, ok} = mnesia:create_table(
+ mod_offline_tmp_table,
+ [{disc_only_copies, [node()]},
+ {type, bag},
+ {local_content, true},
+ {record_name, offline_msg},
+ {attributes, record_info(fields, offline_msg)}]),
+ mnesia:transform_table(offline_msg, ignore, Fields),
+ F1 = fun() ->
+ mnesia:write_lock_table(mod_offline_tmp_table),
+ mnesia:foldl(
+ fun(#offline_msg{us = U} = R, _) ->
+ mnesia:dirty_write(
+ mod_offline_tmp_table,
+ R#offline_msg{us = {U, Host}})
+ end, ok, offline_msg)
+ end,
+ mnesia:transaction(F1),
+ mnesia:clear_table(offline_msg),
+ F2 = fun() ->
+ mnesia:write_lock_table(offline_msg),
+ mnesia:foldl(
+ fun(R, _) ->
+ mnesia:dirty_write(R)
+ end, ok, mod_offline_tmp_table)
+ end,
+ mnesia:transaction(F2),
+ mnesia:delete_table(mod_offline_tmp_table);
[user, timestamp, from, to, packet] ->
?INFO_MSG("Converting offline_msg table from "
"{user, timestamp, from, to, packet} format", []),
+ Host = ?MYNAME,
+ {atomic, ok} = mnesia:create_table(
+ mod_offline_tmp_table,
+ [{disc_only_copies, [node()]},
+ {type, bag},
+ {local_content, true},
+ {record_name, offline_msg},
+ {attributes, record_info(fields, offline_msg)}]),
mnesia:transform_table(
offline_msg,
fun({_, U, TS, F, T, P}) ->
{xmlelement, _Name, _Attrs, Els} = P,
Expire = find_x_expire(TS, Els),
- #offline_msg{user = U,
+ #offline_msg{us = U,
timestamp = TS,
expire = Expire,
from = F,
to = T,
packet = P}
- end, Fields);
+ end, Fields),
+ F1 = fun() ->
+ mnesia:write_lock_table(mod_offline_tmp_table),
+ mnesia:foldl(
+ fun(#offline_msg{us = U} = R, _) ->
+ mnesia:dirty_write(
+ mod_offline_tmp_table,
+ R#offline_msg{us = {U, Host}})
+ end, ok, offline_msg)
+ end,
+ mnesia:transaction(F1),
+ mnesia:clear_table(offline_msg),
+ F2 = fun() ->
+ mnesia:write_lock_table(offline_msg),
+ mnesia:foldl(
+ fun(R, _) ->
+ mnesia:dirty_write(R)
+ end, ok, mod_offline_tmp_table)
+ end,
+ mnesia:transaction(F2),
+ mnesia:delete_table(mod_offline_tmp_table);
_ ->
?INFO_MSG("Recreating offline_msg table", []),
- mnesia:transform_table(last_activity, ignore, Fields)
+ mnesia:transform_table(offline_msg, ignore, Fields)
end.