mirror of
https://gitea.invidious.io/iv-org/shard-crystal-db.git
synced 2024-08-15 00:53:32 +00:00
allow specs to use multiple drivers
This commit is contained in:
parent
d69555b372
commit
312609b722
2 changed files with 139 additions and 5 deletions
134
spec/custom_drivers_types_spec.cr
Normal file
134
spec/custom_drivers_types_spec.cr
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
require "./spec_helper"
|
||||||
|
|
||||||
|
class GenericResultSet(T) < DB::ResultSet
|
||||||
|
def initialize(statement, @row : Array(T))
|
||||||
|
super(statement)
|
||||||
|
@index = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def move_next
|
||||||
|
@index = 0
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def column_count : Int32
|
||||||
|
@row.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def column_name(index : Int32) : String
|
||||||
|
index.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def column_type(index : Int32)
|
||||||
|
@row[index].class
|
||||||
|
end
|
||||||
|
|
||||||
|
{% for t in DB::TYPES %}
|
||||||
|
# Reads the next column as a nillable {{t}}.
|
||||||
|
def read?(t : {{t}}.class) : {{t}}?
|
||||||
|
@index += 1
|
||||||
|
@row[@index - 1] as {{t}}?
|
||||||
|
end
|
||||||
|
{% end %}
|
||||||
|
end
|
||||||
|
|
||||||
|
class FooDriver < DB::Driver
|
||||||
|
@@row = [] of DB::Any
|
||||||
|
|
||||||
|
def self.fake_row=(row : Array(DB::Any))
|
||||||
|
@@row = row
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.fake_row
|
||||||
|
@@row
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_connection(db : DB::Database) : DB::Connection
|
||||||
|
FooConnection.new(db)
|
||||||
|
end
|
||||||
|
|
||||||
|
class FooConnection < DB::Connection
|
||||||
|
def build_statement(query)
|
||||||
|
FooStatement.new(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class FooStatement < DB::Statement
|
||||||
|
protected def perform_query(args : Slice(DB::Any)) : DB::ResultSet
|
||||||
|
GenericResultSet(DB::Any).new(self, FooDriver.fake_row)
|
||||||
|
end
|
||||||
|
|
||||||
|
protected def perform_exec(args : Slice(DB::Any)) : DB::ExecResult
|
||||||
|
raise "Not implemented"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
DB.register_driver "foo", FooDriver
|
||||||
|
|
||||||
|
class BarDriver < DB::Driver
|
||||||
|
@@row = [] of DB::Any
|
||||||
|
|
||||||
|
def self.fake_row=(row : Array(DB::Any))
|
||||||
|
@@row = row
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.fake_row
|
||||||
|
@@row
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_connection(db : DB::Database) : DB::Connection
|
||||||
|
BarConnection.new(db)
|
||||||
|
end
|
||||||
|
|
||||||
|
class BarConnection < DB::Connection
|
||||||
|
def build_statement(query)
|
||||||
|
BarStatement.new(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class BarStatement < DB::Statement
|
||||||
|
protected def perform_query(args : Slice(DB::Any)) : DB::ResultSet
|
||||||
|
GenericResultSet(DB::Any).new(self, BarDriver.fake_row)
|
||||||
|
end
|
||||||
|
|
||||||
|
protected def perform_exec(args : Slice(DB::Any)) : DB::ExecResult
|
||||||
|
raise "Not implemented"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
DB.register_driver "bar", BarDriver
|
||||||
|
|
||||||
|
describe DB do
|
||||||
|
it "should be able to register multiple drivers" do
|
||||||
|
DB.open("foo://host").driver.should be_a(FooDriver)
|
||||||
|
DB.open("bar://host").driver.should be_a(BarDriver)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Foo and Bar drivers should return fake_row" do
|
||||||
|
with_witness do |w|
|
||||||
|
DB.open("foo://host") do |db|
|
||||||
|
FooDriver.fake_row = [1, "string"] of DB::Any
|
||||||
|
db.query "query" do |rs|
|
||||||
|
w.check
|
||||||
|
rs.move_next
|
||||||
|
rs.read?(Int32).should eq(1)
|
||||||
|
rs.read?(String).should eq("string")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
with_witness do |w|
|
||||||
|
DB.open("bar://host") do |db|
|
||||||
|
BarDriver.fake_row = ["lorem", 1.0] of DB::Any
|
||||||
|
db.query "query" do |rs|
|
||||||
|
w.check
|
||||||
|
rs.move_next
|
||||||
|
rs.read?(String).should eq("lorem")
|
||||||
|
rs.read?(Float64).should eq(1.0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -9,7 +9,7 @@ describe DB::Statement do
|
||||||
|
|
||||||
it "should initialize positional params in query" do
|
it "should initialize positional params in query" do
|
||||||
with_dummy do |db|
|
with_dummy do |db|
|
||||||
stmt = db.prepare("the query")
|
stmt = db.prepare("the query").as(DummyDriver::DummyStatement)
|
||||||
stmt.query "a", 1, nil
|
stmt.query "a", 1, nil
|
||||||
stmt.params[0].should eq("a")
|
stmt.params[0].should eq("a")
|
||||||
stmt.params[1].should eq(1)
|
stmt.params[1].should eq(1)
|
||||||
|
@ -19,7 +19,7 @@ describe DB::Statement do
|
||||||
|
|
||||||
it "should initialize positional params in query with array" do
|
it "should initialize positional params in query with array" do
|
||||||
with_dummy do |db|
|
with_dummy do |db|
|
||||||
stmt = db.prepare("the query")
|
stmt = db.prepare("the query").as(DummyDriver::DummyStatement)
|
||||||
stmt.query ["a", 1, nil]
|
stmt.query ["a", 1, nil]
|
||||||
stmt.params[0].should eq("a")
|
stmt.params[0].should eq("a")
|
||||||
stmt.params[1].should eq(1)
|
stmt.params[1].should eq(1)
|
||||||
|
@ -29,7 +29,7 @@ describe DB::Statement do
|
||||||
|
|
||||||
it "should initialize positional params in exec" do
|
it "should initialize positional params in exec" do
|
||||||
with_dummy do |db|
|
with_dummy do |db|
|
||||||
stmt = db.prepare("the query")
|
stmt = db.prepare("the query").as(DummyDriver::DummyStatement)
|
||||||
stmt.exec "a", 1, nil
|
stmt.exec "a", 1, nil
|
||||||
stmt.params[0].should eq("a")
|
stmt.params[0].should eq("a")
|
||||||
stmt.params[1].should eq(1)
|
stmt.params[1].should eq(1)
|
||||||
|
@ -39,7 +39,7 @@ describe DB::Statement do
|
||||||
|
|
||||||
it "should initialize positional params in exec with array" do
|
it "should initialize positional params in exec with array" do
|
||||||
with_dummy do |db|
|
with_dummy do |db|
|
||||||
stmt = db.prepare("the query")
|
stmt = db.prepare("the query").as(DummyDriver::DummyStatement)
|
||||||
stmt.exec ["a", 1, nil]
|
stmt.exec ["a", 1, nil]
|
||||||
stmt.params[0].should eq("a")
|
stmt.params[0].should eq("a")
|
||||||
stmt.params[1].should eq(1)
|
stmt.params[1].should eq(1)
|
||||||
|
@ -49,7 +49,7 @@ describe DB::Statement do
|
||||||
|
|
||||||
it "should initialize positional params in scalar" do
|
it "should initialize positional params in scalar" do
|
||||||
with_dummy do |db|
|
with_dummy do |db|
|
||||||
stmt = db.prepare("the query")
|
stmt = db.prepare("the query").as(DummyDriver::DummyStatement)
|
||||||
stmt.scalar "a", 1, nil
|
stmt.scalar "a", 1, nil
|
||||||
stmt.params[0].should eq("a")
|
stmt.params[0].should eq("a")
|
||||||
stmt.params[1].should eq(1)
|
stmt.params[1].should eq(1)
|
||||||
|
|
Loading…
Reference in a new issue