class DBConnection
Public Class Methods
add_to_version(file)
click to toggle source
# File lib/db_connection.rb, line 12 def self.add_to_version(file) name = parse_migration_file(file) execute(<<-SQL, [name]) INSERT INTO version (name) VALUES ($1); SQL end
app_name()
click to toggle source
# File lib/db_connection.rb, line 8 def self.app_name YAML.load_file(Dir.pwd + '/config/database.yml')['database'] end
columns(table_name)
click to toggle source
# File lib/db_connection.rb, line 22 def self.columns(table_name) columns = instance.exec(<<-SQL) SELECT attname FROM pg_attribute WHERE attrelid = '#{table_name}'::regclass AND attnum > 0 AND NOT attisdropped SQL columns.map { |col| col['attname'].to_sym } end
ensure_version_table()
click to toggle source
# File lib/db_connection.rb, line 37 def self.ensure_version_table execute(<<-SQL) CREATE TABLE IF NOT EXISTS version ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL ); SQL end
execute(query, params = [])
click to toggle source
# File lib/db_connection.rb, line 46 def self.execute(query, params = []) query = number_placeholders(query) print_query(query, params) instance.exec(query, params) end
instance()
click to toggle source
# File lib/db_connection.rb, line 52 def self.instance @db || open end
migrate()
click to toggle source
# File lib/db_connection.rb, line 56 def self.migrate ensure_version_table pending_migrations = MIGRATIONS.reject { |file| migrated?(file) } pending_migrations.each do |file| add_to_version(file) if (ENV['DATABASE_URL']) uri = URI.parse(ENV['DATABASE_URL']) db_name = uri.path[1..-1] else db_name = app_name end `psql -d #{db_name} -a -f #{file}` end end
migrated?(file)
click to toggle source
# File lib/db_connection.rb, line 71 def self.migrated?(file) name = parse_migration_file(file) result = execute(<<-SQL, [name]) SELECT * FROM version WHERE name = $1; SQL !!result.first end
number_placeholders(query_string)
click to toggle source
# File lib/db_connection.rb, line 90 def self.number_placeholders(query_string) count = 0 query_string.chars.map do |char| if char == "?" count += 1 "$#{count}" else char end end.join("") end
open()
click to toggle source
# File lib/db_connection.rb, line 113 def self.open if (ENV['DATABASE_URL']) uri = URI.parse(ENV['DATABASE_URL']) @db = PG::Connection.new( user: uri.user, password: uri.password, host: uri.host, port: uri.port, dbname: uri.path[1..-1], ) else @db = PG::Connection.new( dbname: app_name, port: 5432 ) end end
parse_migration_file(file)
click to toggle source
# File lib/db_connection.rb, line 84 def self.parse_migration_file(file) filename = File.basename(file).split('.').first u_idx = filename.index('_') filename[0..u_idx - 1] end
print_query(query, interpolation_args)
click to toggle source
# File lib/db_connection.rb, line 102 def self.print_query(query, interpolation_args) return unless PRINT_QUERIES puts '--------------------' puts query unless interpolation_args.empty? puts "interpolate: #{interpolation_args.inspect}" end puts '--------------------' end
reset()
click to toggle source
# File lib/db_connection.rb, line 132 def self.reset if (ENV['DATABASE_URL']) uri = URI.parse(ENV['DATABASE_URL']) commands = [ "dropdb #{uri.path[1..-1]}", "createdb #{uri.path[1..-1]}" ] else commands = [ "dropdb #{app_name}", "createdb #{app_name}" ] end commands.each { |command| `#{command}` } end