diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2016-01-13 23:01:51 +0100 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2016-01-13 23:01:51 +0100 |
commit | 9cd048c442b0183280730945eb19c3e850a7c21e (patch) | |
tree | 739111a302b99a4fd61404ca4184b177695ec41b /src/mod_mam.erl | |
parent | mod_mam: Add "delete_old_mam_messages" command (diff) |
mod_mam: Improve binary comparison of message UIDs
Make sure the binary comparison performed when clients use message UIDs
to page through Mnesia archives yields correct results even if the
specified UIDs don't have the same number of digits as the UIDs of the
stored messages. This way, MAM will continue to work as expected after
migrating from mod_mam_mnesia to mod_mam.
Diffstat (limited to 'src/mod_mam.erl')
-rw-r--r-- | src/mod_mam.erl | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 1398cf1b..1bcf1b0d 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -44,6 +44,13 @@ -include("mod_muc_room.hrl"). -include("ejabberd_commands.hrl"). +-define(BIN_GREATER_THAN(A, B), + ((A > B andalso byte_size(A) == byte_size(B)) + orelse byte_size(A) > byte_size(B))). +-define(BIN_LESS_THAN(A, B), + ((A < B andalso byte_size(A) == byte_size(B)) + orelse byte_size(A) < byte_size(B))). + -record(archive_msg, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$2', id = <<>> :: binary() | '_', @@ -1014,11 +1021,12 @@ filter_by_rsm(Msgs, #rsm_in{max = Max, direction = Direction, id = ID}) -> aft when ID /= <<"">> -> lists:filter( fun(#archive_msg{id = I}) -> - I > ID + ?BIN_GREATER_THAN(I, ID) end, Msgs); before when ID /= <<"">> -> lists:foldl( - fun(#archive_msg{id = I} = Msg, Acc) when I < ID -> + fun(#archive_msg{id = I} = Msg, Acc) + when ?BIN_LESS_THAN(I, ID) -> [Msg|Acc]; (_, Acc) -> Acc |