From f4b298d3a5a6c555e02fd681e5f0da6680e44e84 Mon Sep 17 00:00:00 2001 From: "Brian J. Cardiff" Date: Wed, 25 Mar 2020 10:56:03 -0300 Subject: [PATCH] Use select / timeout in Crystal 0.34 --- src/db/pool.cr | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/db/pool.cr b/src/db/pool.cr index 5acffaa..75a8f93 100644 --- a/src/db/pool.cr +++ b/src/db/pool.cr @@ -206,25 +206,38 @@ module DB @idle.first? end - private def wait_for_available - timeout = TimeoutHelper.new(@checkout_timeout.to_f64) - sync_inc_waiting_resource + {% if compare_versions(Crystal::VERSION, "0.34.0-0") > 0 %} + private def wait_for_available + sync_inc_waiting_resource - timeout.start - - # TODO update to select keyword for crystal 0.19 - index, _ = Channel.select(@availability_channel.receive_select_action, timeout.receive_select_action) - case index - when 0 - timeout.cancel - sync_dec_waiting_resource - when 1 - sync_dec_waiting_resource - raise DB::PoolTimeout.new - else - raise DB::Error.new + select + when @availability_channel.receive + sync_dec_waiting_resource + when timeout(@checkout_timeout.seconds) + sync_dec_waiting_resource + raise DB::PoolTimeout.new + end end - end + {% else %} + private def wait_for_available + timeout = TimeoutHelper.new(@checkout_timeout.to_f64) + sync_inc_waiting_resource + + timeout.start + + index, _ = Channel.select(@availability_channel.receive_select_action, timeout.receive_select_action) + case index + when 0 + timeout.cancel + sync_dec_waiting_resource + when 1 + sync_dec_waiting_resource + raise DB::PoolTimeout.new + else + raise DB::Error.new + end + end + {% end %} private def sync_inc_waiting_resource sync { @waiting_resource += 1 }