76 lines
2.1 KiB
Ruby
76 lines
2.1 KiB
Ruby
require 'pg'
|
|
require 'sequel'
|
|
require 'json'
|
|
require 'yaml'
|
|
|
|
module CartoDB
|
|
module Importer2
|
|
module Factories
|
|
class PGConnection
|
|
def initialize(options = {})
|
|
@options = read_config.merge(options)
|
|
create_db if options[:create_db]
|
|
end
|
|
|
|
def connection
|
|
Sequel.postgres(@options)
|
|
end
|
|
|
|
def pg_options
|
|
@options
|
|
end
|
|
|
|
private
|
|
|
|
def read_config
|
|
begin
|
|
load_from_json
|
|
rescue StandardError
|
|
load_from_yml
|
|
end
|
|
end
|
|
|
|
def create_db
|
|
begin
|
|
connection.run("CREATE DATABASE \"#{ @options[:create_db] }\"
|
|
WITH TEMPLATE = template_postgis
|
|
OWNER = #{ @options[:user] }
|
|
ENCODING = 'UTF8'
|
|
CONNECTION LIMIT=-1")
|
|
rescue Sequel::DatabaseError => e
|
|
raise unless e.message =~ /database .* already exists/
|
|
end
|
|
begin
|
|
connection.run("CREATE EXTENSION postgis")
|
|
rescue Sequel::DatabaseError => e
|
|
raise unless e.message =~ /extension \"postgis\" already exists/
|
|
end
|
|
end
|
|
|
|
def load_from_json
|
|
json_config = File.join(File.dirname("#{__FILE__}"), 'database.json')
|
|
::JSON.parse(File.read(json_config)).each_with_object({}){ |(k,v), h|
|
|
h[k.to_sym] = v
|
|
}
|
|
end
|
|
|
|
def load_from_yml
|
|
if ENV['RAILS_DATABASE_FILE']
|
|
yml_config = "#{File.dirname(__FILE__)}/../../../../config/#{ENV['RAILS_DATABASE_FILE']}"
|
|
else
|
|
yml_config = "#{File.dirname(__FILE__)}/../../../../config/database.yml"
|
|
end
|
|
yml_config = YAML.load_file(yml_config)['test'].each_with_object({}){ |(k,v), h|
|
|
h[k.to_sym] = v
|
|
}
|
|
yml_config[:user] = yml_config.delete :username
|
|
yml_config[:adapter].sub!('postgresql', 'postgres')
|
|
yml_config
|
|
rescue StandardError
|
|
raise("Configure database settings in RAILS_ROOT/config/database.yml or spec/factories/database.json")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|