diff --git a/src/mod_offline.erl b/src/mod_offline.erl index d81022fdd..f6870adc0 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -123,10 +123,7 @@ store_offline_msg(_Host, US, Msgs, Len, MaxOfflineMsgs, mnesia) -> F = fun () -> Count = if MaxOfflineMsgs =/= infinity -> - Len + - p1_mnesia:count_records(offline_msg, - #offline_msg{us = US, - _ = '_'}); + Len + count_mnesia_records(US); true -> 0 end, if Count > MaxOfflineMsgs -> discard_warn_sender(Msgs); @@ -986,8 +983,7 @@ count_offline_messages(User, Server) -> count_offline_messages(LUser, LServer, mnesia) -> US = {LUser, LServer}, F = fun () -> - p1_mnesia:count_records(offline_msg, - #offline_msg{us = US, _ = '_'}) + count_mnesia_records(US) end, case catch mnesia:async_dirty(F) of I when is_integer(I) -> I; @@ -1016,6 +1012,32 @@ count_offline_messages(_Acc, User, Server) -> N = count_offline_messages(User, Server), {stop, N}. +%% Return the number of records matching a given match expression. +%% This function is intended to be used inside a Mnesia transaction. +%% The count has been written to use the fewest possible memory by +%% getting the record by small increment and by using continuation. +-define(BATCHSIZE, 100). + +count_mnesia_records(US) -> + MatchExpression = #offline_msg{us = US, _ = '_'}, + case mnesia:select(offline_msg, [{MatchExpression, [], [[]]}], + ?BATCHSIZE, read) of + {Result, Cont} -> + Count = length(Result), + count_records_cont(Cont, Count); + '$end_of_table' -> + 0 + end. + +count_records_cont(Cont, Count) -> + case mnesia:select(Cont) of + {Result, Cont} -> + NewCount = Count + length(Result), + count_records_cont(Cont, NewCount); + '$end_of_table' -> + Count + end. + offline_msg_schema() -> {record_info(fields, offline_msg), #offline_msg{}}. diff --git a/src/p1_mnesia.erl b/src/p1_mnesia.erl deleted file mode 100644 index b792472a6..000000000 --- a/src/p1_mnesia.erl +++ /dev/null @@ -1,49 +0,0 @@ -%%% ==================================================================== -%%% ``The contents of this file are subject to the Erlang Public License, -%%% Version 1.1, (the "License"); you may not use this file except in -%%% compliance with the License. You should have received a copy of the -%%% Erlang Public License along with this software. If not, it can be -%%% retrieved via the world wide web at http://www.erlang.org/. -%%% -%%% -%%% Software distributed under the License is distributed on an "AS IS" -%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See -%%% the License for the specific language governing rights and limitations -%%% under the License. -%%% -%%% -%%% The Initial Developer of the Original Code is ProcessOne. -%%% Portions created by ProcessOne are Copyright 2006-2014, ProcessOne -%%% All Rights Reserved.'' -%%% -%%% This software is copyright 2006-2014, ProcessOne. - --module(p1_mnesia). - --author('mickael.remond@process-one.net'). - --export([count_records/2]). - -%% Return the number of records matching a given match expression. -%% This function is intended to be used inside a Mnesia transaction. -%% The count has been written to use the fewest possible memory by -%% getting the record by small increment and by using continuation. --define(BATCHSIZE, 100). - -count_records(Tab, MatchExpression) -> - case mnesia:select(Tab, [{MatchExpression, [], [[]]}], - ?BATCHSIZE, read) - of - {Result, Cont} -> - Count = length(Result), - count_records_cont(Cont, Count); - '$end_of_table' -> 0 - end. - -count_records_cont(Cont, Count) -> - case mnesia:select(Cont) of - {Result, Cont} -> - NewCount = Count + length(Result), - count_records_cont(Cont, NewCount); - '$end_of_table' -> Count - end.