mirror of
https://gitea.invidious.io/iv-org/shard-crystal-sqlite3.git
synced 2024-08-15 00:53:26 +00:00
migrate to crystal std db. keeping old code side by side
This commit is contained in:
parent
67ef13caed
commit
efa010e2ad
7 changed files with 188 additions and 13 deletions
|
@ -1 +1,2 @@
|
|||
require "db"
|
||||
require "./sqlite3/**"
|
||||
|
|
22
src/sqlite3/driver.cr
Normal file
22
src/sqlite3/driver.cr
Normal file
|
@ -0,0 +1,22 @@
|
|||
class SQLite3::Driver < DB::Driver
|
||||
def initialize(options)
|
||||
super
|
||||
filename = options["database"]
|
||||
check LibSQLite3.open_v2(filename, out @db, (LibSQLite3::Flag::READWRITE | LibSQLite3::Flag::CREATE), nil)
|
||||
# @closed = false
|
||||
end
|
||||
|
||||
def prepare(query)
|
||||
Statement2.new(self, query)
|
||||
end
|
||||
|
||||
def to_unsafe
|
||||
@db
|
||||
end
|
||||
|
||||
private def check(code)
|
||||
raise Exception.new(@db) unless code == 0
|
||||
end
|
||||
end
|
||||
|
||||
DB.register_driver "sqlite3", SQLite3::Driver
|
68
src/sqlite3/result_set2.cr
Normal file
68
src/sqlite3/result_set2.cr
Normal file
|
@ -0,0 +1,68 @@
|
|||
class SQLite3::ResultSet2 < DB::ResultSet
|
||||
@column_index = 0
|
||||
|
||||
# Advances to the next row. Returns `true` if there's a next row,
|
||||
# `false` otherwise. Must be called at least once to advance to the first
|
||||
# row.
|
||||
def move_next
|
||||
@column_index = 0
|
||||
|
||||
case step
|
||||
when LibSQLite3::Code::ROW
|
||||
true
|
||||
when LibSQLite3::Code::DONE
|
||||
false
|
||||
else
|
||||
raise Exception.new(@statement.driver)
|
||||
end
|
||||
end
|
||||
|
||||
{% for t in DB::TYPES %}
|
||||
def read?(t : {{t}}.class) : {{t}}?
|
||||
if read_nil?
|
||||
moving_column { nil }
|
||||
else
|
||||
read(t)
|
||||
end
|
||||
end
|
||||
{% end %}
|
||||
|
||||
def read(t : String.class) : String
|
||||
moving_column { |col| String.new(LibSQLite3.column_text(self, col)) }
|
||||
end
|
||||
|
||||
def read(t : Int32.class) : Int32
|
||||
read(Int64).to_i32
|
||||
end
|
||||
|
||||
def read(t : Int64.class) : Int64
|
||||
moving_column { |col| LibSQLite3.column_int64(self, col) }
|
||||
end
|
||||
|
||||
def read(t : Float32.class) : Float32
|
||||
read(Float64).to_f32
|
||||
end
|
||||
|
||||
def read(t : Float64.class) : Float64
|
||||
moving_column { LibSQLite3.column_double(self, @column_index) }
|
||||
end
|
||||
|
||||
def to_unsafe
|
||||
@statement.to_unsafe
|
||||
end
|
||||
|
||||
private def read_nil?
|
||||
LibSQLite3.column_type(self, @column_index) == Type::NULL
|
||||
end
|
||||
|
||||
# :nodoc:
|
||||
private def step
|
||||
LibSQLite3::Code.new LibSQLite3.step(@statement)
|
||||
end
|
||||
|
||||
private def moving_column
|
||||
res = yield @column_index
|
||||
@column_index += 1
|
||||
res
|
||||
end
|
||||
end
|
19
src/sqlite3/statement2.cr
Normal file
19
src/sqlite3/statement2.cr
Normal file
|
@ -0,0 +1,19 @@
|
|||
class SQLite3::Statement2 < DB::Statement
|
||||
def initialize(@driver, sql)
|
||||
check LibSQLite3.prepare_v2(@driver, sql, sql.bytesize + 1, out @stmt, nil)
|
||||
# @closed = false
|
||||
end
|
||||
|
||||
def exec(*args)
|
||||
LibSQLite3.reset(self)
|
||||
ResultSet2.new(self)
|
||||
end
|
||||
|
||||
private def check(code)
|
||||
raise Exception.new(@driver) unless code == 0
|
||||
end
|
||||
|
||||
def to_unsafe
|
||||
@stmt
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue