diff --git a/spec/driver_spec.cr b/spec/driver_spec.cr index bbf3212..19da869 100644 --- a/spec/driver_spec.cr +++ b/spec/driver_spec.cr @@ -25,6 +25,7 @@ def sqlite_type_for(v) when String ; "text" when Int32, Int64 ; "int" when Float32, Float64; "float" + when Time ; "text" else raise "not implemented for #{typeof(v)}" end @@ -200,6 +201,24 @@ describe Driver do end end + it "insert/get value date from table" do + with_db do |db| + value = Time.new(2016, 7, 22, 15, 0, 0, 0) + db.exec "create table table1 (col1 #{sqlite_type_for(value)})" + db.exec %(insert into table1 values (?)), value + + db.query "select col1 from table1" do |rs| + rs.move_next + rs.read(Time).should eq(value) + end + + db.query "select col1 from table1" do |rs| + rs.move_next + rs.read?(Time).should eq(value) + end + end + end + it "raises on unsupported param types" do with_db do |db| expect_raises Exception, "SQLite3::Statement does not support NotSupportedType params" do diff --git a/src/sqlite3.cr b/src/sqlite3.cr index 2fc0340..a5b49c4 100644 --- a/src/sqlite3.cr +++ b/src/sqlite3.cr @@ -1,2 +1,6 @@ require "db" require "./sqlite3/**" + +module SQLite3 + DATE_FORMAT = "%F %H:%M:%S.%L" +end diff --git a/src/sqlite3/result_set.cr b/src/sqlite3/result_set.cr index 69c2841..39e3e0b 100644 --- a/src/sqlite3/result_set.cr +++ b/src/sqlite3/result_set.cr @@ -22,7 +22,7 @@ class SQLite3::ResultSet < DB::ResultSet end end - {% for t in DB::TYPES %} + macro nilable_read_for(t) def read?(t : {{t}}.class) : {{t}}? if read_nil? moving_column { nil } @@ -30,6 +30,10 @@ class SQLite3::ResultSet < DB::ResultSet read(t) end end + end + + {% for t in DB::TYPES %} + nilable_read_for({{t}}) {% end %} def read(t : String.class) : String @@ -62,6 +66,12 @@ class SQLite3::ResultSet < DB::ResultSet end end + def read(t : Time.class) : Time + Time.parse read(String), SQLite3::DATE_FORMAT + end + + nilable_read_for Time + def column_count LibSQLite3.column_count(self) end diff --git a/src/sqlite3/statement.cr b/src/sqlite3/statement.cr index 57d4f9d..f7c36f2 100644 --- a/src/sqlite3/statement.cr +++ b/src/sqlite3/statement.cr @@ -56,6 +56,10 @@ class SQLite3::Statement < DB::Statement check LibSQLite3.bind_blob(self, index, value, value.size, nil) end + private def bind_arg(index, value : Time) + bind_arg(index, value.to_s(SQLite3::DATE_FORMAT)) + end + private def bind_arg(index, value) raise "#{self.class} does not support #{value.class} params" end