From 02b7ba50fe3be38328440a3d97b88e1556aa3671 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Tue, 13 Jul 2010 22:08:16 +0200 Subject: [PATCH] Try forcing usage of cache for all MySQL sessions, and add correct timeout on odbc driver query. (thanks to Mickael Remond) --- src/odbc/ejabberd_odbc.erl | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/odbc/ejabberd_odbc.erl b/src/odbc/ejabberd_odbc.erl index eb3dbf282..e3e65aab4 100644 --- a/src/odbc/ejabberd_odbc.erl +++ b/src/odbc/ejabberd_odbc.erl @@ -39,7 +39,8 @@ sql_bloc/2, escape/1, escape_like/1, - keep_alive/1]). + keep_alive/1, + sql_query_on_all_connections/2]). %% gen_fsm callbacks -export([init/1, @@ -97,6 +98,13 @@ start_link(Host, StartInterval) -> sql_query(Host, Query) -> sql_call(Host, {sql_query, Query}). +%% Issue an SQL query on all the connections +sql_query_on_all_connections(Host, Query) -> + F = fun(Pid) -> ?GEN_FSM:sync_send_event(Pid, {sql_cmd, + {sql_query, Query}, + erlang:now()}, ?TRANSACTION_TIMEOUT) end, + lists:map(F, ejabberd_odbc_sup:get_pids(Host)). + %% SQL transaction based on a list of queries %% This function automatically sql_transaction(Host, Queries) when is_list(Queries) -> @@ -422,13 +430,15 @@ sql_query_internal(Query) -> State = get(?STATE_KEY), Res = case State#state.db_type of odbc -> - odbc:sql_query(State#state.db_ref, Query); + odbc:sql_query(State#state.db_ref, Query, ?TRANSACTION_TIMEOUT - 1000); pgsql -> + %% TODO: We need to propagate the TRANSACTION_TIMEOUT to pgsql driver, but no yet supported in driver. + %% See EJAB-1266 pgsql_to_odbc(pgsql:squery(State#state.db_ref, Query)); mysql -> ?DEBUG("MySQL, Send query~n~p~n", [Query]), R = mysql_to_odbc(mysql_conn:fetch(State#state.db_ref, - Query, self())), + Query, self(), ?TRANSACTION_TIMEOUT - 1000)), %% ?INFO_MSG("MySQL, Received result~n~p~n", [R]), R end, @@ -502,6 +512,7 @@ mysql_connect(Server, Port, DB, Username, Password) -> case mysql_conn:start(Server, Port, Username, Password, DB, fun log/3) of {ok, Ref} -> mysql_conn:fetch(Ref, ["set names 'utf8';"], self()), + mysql_conn:fetch(Ref, ["SET SESSION query_cache_type=1;"], self()), {ok, Ref}; Err -> Err