diff --git a/spec/custom_drivers_types_spec.cr b/spec/custom_drivers_types_spec.cr index 11267f4..1a4f333 100644 --- a/spec/custom_drivers_types_spec.cr +++ b/spec/custom_drivers_types_spec.cr @@ -66,12 +66,21 @@ class FooDriver < DB::Driver class FooStatement < DB::Statement protected def perform_query(args : Enumerable) : DB::ResultSet + args.each { |arg| process_arg arg } FooResultSet.new(self, FooDriver.fake_row) end protected def perform_exec(args : Enumerable) : DB::ExecResult + args.each { |arg| process_arg arg } DB::ExecResult.new 0i64, 0i64 end + + private def process_arg(value : FooDriver::Any) + end + + private def process_arg(value) + raise "#{self.class} does not support #{value.class} params" + end end class FooResultSet < DB::ResultSet @@ -120,12 +129,21 @@ class BarDriver < DB::Driver class BarStatement < DB::Statement protected def perform_query(args : Enumerable) : DB::ResultSet + args.each { |arg| process_arg arg } BarResultSet.new(self, BarDriver.fake_row) end protected def perform_exec(args : Enumerable) : DB::ExecResult + args.each { |arg| process_arg arg } DB::ExecResult.new 0i64, 0i64 end + + private def process_arg(value : BarDriver::Any) + end + + private def process_arg(value) + raise "#{self.class} does not support #{value.class} params" + end end class BarResultSet < DB::ResultSet @@ -232,7 +250,7 @@ describe DB do db.query "query", 1, "string" { } db.query("query", Slice(UInt8).new(4)) { } db.query("query", 1, "string", BarValue.new(5)) { } - db.query "query", [1, "string", FooValue.new(5)] { } + db.query "query", [1, "string", BarValue.new(5)] { } db.query("query").close db.query("query", 1).close @@ -264,4 +282,18 @@ describe DB do db.exec("query", [1, "string", BarValue.new(5)]) end end + + it "Foo and Bar drivers should not implement each other params" do + DB.open("foo://host") do |db| + expect_raises Exception, "FooDriver::FooStatement does not support BarValue params" do + db.exec("query", [BarValue.new(5)]) + end + end + + DB.open("bar://host") do |db| + expect_raises Exception, "BarDriver::BarStatement does not support FooValue params" do + db.exec("query", [FooValue.new(5)]) + end + end + end end diff --git a/spec/dummy_driver.cr b/spec/dummy_driver.cr index 21f724e..e9b4ffc 100644 --- a/spec/dummy_driver.cr +++ b/spec/dummy_driver.cr @@ -55,10 +55,18 @@ class DummyDriver < DB::Driver private def set_params(args) @params.clear args.each_with_index do |arg, index| - @params[index] = arg.as(DB::Any) + set_param(index, arg) end end + private def set_param(index, value : DB::Any) + @params[index] = value + end + + private def set_param(index, value) + raise "not implemented for #{value.class}" + end + protected def do_close super end