Class: Ardb::Adapter::Postgresql

Inherits:
Base
  • Object
show all
Defined in:
lib/ardb/adapter/postgresql.rb

Instance Attribute Summary

Attributes inherited from Base

#config

Instance Method Summary collapse

Methods inherited from Base

#==, #connect_db, #connect_hash, #database, #dump_ruby_schema, #dump_schema, #escape_like_pattern, #initialize, #load_ruby_schema, #load_schema, #migrate_db, #migrate_db_backward, #migrate_db_down, #migrate_db_forward, #migrate_db_up, #migrations_path, #ruby_schema_path, #schema_format, #sql_schema_path

Constructor Details

This class inherits a constructor from Ardb::Adapter::Base

Instance Method Details

#create_dbObject



17
18
19
20
21
22
23
24
# File 'lib/ardb/adapter/postgresql.rb', line 17

def create_db
  ActiveRecord::Base.establish_connection(public_connect_hash)
  ActiveRecord::Base.connection.create_database(
    database,
    connect_hash,
  )
  ActiveRecord::Base.establish_connection(connect_hash)
end

#drop_dbObject



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/ardb/adapter/postgresql.rb', line 26

def drop_db
  begin
    ActiveRecord::Base.establish_connection(public_connect_hash)
    ActiveRecord::Base.connection.tap do |conn|
      conn.execute(
        "UPDATE pg_catalog.pg_database"\
        " SET datallowconn=false WHERE datname='#{database}'",
      )
      # this SELECT actually runs a command: it terminates all the
      # connections
      # http://www.postgresql.org/docs/9.2/static/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE
      conn.execute "SELECT pg_terminate_backend(pid)"\
                   " FROM pg_stat_activity WHERE datname='#{database}'"
      conn.execute "DROP DATABASE IF EXISTS #{database}"
    end
  rescue PG::Error => ex
    raise ex unless ex.message =~ /does not exist/
  end
end

#drop_tablesObject



46
47
48
49
50
51
52
53
54
55
# File 'lib/ardb/adapter/postgresql.rb', line 46

def drop_tables
  ActiveRecord::Base.connection.tap do |conn|
    tables = conn.execute "SELECT table_name"\
                          " FROM information_schema.tables"\
                          " WHERE table_schema = 'public';"
    tables.each do |row|
      conn.execute "DROP TABLE #{row["table_name"]} CASCADE"
    end
  end
end

#dump_sql_schemaObject



64
65
66
67
68
69
70
# File 'lib/ardb/adapter/postgresql.rb', line 64

def dump_sql_schema
  require "scmd"
  cmd_str =
    "pg_dump -i -s -x -O -f \"#{sql_schema_path}\" #{database}"
  cmd = Scmd.new(cmd_str, env: env_var_hash).tap(&:run)
  raise "Error dumping database" unless cmd.success?
end

#load_sql_schemaObject



57
58
59
60
61
62
# File 'lib/ardb/adapter/postgresql.rb', line 57

def load_sql_schema
  require "scmd"
  cmd_str = "psql -f \"#{sql_schema_path}\" #{database}"
  cmd = Scmd.new(cmd_str, env: env_var_hash).tap(&:run)
  raise "Error loading database" unless cmd.success?
end

#public_connect_hashObject

the “postgres” db is a “public” (doesn“t typically require auth/grants to connect to) db that typically exists for all postgres installations; the adapter uses it to create/drop other databases



10
11
12
13
14
15
# File 'lib/ardb/adapter/postgresql.rb', line 10

def public_connect_hash
  @public_connect_hash ||= connect_hash.merge({
    "database" => "postgres",
    "schema_search_path" => "public",
  })
end