From 22d83727dff5a7a523001170d5b7feced5b20b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonne=20Ha=C3=9F?= Date: Wed, 19 Aug 2015 18:21:04 +0200 Subject: [PATCH] Ensure close of statement --- spec/database_spec.cr | 30 ++++++++++++++++++++++++++++++ src/sqlite3/statement.cr | 1 + 2 files changed, 31 insertions(+) diff --git a/spec/database_spec.cr b/spec/database_spec.cr index 98d11e8..c081dcd 100644 --- a/spec/database_spec.cr +++ b/spec/database_spec.cr @@ -109,4 +109,34 @@ describe Database do it "gets first value" do with_db(&.get_first_value(%(select 1))).should eq(1) end + + it "ensures statements are closed" do + begin + Database.new(DB_FILENAME) do |db| + db.execute(%(create table if not exists a (i int not null, str text not null);)) + db.execute(%(insert into a (i, str) values (23, "bai bai");)) + end + + 2.times do |i| + Database.new(DB_FILENAME) do |db| + begin + db.query("SELECT i, str FROM a WHERE i = ?", 23) do |rs| + rs.next + break + end + rescue e : SQLite3::Exception + fail("Expected no exception, but got \"#{e.message}\"") + end + + begin + db.execute("UPDATE a SET i = ? WHERE i = ?", 23, 23) + rescue e : SQLite3::Exception + fail("Expected no exception, but got \"#{e.message}\"") + end + end + end + ensure + File.delete(DB_FILENAME) + end + end end diff --git a/src/sqlite3/statement.cr b/src/sqlite3/statement.cr index 5b85d92..2cef0ff 100644 --- a/src/sqlite3/statement.cr +++ b/src/sqlite3/statement.cr @@ -71,6 +71,7 @@ class SQLite3::Statement def execute(binds : Enumerable | Slice(UInt8), &block) result_set = execute(binds) yield result_set + ensure close end