From 8c0313a306dd687ad06eb793f594447e7fd382e3 Mon Sep 17 00:00:00 2001 From: "Brian J. Cardiff" Date: Sun, 31 Jan 2016 14:01:52 -0300 Subject: [PATCH] add Connection#last_inserted_id extract QueryMethods modules and use it in Database and Connection "add" finalize methods, but they cause GC warnings --- spec/std/db/dummy_driver.cr | 4 ++++ src/db/connection.cr | 9 +++++++++ src/db/database.cr | 35 +--------------------------------- src/db/db.cr | 1 + src/db/query_methods.cr | 38 +++++++++++++++++++++++++++++++++++++ src/db/statement.cr | 9 +++++++-- 6 files changed, 60 insertions(+), 36 deletions(-) create mode 100644 src/db/query_methods.cr diff --git a/spec/std/db/dummy_driver.cr b/spec/std/db/dummy_driver.cr index 9784ca1..d8abe1c 100644 --- a/spec/std/db/dummy_driver.cr +++ b/spec/std/db/dummy_driver.cr @@ -12,6 +12,10 @@ class DummyDriver < DB::Driver @last_statement = DummyStatement.new(self, query.split.map { |r| r.split ',' }) end + def last_insert_id : Int64 + 0 + end + def perform_close end end diff --git a/src/db/connection.cr b/src/db/connection.cr index 2b515d5..d2e1b94 100644 --- a/src/db/connection.cr +++ b/src/db/connection.cr @@ -18,8 +18,17 @@ module DB @closed end + # # :nodoc: + # def finalize + # close unless closed? + # end + abstract def prepare(query) : Statement + include QueryMethods + + abstract def last_insert_id : Int64 + protected abstract def perform_close end end diff --git a/src/db/database.cr b/src/db/database.cr index 466035b..9fbd0ab 100644 --- a/src/db/database.cr +++ b/src/db/database.cr @@ -31,39 +31,6 @@ module DB connection.prepare(query) end - def query(query, *args) - prepare(query).query(*args) - end - - def query(query, *args) - # CHECK prepare(query).query(*args, &block) - query(query, *args).tap do |rs| - begin - yield rs - ensure - rs.close - end - end - end - - def exec(query, *args) - prepare(query).exec(*args) - end - - def scalar(query, *args) - prepare(query).scalar(*args) - end - - def scalar(t, query, *args) - prepare(query).scalar(t, *args) - end - - def scalar?(query, *args) - prepare(query).scalar?(*args) - end - - def scalar?(t, query, *args) - prepare(query).scalar?(t, *args) - end + include QueryMethods end end diff --git a/src/db/db.cr b/src/db/db.cr index 74acd3b..455e631 100644 --- a/src/db/db.cr +++ b/src/db/db.cr @@ -24,6 +24,7 @@ module DB end end +require "./query_methods" require "./database" require "./driver" require "./connection" diff --git a/src/db/query_methods.cr b/src/db/query_methods.cr new file mode 100644 index 0000000..e13e5b2 --- /dev/null +++ b/src/db/query_methods.cr @@ -0,0 +1,38 @@ +module DB + module QueryMethods + def query(query, *args) + prepare(query).query(*args) + end + + def query(query, *args) + # CHECK prepare(query).query(*args, &block) + query(query, *args).tap do |rs| + begin + yield rs + ensure + rs.close + end + end + end + + def exec(query, *args) + prepare(query).exec(*args) + end + + def scalar(query, *args) + prepare(query).scalar(*args) + end + + def scalar(t, query, *args) + prepare(query).scalar(t, *args) + end + + def scalar?(query, *args) + prepare(query).scalar?(*args) + end + + def scalar?(t, query, *args) + prepare(query).scalar?(t, *args) + end + end +end diff --git a/src/db/statement.cr b/src/db/statement.cr index 563b498..ffcd8cf 100644 --- a/src/db/statement.cr +++ b/src/db/statement.cr @@ -24,7 +24,7 @@ module DB end end - raise "unreachable" + raise "no results" end def scalar?(*args) @@ -39,7 +39,7 @@ module DB end end - raise "unreachable" + raise "no results" end def query(*args) @@ -92,6 +92,11 @@ module DB @closed end + # # :nodoc: + # def finalize + # close unless closed? + # end + # 1-based positional arguments protected def begin_parameters end