Skip to content
This repository has been archived by the owner on Jun 20, 2018. It is now read-only.

Commit

Permalink
Merge pull request #109 from robacarp/query_logger
Browse files Browse the repository at this point in the history
Query logger
  • Loading branch information
drujensen committed Jan 14, 2018
2 parents d827107 + 7d4236d commit d5da241
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 20 deletions.
2 changes: 2 additions & 0 deletions spec/spec_helper.cr
Expand Up @@ -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
4 changes: 4 additions & 0 deletions src/adapter/base.cr
Expand Up @@ -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)

Expand Down
34 changes: 27 additions & 7 deletions src/adapter/mysql.cr
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -65,18 +78,25 @@ 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
end

# 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
26 changes: 20 additions & 6 deletions src/adapter/pg.cr
Expand Up @@ -5,8 +5,12 @@ 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

Expand All @@ -18,10 +22,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, params

open do |db|
db.query statement, params do |rs|
yield rs
Expand All @@ -33,11 +39,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, id

open do |db|
db.query_one? statement, id do |rs|
yield rs
Expand All @@ -48,12 +56,14 @@ 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 << 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)
Expand All @@ -68,10 +78,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
Expand All @@ -81,6 +93,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, value

open do |db|
db.exec statement, value
end
Expand Down
34 changes: 27 additions & 7 deletions src/adapter/sqlite.cr
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -63,18 +76,25 @@ 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
end

# 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
8 changes: 8 additions & 0 deletions 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
Expand Down

0 comments on commit d5da241

Please sign in to comment.