class Baza::BaseSqlDriver
Constants
- SELECT_ARGS_ALLOWED_KEYS
- SEPARATOR_COLUMN
- SEPARATOR_DATABASE
- SEPARATOR_INDEX
- SEPARATOR_TABLE
- SEPARATOR_VALUE
Attributes
cols[RW]
conn[R]
db[R]
indexes[RW]
sep_col[R]
sep_database[R]
sep_index[R]
sep_table[R]
sep_val[R]
tables[RW]
Public Class Methods
escape(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 27 def self.escape(string) string.to_s.gsub(/([\0\n\r\032\'\"\\])/) do case Regexp.last_match(1) when "\0" then "\\0" when "\n" then "\\n" when "\r" then "\\r" when "\032" then "\\Z" else "\\#{Regexp.last_match(1)}" end end end
escape_column(string)
click to toggle source
Escapes a string to be used as a column.
# File lib/baza/base_sql_driver.rb, line 47 def self.escape_column(string) string = string.to_s raise "Invalid column-string: #{string}" if string.include?(SEPARATOR_COLUMN) string end
escape_database(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 83 def self.escape_database(string) string = string.to_s raise "Invalid database-string: #{string}" if string.include?(SEPARATOR_DATABASE) string end
escape_index(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 101 def self.escape_index(string) string = string.to_s raise "Invalid index-string: #{string}" if string.include?(SEPARATOR_INDEX) string end
escape_table(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 65 def self.escape_table(string) string = string.to_s raise "Invalid table-string: #{string}" if string.include?(SEPARATOR_TABLE) string end
from_object(_args)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 11 def self.from_object(_args); end
new(db)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 13 def initialize(db) @db = db @sep_database = SEPARATOR_DATABASE @sep_table = SEPARATOR_TABLE @sep_col = SEPARATOR_COLUMN @sep_val = SEPARATOR_VALUE @sep_index = SEPARATOR_INDEX end
quote_column(column_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 57 def self.quote_column(column_name) "#{SEPARATOR_COLUMN}#{escape_column(column_name)}#{SEPARATOR_COLUMN}" end
quote_database(database_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 93 def self.quote_database(database_name) "#{SEPARATOR_DATABASE}#{escape_database(database_name)}#{SEPARATOR_DATABASE}" end
quote_index(index_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 111 def self.quote_index(index_name) "#{SEPARATOR_INDEX}#{escape_index(index_name)}#{SEPARATOR_INDEX}" end
quote_table(table_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 75 def self.quote_table(table_name) "#{SEPARATOR_TABLE}#{escape_table(table_name)}#{SEPARATOR_TABLE}" end
quote_value(val)
click to toggle source
Returns the correct SQL-value for the given value. If it is a number, then just the raw number as a string will be returned. nil's will be NULL and strings will have quotes and will be escaped.
# File lib/baza/base_sql_driver.rb, line 248 def self.quote_value(val) if val.class.name == "Fixnum" || val.is_a?(Integer) val.to_s elsif val == nil "NULL" elsif val.is_a?(Date) "#{SEPARATOR_VALUE}#{Datet.in(val).dbstr(time: false)}#{SEPARATOR_VALUE}" elsif val.is_a?(Time) || val.is_a?(DateTime) || val.is_a?(Datet) "#{SEPARATOR_VALUE}#{Datet.in(val).dbstr}#{SEPARATOR_VALUE}" else "#{SEPARATOR_VALUE}#{escape(val)}#{SEPARATOR_VALUE}" end end
Public Instance Methods
count(tablename, arr_terms = nil)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 180 def count(tablename, arr_terms = nil) sql = "SELECT COUNT(*) AS count FROM #{quote_table(tablename)}" if !arr_terms.nil? && !arr_terms.empty? sql << " WHERE #{sql_make_where(arr_terms)}" end query(sql).fetch.fetch(:count).to_i end
delete(tablename, arr_terms, args = nil)
click to toggle source
Deletes rows from the database.
Examples¶ ↑
db.delete(:users, {lastname: "Doe"})
# File lib/baza/base_sql_driver.rb, line 203 def delete(tablename, arr_terms, args = nil) sql = "DELETE FROM #{quote_table(tablename)}" if !arr_terms.nil? && !arr_terms.empty? sql << " WHERE #{sql_make_where(arr_terms)}" end return sql if args && args[:return_sql] query(sql) nil end
escape(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 39 def escape(string) self.class.escape(string) end
Also aliased as: esc, escape_alternative
escape_column(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 53 def escape_column(string) self.class.escape_column(string) end
escape_database(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 89 def escape_database(string) self.class.escape_database(string) end
escape_index(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 107 def escape_index(string) self.class.escape_index(string) end
escape_table(string)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 71 def escape_table(string) self.class.escape_table(string) end
foreign_key_support?()
click to toggle source
# File lib/baza/base_sql_driver.rb, line 23 def foreign_key_support? true end
insert(table_name, data, args = {})
click to toggle source
Simply inserts data into a table.
Examples¶ ↑
db.insert(:users, name: "John", lastname: "Doe") id = db.insert(:users, {name: "John", lastname: "Doe"}, return_id: true) sql = db.insert(:users, {name: "John", lastname: "Doe"}, return_sql: true) #=> "INSERT INTO `users` (`name`, `lastname`) VALUES ('John', 'Doe')"
# File lib/baza/base_sql_driver.rb, line 137 def insert(table_name, data, args = {}) Baza::SqlQueries::GenericInsert.new({ db: @db, table_name: table_name, data: data }.merge(args)).execute end
insert_multi(tablename, arr_hashes, args = {})
click to toggle source
# File lib/baza/base_sql_driver.rb, line 145 def insert_multi(tablename, arr_hashes, args = {}) sql = [] if args && args[:return_sql] if args && args[:return_sql] arr_hashes.each do |hash| sql << @db.insert(tablename, hash, args) end else @db.transaction do arr_hashes.each do |hash| @db.insert(tablename, hash, args) end end end return sql if args && args[:return_sql] nil end
quote_column(column_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 61 def quote_column(column_name) "#{sep_col}#{escape_column(column_name)}#{sep_col}" end
quote_database(database_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 97 def quote_database(database_name) "#{sep_database}#{escape_database(database_name)}#{sep_database}" end
quote_index(index_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 115 def quote_index(index_name) "#{sep_index}#{escape_index(index_name)}#{sep_index}" end
quote_table(table_name)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 79 def quote_table(table_name) "#{sep_table}#{escape_table(table_name)}#{sep_table}" end
quote_value(val)
click to toggle source
# File lib/baza/base_sql_driver.rb, line 262 def quote_value(val) if val.class.name == "Fixnum" || val.is_a?(Integer) val.to_s elsif val == nil "NULL" elsif val.is_a?(Date) "#{@sep_val}#{Datet.in(val).dbstr(time: false)}#{@sep_val}" elsif val.is_a?(Time) || val.is_a?(DateTime) || val.is_a?(Datet) "#{@sep_val}#{Datet.in(val).dbstr}#{@sep_val}" else "#{@sep_val}#{escape(val)}#{@sep_val}" end end
select(table_name, terms = nil, args = nil, &block)
click to toggle source
Makes a select from the given arguments: table-name, where-terms and other arguments as limits and orders. Also takes a block to avoid raping of memory.
# File lib/baza/base_sql_driver.rb, line 170 def select(table_name, terms = nil, args = nil, &block) Baza::Commands::Select.new( args: args, block: block, db: @db, table_name: table_name, terms: terms ).execute end
single(tablename, terms = nil, args = {})
click to toggle source
Returns a single row from a database.
Examples¶ ↑
row = db.single(:users, lastname: "Doe")
# File lib/baza/base_sql_driver.rb, line 194 def single(tablename, terms = nil, args = {}) # Experienced very weird memory leak if this was not done by block. Maybe bug in Ruby 1.9.2? - knj select(tablename, terms, args.merge(limit: 1)).fetch end
sql_make_where(arr_terms, _driver = nil)
click to toggle source
Internally used to generate SQL.
Examples¶ ↑
sql = db.sql_make_where({lastname: "Doe"}, driver_obj)
# File lib/baza/base_sql_driver.rb, line 220 def sql_make_where(arr_terms, _driver = nil) sql = "" first = true arr_terms.each do |key, value| if first first = false else sql << " AND " end if value.is_a?(Array) raise "Array for column '#{key}' was empty." if value.empty? values = value.map { |v| "'#{escape(v)}'" }.join(",") sql << "#{quote_column(key)} IN (#{values})" elsif value.is_a?(Hash) raise "Dont know how to handle hash." else sql << "#{quote_column(key)} = #{quote_value(value)}" end end sql end
supports_multiple_databases?()
click to toggle source
# File lib/baza/base_sql_driver.rb, line 164 def supports_multiple_databases? false end
transaction() { |db| ... }
click to toggle source
# File lib/baza/base_sql_driver.rb, line 119 def transaction @db.q("BEGIN TRANSACTION") begin yield @db @db.q("COMMIT") rescue @db.q("ROLLBACK") raise end end