mirror of
https://gitea.invidious.io/iv-org/shard-crystal-sqlite3.git
synced 2024-08-15 00:53:26 +00:00
arguments support
This commit is contained in:
parent
efa010e2ad
commit
82f68ed6cf
3 changed files with 95 additions and 16 deletions
|
@ -27,6 +27,7 @@ describe Database do
|
|||
end
|
||||
end
|
||||
|
||||
# pending
|
||||
it "executes and selects blob" do
|
||||
rows = with_db_old(&.execute(%(select X'53514C697465')))
|
||||
row = rows[0]
|
||||
|
|
|
@ -14,6 +14,18 @@ def sql(s)
|
|||
"#{s}"
|
||||
end
|
||||
|
||||
def assert_single_read(result_set, value_type, value)
|
||||
result_set.move_next.should be_true
|
||||
result_set.read(value_type).should eq(value)
|
||||
result_set.move_next.should be_false
|
||||
end
|
||||
|
||||
def assert_single_read?(result_set, value_type, value)
|
||||
result_set.move_next.should be_true
|
||||
result_set.read?(value_type).should eq(value)
|
||||
result_set.move_next.should be_false
|
||||
end
|
||||
|
||||
describe Driver do
|
||||
it "should register sqlite3 name" do
|
||||
DB.driver_class("sqlite3").should eq(SQLite3::Driver)
|
||||
|
@ -30,36 +42,64 @@ describe Driver do
|
|||
it "executes and select {{value.id}}" do
|
||||
with_db do |db|
|
||||
result_set = db.exec("select #{sql({{value}})}")
|
||||
result_set.move_next.should be_true
|
||||
result_set.read(typeof({{value}})).should eq({{value}})
|
||||
result_set.move_next.should be_false
|
||||
assert_single_read result_set, typeof({{value}}), {{value}}
|
||||
end
|
||||
end
|
||||
|
||||
it "executes and select {{value.id}} as nillable" do
|
||||
with_db do |db|
|
||||
result_set = db.exec("select #{sql({{value}})}")
|
||||
result_set.move_next.should be_true
|
||||
result_set.read?(typeof({{value}})).should eq({{value}})
|
||||
result_set.move_next.should be_false
|
||||
assert_single_read? result_set, typeof({{value}}), {{value}}
|
||||
end
|
||||
end
|
||||
|
||||
it "executes and select nil as type of {{value.id}}" do
|
||||
with_db do |db|
|
||||
result_set = db.exec("select null")
|
||||
result_set.move_next.should be_true
|
||||
result_set.read?(typeof({{value}})).should be_nil
|
||||
result_set.move_next.should be_false
|
||||
assert_single_read? result_set, typeof({{value}}), nil
|
||||
end
|
||||
end
|
||||
|
||||
# it "executes with bind #{value}" do
|
||||
# with_db(&.execute(%(select ?), value)).should eq([[value]])
|
||||
# end
|
||||
it "executes with bind {{value.id}}" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select ?), {{value}})
|
||||
assert_single_read result_set, typeof({{value}}), {{value}}
|
||||
end
|
||||
end
|
||||
|
||||
# it "executes with bind #{value} as array" do
|
||||
# with_db(&.execute(%(select ?), [value])).should eq([[value]])
|
||||
# end
|
||||
it "executes with bind {{value.id}} read as nillable" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select ?), {{value}})
|
||||
assert_single_read? result_set, typeof({{value}}), {{value}}
|
||||
end
|
||||
end
|
||||
|
||||
it "executes with bind nil as typeof {{value.id}}" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select ?), nil)
|
||||
assert_single_read? result_set, typeof({{value}}), nil
|
||||
end
|
||||
end
|
||||
|
||||
it "executes with bind {{value.id}} as array" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select ?), [{{value}}])
|
||||
assert_single_read result_set, typeof({{value}}), {{value}}
|
||||
end
|
||||
end
|
||||
{% end %}
|
||||
|
||||
it "executes with named bind using symbol" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select :value), {value: "hello"})
|
||||
assert_single_read result_set, String, "hello"
|
||||
end
|
||||
end
|
||||
|
||||
it "executes with named bind using string" do
|
||||
with_db do |db|
|
||||
result_set = db.exec(%(select :value), {"value": "hello"})
|
||||
assert_single_read result_set, String, "hello"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,11 +4,49 @@ class SQLite3::Statement2 < DB::Statement
|
|||
# @closed = false
|
||||
end
|
||||
|
||||
def exec(*args)
|
||||
protected def before_execute
|
||||
LibSQLite3.reset(self)
|
||||
end
|
||||
|
||||
protected def add_parameter(index : Int32, value)
|
||||
bind_arg(index, value)
|
||||
end
|
||||
|
||||
protected def add_parameter(name : String, value)
|
||||
converted_name = ":#{name}"
|
||||
index = LibSQLite3.bind_parameter_index(self, converted_name)
|
||||
raise "Unknown parameter: #{name}" if index == 0
|
||||
bind_arg(index, value)
|
||||
end
|
||||
|
||||
protected def execute
|
||||
ResultSet2.new(self)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : Nil)
|
||||
check LibSQLite3.bind_null(self, index)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : Int32)
|
||||
check LibSQLite3.bind_int(self, index, value)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : Int64)
|
||||
check LibSQLite3.bind_int64(self, index, value)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : Float32)
|
||||
check LibSQLite3.bind_double(self, index, value.to_f64)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : Float64)
|
||||
check LibSQLite3.bind_double(self, index, value)
|
||||
end
|
||||
|
||||
private def bind_arg(index, value : String)
|
||||
check LibSQLite3.bind_text(self, index, value, value.bytesize, nil)
|
||||
end
|
||||
|
||||
private def check(code)
|
||||
raise Exception.new(@driver) unless code == 0
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue