From 39e17f82ca1ce15145f68f0c21e9d1b00cb2f21b Mon Sep 17 00:00:00 2001 From: "Brian J. Cardiff" Date: Mon, 10 Apr 2017 12:48:48 -0300 Subject: [PATCH] Add #query_each . Fixes #18 --- spec/dummy_driver_spec.cr | 18 ++++++++++++++++++ src/db/query_methods.cr | 22 ++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/spec/dummy_driver_spec.cr b/spec/dummy_driver_spec.cr index e24af78..f82f12e 100644 --- a/spec/dummy_driver_spec.cr +++ b/spec/dummy_driver_spec.cr @@ -208,6 +208,24 @@ describe DummyDriver do end end + describe "query each" do + it "queries" do + with_dummy do |db| + i = 0 + db.query_each "3,4 1,2" do |rs| + case i + when 0 + rs.read(Int64, Int64).should eq({3i64, 4i64}) + when 1 + rs.read(Int64, Int64).should eq({1i64, 2i64}) + end + i += 1 + end + i.should eq(2) + end + end + end + it "reads multiple values" do with_dummy do |db| db.query "3,4 1,2" do |rs| diff --git a/src/db/query_methods.cr b/src/db/query_methods.cr index 6dcac1b..33b732a 100644 --- a/src/db/query_methods.cr +++ b/src/db/query_methods.cr @@ -166,10 +166,8 @@ module DB # ``` def query_all(query, *args, &block : ResultSet -> U) : Array(U) forall U ary = [] of U - query(query, *args) do |rs| - rs.each do - ary.push(yield rs) - end + query_each(query, *args) do |rs| + ary.push(yield rs) end ary end @@ -198,6 +196,22 @@ module DB end end + # Executes a *query* and yields the `ResultSet` once per each row. + # The `ResultSet` is closed automatically. + # + # ``` + # db.query_each "select name from contacts" do |rs| + # puts rs.read(String) + # end + # ``` + def query_each(query, *args) + query(query, *args) do |rs| + rs.each do + yield rs + end + end + end + # Performs the `query` and returns an `ExecResult` def exec(query, *args) build(query).exec(*args)