From bda111b14531e90b3646d254d467b2fdb2236f47 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Fri, 24 Apr 2009 10:27:31 +0000 Subject: [PATCH] fix minor pubsub init glitch, and allow ejabberd_odbc to execute bloc of queries without transaction SVN Revision: 2038 --- ChangeLog | 8 ++++++++ src/mod_pubsub/mod_pubsub.erl | 20 ++++++++++---------- src/odbc/ejabberd_odbc.erl | 28 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec4108c53..efd6468b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-04-24 Christophe Romain + + * src/odbc/ejabberd_odbc.erl: allow to run query bloc as erlang + function without transaction + + * src/mod_pubsub/mod_pubsub.erl: do not register handlers and hooks + while plugins and ets tables are not initialized. + 2009-04-23 Christophe Romain * src/mod_pubsub/mod_pubsub.erl: improve send last published items diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index 1ce3f2cba..9bac6f39b 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -39,7 +39,7 @@ -module(mod_pubsub). -author('christophe.romain@process-one.net'). --version('1.12-03'). +-version('1.12-04'). -behaviour(gen_server). -behaviour(gen_mod). @@ -166,6 +166,14 @@ init([ServerHost, Opts]) -> PepOffline = gen_mod:get_opt(pep_sendlast_offline, Opts, false), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), mod_disco:register_feature(ServerHost, ?NS_PUBSUB), + {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), + ets:new(gen_mod:get_module_proc(Host, pubsub_state), [set, named_table]), + ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {nodetree, NodeTree}), + ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {plugins, Plugins}), + ets:new(gen_mod:get_module_proc(ServerHost, pubsub_state), [set, named_table]), + ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {nodetree, NodeTree}), + ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {plugins, Plugins}), + ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {pep_mapping, PepMapping}), ejabberd_hooks:add(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75), ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75), ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75), @@ -174,8 +182,6 @@ init([ServerHost, Opts]) -> ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50), gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc), gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER, ?MODULE, iq_sm, IQDisc), - ejabberd_router:register_route(Host), - {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), case lists:member(?PEPNODE, Plugins) of true -> ejabberd_hooks:add(disco_local_identity, ServerHost, ?MODULE, disco_local_identity, 75), @@ -186,14 +192,8 @@ init([ServerHost, Opts]) -> false -> ok end, + ejabberd_router:register_route(Host), update_database(Host), - ets:new(gen_mod:get_module_proc(Host, pubsub_state), [set, named_table]), - ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {nodetree, NodeTree}), - ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {plugins, Plugins}), - ets:new(gen_mod:get_module_proc(ServerHost, pubsub_state), [set, named_table]), - ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {nodetree, NodeTree}), - ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {plugins, Plugins}), - ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {pep_mapping, PepMapping}), init_nodes(Host, ServerHost), State = #state{host = Host, server_host = ServerHost, diff --git a/src/odbc/ejabberd_odbc.erl b/src/odbc/ejabberd_odbc.erl index d40cb7588..09a0ec8c9 100644 --- a/src/odbc/ejabberd_odbc.erl +++ b/src/odbc/ejabberd_odbc.erl @@ -34,6 +34,7 @@ sql_query/2, sql_query_t/1, sql_transaction/2, + sql_bloc/2, escape/1, escape_like/1, keep_alive/1]). @@ -87,6 +88,11 @@ sql_transaction(Host, F) -> gen_server:call(ejabberd_odbc_sup:get_random_pid(Host), {sql_transaction, F}, ?TRANSACTION_TIMEOUT). +%% SQL bloc, based on a erlang anonymous function (F = fun) +sql_bloc(Host, F) -> + gen_server:call(ejabberd_odbc_sup:get_random_pid(Host), + {sql_bloc, F}, ?TRANSACTION_TIMEOUT). + %% This function is intended to be used from inside an sql_transaction: sql_query_t(Query) -> State = get(?STATE_KEY), @@ -189,6 +195,17 @@ handle_call({sql_transaction, F}, _From, State) -> Reply -> {reply, Reply, State} end; +handle_call({sql_bloc, F}, _From, State) -> + case execute_bloc(State, F) of + % error returned by MySQL driver + {error, "query timed out"} -> + {stop, timeout, State}; + % error returned by MySQL driver + {error, "Failed sending data on socket"++_} = Reply -> + {stop, closed, Reply, State}; + Reply -> + {reply, Reply, State} + end; handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}. @@ -273,6 +290,17 @@ execute_transaction(State, F, NRestarts, _Reason) -> {atomic, Res} end. +execute_bloc(State, F) -> + put(?STATE_KEY, State), + case catch F() of + {aborted, Reason} -> + {aborted, Reason}; + {'EXIT', Reason} -> + {aborted, Reason}; + Res -> + {atomic, Res} + end. + %% == pure ODBC code %% part of init/1