summaryrefslogtreecommitdiff
path: root/src/mod_mam.erl
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2016-01-13 23:01:51 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2016-01-13 23:01:51 +0100
commit9cd048c442b0183280730945eb19c3e850a7c21e (patch)
tree739111a302b99a4fd61404ca4184b177695ec41b /src/mod_mam.erl
parentmod_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.erl12
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