From 6d160a2d1ced931984b21312e6bc93c16cafb2ec Mon Sep 17 00:00:00 2001 From: Damian Hamill Date: Wed, 28 Mar 2018 10:19:37 +0700 Subject: [PATCH] parse timestamp strings for sqlite db adapter (#135) * parse timestamp strings for sqlite db adapter A quick simple fix to handle create_at/updated_at when using sqlite database adapter, however the values must be populated (which should be the case if the timestamps settings value has been enabled) * enable the timestamp fields for sqlite adapter specs * fix commas --- spec/spec_models.cr | 23 ++++++++++++----------- src/granite_orm/querying.cr | 11 +++++++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/spec/spec_models.cr b/spec/spec_models.cr index de31167..9c43b63 100644 --- a/spec/spec_models.cr +++ b/spec/spec_models.cr @@ -10,21 +10,21 @@ end if adapter == "pg" primary_key_sql = "BIGSERIAL PRIMARY KEY".id foreign_key_sql = "BIGINT".id - created_at_sql = "created_at TIMESTAMP,".id - updated_at_sql = "updated_at TIMESTAMP,".id + created_at_sql = "created_at TIMESTAMP".id + updated_at_sql = "updated_at TIMESTAMP".id timestamp_fields = "timestamps".id elsif adapter == "mysql" primary_key_sql = "BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY".id foreign_key_sql = "BIGINT".id - created_at_sql = "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,".id - updated_at_sql = "updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,".id + created_at_sql = "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP".id + updated_at_sql = "updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP".id timestamp_fields = "timestamps".id elsif adapter == "sqlite" primary_key_sql = "INTEGER NOT NULL PRIMARY KEY".id foreign_key_sql = "INTEGER".id - created_at_sql = "".id - updated_at_sql = "".id - timestamp_fields = "".id + created_at_sql = "created_at VARCHAR".id + updated_at_sql = "updated_at VARCHAR".id + timestamp_fields = "timestamps".id end %} @@ -41,7 +41,7 @@ end has_many :students - validate :name, "Name cannot be blank" do |parent| + validate :name, "Name cannot be blank" do |parent| !parent.name.to_s.blank? end @@ -49,9 +49,9 @@ end exec("DROP TABLE IF EXISTS #{ quoted_table_name };") exec("CREATE TABLE #{ quoted_table_name } ( id {{ primary_key_sql }}, - {{ created_at_sql }} + name VARCHAR(100), + {{ created_at_sql }}, {{ updated_at_sql }} - name VARCHAR(100) ); ") end @@ -198,7 +198,8 @@ end sentiment FLOAT, interest REAL, published BOOL, - created_at TIMESTAMP + {{ created_at_sql }}, + {{ updated_at_sql }} ) SQL end diff --git a/src/granite_orm/querying.cr b/src/granite_orm/querying.cr index df1c598..8f82369 100644 --- a/src/granite_orm/querying.cr +++ b/src/granite_orm/querying.cr @@ -24,8 +24,15 @@ module Granite::ORM::Querying \{% end %} \{% if SETTINGS[:timestamps] %} - self.created_at = result.read(Union(Time | Nil)) - self.updated_at = result.read(Union(Time | Nil)) + if @@adapter.class.name == "Granite::Adapter::Sqlite" + # sqlite3 does not have timestamp type - timestamps are stored as strings + # will break for null timestamps + self.created_at = Time.parse(result.read(String), "%F %X" ) + self.updated_at = Time.parse(result.read(String), "%F %X" ) + else + self.created_at = result.read(Union(Time | Nil)) + self.updated_at = result.read(Union(Time | Nil)) + end \{% end %} return self end