class CopyDbFromProd

Attributes

cf[RW]
conn[RW]

Public Class Methods

hi() click to toggle source
# File lib/copy_db_from_prod.rb, line 8
def self.hi
  puts "Hello world!"
end
new(args) click to toggle source
# File lib/copy_db_from_prod.rb, line 18
def initialize(args)
  load_conf(args)
end

Public Instance Methods

copy_env_table() click to toggle source
# File lib/copy_db_from_prod.rb, line 84
def copy_env_table

end
download_schema() click to toggle source
# File lib/copy_db_from_prod.rb, line 22
def download_schema
  Net::SSH.start(cf[:host], cf[:user], key_data: cf[:keys], keys_only: TRUE) do |ssh|
    yml_text = ssh.exec!("cat #{cf[:deploy_to]}/config/database.yml")
    begin
      @prod_conf ||= YAML.load(yml_text)['production']
    rescue => e
      raise "Can't access to database.yml, check -p params\n #{e}"
    end
    prod_data = ssh.exec!(dump_schema)
    if prod_data.include?('pg_dump') || prod_data.include?('warn')
      raise "error: pg_dump dosen't work correct\n #{prod_data}"
    else
      begin
        return Zlib::GzipReader.new(StringIO.new(prod_data)).read
      rescue => e
        raise "#{e}\n #{prod_data}"
      end
    end
  end
end
drop_restore_table() click to toggle source
# File lib/copy_db_from_prod.rb, line 52
def drop_restore_table
  conn.exec("SELECT table_name
              FROM information_schema.tables
              WHERE table_schema = 'public'
              AND table_name LIKE '%_201%'
              ORDER BY table_name"
  ) do |result|
    conn.exec(result.map { |row| "DROP TABLE #{row['table_name']}" }.join(';'))
  end
end
dump_schema() click to toggle source
# File lib/copy_db_from_prod.rb, line 43
def dump_schema
  cmd = []
  { password: 'export PGPASSWORD=#{val} &&', database: 'pg_dump #{val}', host: '-h #{val}', port: '-p #{val}',
    username: '-U #{val}' }.each_pair do |key, val|
    cmd.push(val.sub('#{val}', @prod_conf[key.to_s].to_s)) if @prod_conf.key?(key.to_s)
  end
  "#{cmd.join(' ')} --schema-only --no-owner --no-privileges -Z9"
end
load_conf(args) click to toggle source
# File lib/copy_db_from_prod.rb, line 12
def load_conf(args)
  @cf = { host: args.host, user: args.user,
          keys: [File.open("#{ENV['HOME']}/.ssh/id_rsa", 'r').read],
          deploy_to: args.path }
end
load_schema() click to toggle source
# File lib/copy_db_from_prod.rb, line 63
def load_schema
  @dev_conf = YAML.load(File.open('config/database.yml', 'r').read)['development']
  @conn = PGconn.open(host: @dev_conf['host'],
                   dbname: 'postgres',
                     user: @dev_conf['username'],
                 password: @dev_conf['password'])
  conn.exec("DROP DATABASE IF EXISTS #{@dev_conf['database']}")
  conn.exec("CREATE DATABASE #{@dev_conf['database']}")
  @conn = PGconn.open(host: @dev_conf['host'],
                   dbname: @dev_conf['database'],
                     user: @dev_conf['username'],
                 password: @dev_conf['password'])
  schema = download_schema
  begin
    conn.exec(schema)
  rescue => e
    raise "Database #{@dev_conf['database']}\n#{e}\n #{schema}"
  end
  drop_restore_table if 'insales_dev' == @dev_conf['database']
end