From d7fdf1eada852ea084b7b9786e149094ec5270e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Gir=C3=A1ldez?= Date: Wed, 28 Sep 2016 16:45:38 -0300 Subject: [PATCH] Release DB connection if an exception occurs during execution of a query --- src/db/statement.cr | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/db/statement.cr b/src/db/statement.cr index f6573f0..e1fc699 100644 --- a/src/db/statement.cr +++ b/src/db/statement.cr @@ -80,17 +80,17 @@ module DB # See `QueryMethods#query` def query - perform_query Tuple.new + perform_query_with_rescue Tuple.new end # See `QueryMethods#query` def query(args : Array) - perform_query args + perform_query_with_rescue args end # See `QueryMethods#query` def query(*args) - perform_query args + perform_query_with_rescue args end private def perform_exec_and_release(args : Enumerable) : ExecResult @@ -99,6 +99,15 @@ module DB release_connection end + private def perform_query_with_rescue(args : Enumerable) : ResultSet + return perform_query(args) + rescue e : Exception + # Release connection only when an exception occurs during the query + # execution since we need the connection open while the ResultSet is open + release_connection + raise e + end + protected abstract def perform_query(args : Enumerable) : ResultSet protected abstract def perform_exec(args : Enumerable) : ExecResult end