migrate to crystal std db. keeping old code side by side

This commit is contained in:
Brian J. Cardiff 2016-01-29 16:15:28 -03:00
parent 67ef13caed
commit efa010e2ad
7 changed files with 188 additions and 13 deletions

View file

@ -1 +1,2 @@
require "db"
require "./sqlite3/**"

22
src/sqlite3/driver.cr Normal file
View 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

View 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
View 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