aboutsummaryrefslogtreecommitdiff
path: root/src/odbc/ejabberd_odbc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/odbc/ejabberd_odbc.erl')
-rw-r--r--src/odbc/ejabberd_odbc.erl24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/odbc/ejabberd_odbc.erl b/src/odbc/ejabberd_odbc.erl
index e4f383fe2..b5c401579 100644
--- a/src/odbc/ejabberd_odbc.erl
+++ b/src/odbc/ejabberd_odbc.erl
@@ -18,7 +18,8 @@
sql_query_t/1,
sql_transaction/2,
escape/1,
- escape_like/1]).
+ escape_like/1,
+ keep_alive/1]).
%% gen_server callbacks
-export([init/1,
@@ -37,6 +38,8 @@
-define(PGSQL_PORT, 5432).
-define(MYSQL_PORT, 3306).
+-define(KEEPALIVE_QUERY, "SELECT 1;").
+
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
@@ -51,7 +54,7 @@ sql_query(Host, Query) ->
{sql_query, Query}, 60000).
%% SQL transaction based on a list of queries
-%% This function automatically
+%% This function automatically
sql_transaction(Host, Queries) when is_list(Queries) ->
F = fun() ->
lists:foreach(fun(Query) ->
@@ -112,6 +115,14 @@ escape_like(C) -> odbc_queries:escape(C).
%% {stop, Reason}
%%----------------------------------------------------------------------
init([Host]) ->
+ case ejabberd_config:get_local_option({odbc_keepalive_interval, Host}) of
+ Interval when is_integer(Interval) ->
+ timer:apply_interval(Interval*1000, ?MODULE, keep_alive, [self()]);
+ undefined ->
+ ok;
+ _Other ->
+ ?ERROR_MSG("Wrong odbc_keepalive_interval definition '~p' for host ~p.~n", [_Other, Host])
+ end,
SQLServer = ejabberd_config:get_local_option({odbc_server, Host}),
case SQLServer of
%% Default pgsql port
@@ -128,7 +139,6 @@ init([Host]) ->
odbc_connect(SQLServer)
end.
-
%%----------------------------------------------------------------------
%% Func: handle_call/3
%% Returns: {reply, Reply, State} |
@@ -220,7 +230,7 @@ execute_transaction(State, F, NRestarts) ->
%% Open an ODBC database connection
odbc_connect(SQLServer) ->
case odbc:connect(SQLServer,[{scrollable_cursors, off}]) of
- {ok, Ref} ->
+ {ok, Ref} ->
erlang:monitor(process, Ref),
{ok, #state{db_ref = Ref, db_type = odbc}};
{error, Reason} ->
@@ -238,7 +248,7 @@ odbc_connect(SQLServer) ->
%% Open a database connection to PostgreSQL
pgsql_connect(Server, Port, DB, Username, Password) ->
case pgsql:connect(Server, DB, Username, Password, Port) of
- {ok, Ref} ->
+ {ok, Ref} ->
{ok, #state{db_ref = Ref, db_type = pgsql}};
{error, Reason} ->
?ERROR_MSG("PostgreSQL connection failed: ~p~n", [Reason]),
@@ -306,3 +316,7 @@ mysql_item_to_odbc(Columns, Recs) ->
{selected,
[element(2, Column) || Column <- Columns],
[list_to_tuple(Rec) || Rec <- Recs]}.
+
+% perform a harmless query on all opened connexions to avoid connexion close.
+keep_alive(PID) ->
+ gen_server:call(PID, {sql_query, ?KEEPALIVE_QUERY}, 60000).