From ca911b61f3cdebd7c677fb8b901114fd589e65c8 Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Fri, 5 Jan 2018 10:07:33 -0700 Subject: [PATCH 1/6] create granite setting for a logger --- src/adapter/base.cr | 4 ++++ src/granite_orm/settings.cr | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/adapter/base.cr b/src/adapter/base.cr index c667913..e29e5c5 100644 --- a/src/adapter/base.cr +++ b/src/adapter/base.cr @@ -31,6 +31,10 @@ abstract class Granite::Adapter::Base yield @database end + def log(query : String, params = [] of String) : Nil + Granite::ORM.settings.logger.info "#{query}: #{params}" + end + # remove all rows from a table and reset the counter on the id. abstract def clear(table_name) diff --git a/src/granite_orm/settings.cr b/src/granite_orm/settings.cr index 8238be5..35fbedd 100644 --- a/src/granite_orm/settings.cr +++ b/src/granite_orm/settings.cr @@ -1,6 +1,14 @@ +require "logger" + module Granite::ORM class Settings property database_url : String? = nil + property logger : Logger + + def initialize + @logger = Logger.new STDOUT + @logger.progname = "Granite" + end end def self.settings From 422769787a7b122428e88bfbf189d7319da50a2f Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Fri, 5 Jan 2018 10:08:06 -0700 Subject: [PATCH 2/6] Log pg queries --- src/adapter/pg.cr | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/adapter/pg.cr b/src/adapter/pg.cr index 58cad9e..1d02211 100644 --- a/src/adapter/pg.cr +++ b/src/adapter/pg.cr @@ -5,8 +5,10 @@ require "pg" class Granite::Adapter::Pg < Granite::Adapter::Base # remove all rows from a table and reset the counter on the id. def clear(table_name) + statement = "DELETE FROM #{table_name}" + log statement open do |db| - db.exec "DELETE FROM #{table_name}" + db.exec statement end end @@ -18,10 +20,12 @@ class Granite::Adapter::Pg < Granite::Adapter::Base statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name} #{clause}" end + log statement + open do |db| db.query statement, params do |rs| yield rs @@ -33,11 +37,13 @@ class Granite::Adapter::Pg < Granite::Adapter::Base def select_one(table_name, fields, field, id, &block) statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name}" stmt << " WHERE #{field}=$1 LIMIT 1" end + log statement + open do |db| db.query_one? statement, id do |rs| yield rs @@ -50,10 +56,12 @@ class Granite::Adapter::Pg < Granite::Adapter::Base stmt << "INSERT INTO #{table_name} (" stmt << fields.map { |name| "#{name}" }.join(",") stmt << ") VALUES (" - stmt << fields.map { |name| "$#{fields.index(name).not_nil! + 1}" }.join(",") + stmt << fields.map { |name| "$#{fields.index(name).not_nil! + 1}" }.join(", ") stmt << ")" end + log statement, params + open do |db| db.exec statement, params return db.scalar(last_val()).as(Int64) @@ -68,10 +76,12 @@ class Granite::Adapter::Pg < Granite::Adapter::Base def update(table_name, primary_name, fields, params) statement = String.build do |stmt| stmt << "UPDATE #{table_name} SET " - stmt << fields.map { |name| "#{name}=$#{fields.index(name).not_nil! + 1}" }.join(",") + stmt << fields.map { |name| "#{name}=$#{fields.index(name).not_nil! + 1}" }.join(", ") stmt << " WHERE #{primary_name}=$#{fields.size + 1}" end + log statement, params + open do |db| db.exec statement, params end @@ -81,6 +91,8 @@ class Granite::Adapter::Pg < Granite::Adapter::Base def delete(table_name, primary_name, value) statement = "DELETE FROM #{table_name} WHERE #{primary_name}=$1" + log statement + open do |db| db.exec statement, value end From 8ef7e5913419e5606f5331d7c61a9d9637b866e5 Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Tue, 9 Jan 2018 13:31:44 -0700 Subject: [PATCH 3/6] Upgrade pg logging --- src/adapter/pg.cr | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/adapter/pg.cr b/src/adapter/pg.cr index 1d02211..b0efe46 100644 --- a/src/adapter/pg.cr +++ b/src/adapter/pg.cr @@ -6,7 +6,9 @@ class Granite::Adapter::Pg < Granite::Adapter::Base # remove all rows from a table and reset the counter on the id. def clear(table_name) statement = "DELETE FROM #{table_name}" + log statement + open do |db| db.exec statement end @@ -24,7 +26,7 @@ class Granite::Adapter::Pg < Granite::Adapter::Base stmt << " FROM #{table_name} #{clause}" end - log statement + log statement, params open do |db| db.query statement, params do |rs| @@ -42,7 +44,7 @@ class Granite::Adapter::Pg < Granite::Adapter::Base stmt << " WHERE #{field}=$1 LIMIT 1" end - log statement + log statement, id open do |db| db.query_one? statement, id do |rs| @@ -54,7 +56,7 @@ class Granite::Adapter::Pg < Granite::Adapter::Base def insert(table_name, fields, params) statement = String.build do |stmt| stmt << "INSERT INTO #{table_name} (" - stmt << fields.map { |name| "#{name}" }.join(",") + stmt << fields.map { |name| "#{name}" }.join(", ") stmt << ") VALUES (" stmt << fields.map { |name| "$#{fields.index(name).not_nil! + 1}" }.join(", ") stmt << ")" @@ -91,7 +93,7 @@ class Granite::Adapter::Pg < Granite::Adapter::Base def delete(table_name, primary_name, value) statement = "DELETE FROM #{table_name} WHERE #{primary_name}=$1" - log statement + log statement, value open do |db| db.exec statement, value From 7249df99f6eb36d835736e6f51ece6635944d44c Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Tue, 9 Jan 2018 13:57:33 -0700 Subject: [PATCH 4/6] sqlite query logging --- src/adapter/sqlite.cr | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/adapter/sqlite.cr b/src/adapter/sqlite.cr index db9703d..6f32d80 100644 --- a/src/adapter/sqlite.cr +++ b/src/adapter/sqlite.cr @@ -5,8 +5,12 @@ require "sqlite3" class Granite::Adapter::Sqlite < Granite::Adapter::Base # remove all rows from a table and reset the counter on the id. def clear(table_name) + statement = "DELETE FROM #{table_name}" + + log statement + open do |db| - db.exec "DELETE FROM #{table_name}" + db.exec statement end end @@ -16,9 +20,12 @@ class Granite::Adapter::Sqlite < Granite::Adapter::Base def select(table_name, fields, clause = "", params = [] of DB::Any, &block) statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name} #{clause}" end + + log statement, params + open do |db| db.query statement, params do |rs| yield rs @@ -30,10 +37,13 @@ class Granite::Adapter::Sqlite < Granite::Adapter::Base def select_one(table_name, fields, field, id, &block) statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name}" stmt << " WHERE #{field}=:id LIMIT 1" end + + log statement, id + open do |db| db.query_one? statement, id do |rs| yield rs @@ -44,11 +54,14 @@ class Granite::Adapter::Sqlite < Granite::Adapter::Base def insert(table_name, fields, params) statement = String.build do |stmt| stmt << "INSERT INTO #{table_name} (" - stmt << fields.map { |name| "#{name}" }.join(",") + stmt << fields.map { |name| "#{name}" }.join(", ") stmt << ") VALUES (" - stmt << fields.map { |name| "?" }.join(",") + stmt << fields.map { |name| "?" }.join(", ") stmt << ")" end + + log statement, params + open do |db| db.exec statement, params return db.scalar(last_val()).as(Int64) @@ -63,9 +76,12 @@ class Granite::Adapter::Sqlite < Granite::Adapter::Base def update(table_name, primary_name, fields, params) statement = String.build do |stmt| stmt << "UPDATE #{table_name} SET " - stmt << fields.map { |name| "#{name}=?" }.join(",") + stmt << fields.map { |name| "#{name}=?" }.join(", ") stmt << " WHERE #{primary_name}=?" end + + log statement, params + open do |db| db.exec statement, params end @@ -73,8 +89,12 @@ class Granite::Adapter::Sqlite < Granite::Adapter::Base # This will delete a row from the database. def delete(table_name, primary_name, value) + statement = "DELETE FROM #{table_name} WHERE #{primary_name}=?" + + log statement, value + open do |db| - db.exec "DELETE FROM #{table_name} WHERE #{primary_name}=?", value + db.exec statement, value end end end From b0789ec49bbe0b771c4488e8279d8a91fb20b3fc Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Tue, 9 Jan 2018 14:09:20 -0700 Subject: [PATCH 5/6] query logging for mysql --- src/adapter/mysql.cr | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/adapter/mysql.cr b/src/adapter/mysql.cr index 3d58c40..d31a558 100644 --- a/src/adapter/mysql.cr +++ b/src/adapter/mysql.cr @@ -5,8 +5,12 @@ require "mysql" class Granite::Adapter::Mysql < Granite::Adapter::Base # Using TRUNCATE instead of DELETE so the id column resets to 0 def clear(table_name) + statement = "TRUNCATE #{table_name}" + + log statement + open do |db| - db.exec "TRUNCATE #{table_name}" + db.exec statement end end @@ -16,9 +20,12 @@ class Granite::Adapter::Mysql < Granite::Adapter::Base def select(table_name, fields, clause = "", params = [] of DB::Any, &block) statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name} #{clause}" end + + log statement, params + open do |db| db.query statement, params do |rs| yield rs @@ -32,10 +39,13 @@ class Granite::Adapter::Mysql < Granite::Adapter::Base def select_one(table_name, fields, field, id, &block) statement = String.build do |stmt| stmt << "SELECT " - stmt << fields.map { |name| "#{table_name}.#{name}" }.join(",") + stmt << fields.map { |name| "#{table_name}.#{name}" }.join(", ") stmt << " FROM #{table_name}" stmt << " WHERE #{field}=? LIMIT 1" end + + log statement, id + open do |db| db.query_one? statement, id do |rs| yield rs @@ -46,11 +56,14 @@ class Granite::Adapter::Mysql < Granite::Adapter::Base def insert(table_name, fields, params) statement = String.build do |stmt| stmt << "INSERT INTO #{table_name} (" - stmt << fields.map { |name| "#{name}" }.join(",") + stmt << fields.map { |name| "#{name}" }.join(", ") stmt << ") VALUES (" - stmt << fields.map { |name| "?" }.join(",") + stmt << fields.map { |name| "?" }.join(", ") stmt << ")" end + + log statement, params + open do |db| db.exec statement, params return db.scalar(last_val()).as(Int64) @@ -65,9 +78,12 @@ class Granite::Adapter::Mysql < Granite::Adapter::Base def update(table_name, primary_name, fields, params) statement = String.build do |stmt| stmt << "UPDATE #{table_name} SET " - stmt << fields.map { |name| "#{name}=?" }.join(",") + stmt << fields.map { |name| "#{name}=?" }.join(", ") stmt << " WHERE #{primary_name}=?" end + + log statement, params + open do |db| db.exec statement, params end @@ -75,8 +91,12 @@ class Granite::Adapter::Mysql < Granite::Adapter::Base # This will delete a row from the database. def delete(table_name, primary_name, value) + statement = "DELETE FROM #{table_name} WHERE #{primary_name}=?" + + log statement, value + open do |db| - db.exec "DELETE FROM #{table_name} WHERE #{primary_name}=?", value + db.exec statement, value end end end From 7d4236d4ce4a8316308336746c6fbdd23ba13e3c Mon Sep 17 00:00:00 2001 From: Robert L Carpenter Date: Tue, 9 Jan 2018 14:40:47 -0700 Subject: [PATCH 6/6] Disable query logging for `crystal spec` --- spec/spec_helper.cr | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr index 06ea9ff..33cdf7f 100644 --- a/spec/spec_helper.cr +++ b/spec/spec_helper.cr @@ -14,6 +14,8 @@ end require "../src/granite_orm" require "./spec_models" +Granite::ORM.settings.logger = ::Logger.new(nil) + GraniteExample.model_classes.each do |model| model.drop_and_create end