From b3c15869884e82705e3d30e7b28ae7160ea36a0e Mon Sep 17 00:00:00 2001 From: Julien Portalier Date: Wed, 13 Jan 2016 00:28:59 +0100 Subject: [PATCH] Fix: try to recover from idle/broken pg connection (take 2) --- src/database/postgresql.cr | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/database/postgresql.cr b/src/database/postgresql.cr index 3d2440a..d73299e 100644 --- a/src/database/postgresql.cr +++ b/src/database/postgresql.cr @@ -37,37 +37,35 @@ module Frost end def execute(sql) + log(sql) __retry_on_connection_error { __execute(sql) } end def execute(types, sql) + log(sql) __retry_on_connection_error { __execute(types, sql) } end private def __retry_on_connection_error yield rescue ex : PG::Error - if ex.message == "Connection not open" - begin - conn.reset - rescue err : PG::ConnectionError - raise ConnectionError.new(err.message) - end - yield - else - raise ex + begin + log("Rescued PG::Error: #{ex.message}") + conn.reset + rescue err : PG::ConnectionError + raise ConnectionError.new(err.message) end + + yield end private def __execute(sql) - log(sql) conn.exec(sql) rescue ex : PG::ResultError raise StatementInvalid.new(ex.message) end private def __execute(types, sql) - log(sql) conn.exec(types, sql) rescue ex : PG::ResultError raise StatementInvalid.new(ex.message)