ensure the connection is released after exec

avoid releasing connection twice on exec.
avoid releasing connection when QueryMethod#query is blockless called.
This commit is contained in:
Brian J. Cardiff 2016-08-29 01:23:20 -03:00
parent b5112d9a48
commit 325fa9d4ae
5 changed files with 23 additions and 15 deletions

View file

@ -49,6 +49,7 @@ class DummyDriver < DB::Driver
protected def perform_exec(args : Enumerable)
set_params args
raise "forced exception due to query" if @query == "raise"
DB::ExecResult.new 0i64, 0_i64
end

View file

@ -237,6 +237,14 @@ describe DummyDriver do
end
end
it "should raise executing raise query" do
with_dummy do |db|
expect_raises do
db.exec "raise"
end
end
end
{% for value in [1, 1_i64, "hello", 1.5, 1.5_f32] %}
it "should set positional arguments for {{value.id}}" do
with_dummy do |db|

View file

@ -118,4 +118,13 @@ describe DB::Statement do
rs.statement.should be(stmt)
end
end
it "connection should be released if error occurs during exec" do
with_dummy do |db|
expect_raises do
db.exec "raise"
end
db.@in_pool.should be_true
end
end
end

View file

@ -35,7 +35,7 @@ module DB
# end
# ```
def query(query, *args)
prepare query, &.query(*args)
prepare(query).query(*args)
end
# Executes a *query* and yields a `ResultSet` with the results.
@ -200,23 +200,13 @@ module DB
# Performs the `query` and returns an `ExecResult`
def exec(query, *args)
prepare query, &.exec(*args)
prepare(query).exec(*args)
end
# Performs the `query` and returns a single scalar value
# puts db.scalar("SELECT MAX(name)").as(String) # => (a String)
def scalar(query, *args)
prepare query, &.scalar(*args)
end
private def prepare(query)
stm = prepare(query)
begin
yield stm
rescue ex
stm.release_connection
raise ex
end
prepare(query).scalar(*args)
end
end
end

View file

@ -74,9 +74,9 @@ module DB
end
private def perform_exec_and_release(args : Enumerable) : ExecResult
res = perform_exec(args)
return perform_exec(args)
ensure
release_connection
res
end
protected abstract def perform_query(args : Enumerable) : ResultSet