aboutsummaryrefslogtreecommitdiff
path: root/src/mod_pubsub/pubsub_index.erl
diff options
context:
space:
mode:
authorChristophe Romain <christophe.romain@process-one.net>2009-04-30 05:18:06 +0000
committerChristophe Romain <christophe.romain@process-one.net>2009-04-30 05:18:06 +0000
commitf8780bc6ee15e738807531df2489173b7da19561 (patch)
tree0f03e2da5cdc312336716464125cf702101ebf97 /src/mod_pubsub/pubsub_index.erl
parent* src/ejabberd_hooks.erl: Support distributed hooks (EJAB-829) (diff)
PubSub/PEP API change for major optimization
SVN Revision: 2048
Diffstat (limited to 'src/mod_pubsub/pubsub_index.erl')
-rw-r--r--src/mod_pubsub/pubsub_index.erl65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/mod_pubsub/pubsub_index.erl b/src/mod_pubsub/pubsub_index.erl
new file mode 100644
index 000000000..2ba5d4b20
--- /dev/null
+++ b/src/mod_pubsub/pubsub_index.erl
@@ -0,0 +1,65 @@
+%%% ====================================================================
+%%% ``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-2009, ProcessOne
+%%% All Rights Reserved.''
+%%% This software is copyright 2006-2009, ProcessOne.
+%%%
+%%%
+%%% @copyright 2006-2009 ProcessOne
+%%% @author Christophe Romain <christophe.romain@process-one.net>
+%%% [http://www.process-one.net/]
+%%% @version {@vsn}, {@date} {@time}
+%%% @end
+%%% ====================================================================
+
+%% important note:
+%% new/1 and free/2 MUST be called inside a transaction bloc
+
+-module(pubsub_index).
+-author('christophe.romain@process-one.net').
+
+-include("pubsub.hrl").
+
+-export([init/3, new/1, free/2]).
+
+init(_Host, _ServerHost, _Opts) ->
+ mnesia:create_table(pubsub_index,
+ [{disc_copies, [node()]},
+ {attributes, record_info(fields, pubsub_index)}]).
+
+new(Index) ->
+ case mnesia:read({pubsub_index, Index}) of
+ [I] ->
+ case I#pubsub_index.free of
+ [] ->
+ Id = I#pubsub_index.last + 1,
+ mnesia:write(I#pubsub_index{last = Id}),
+ Id;
+ [Id|Free] ->
+ mnesia:write(I#pubsub_index{free = Free}),
+ Id
+ end;
+ _ ->
+ mnesia:write(#pubsub_index{index = Index, last = 1, free = []}),
+ 1
+ end.
+
+free(Index, Id) ->
+ case mnesia:read({pubsub_index, Index}) of
+ [I] ->
+ Free = I#pubsub_index.free,
+ mnesia:write(I#pubsub_index{free = [Id|Free]});
+ _ ->
+ ok
+ end.