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
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