class SchemaEvolutionManager::Db
Attributes
psql_executable_with_options[R]
url[R]
Public Class Methods
attribute_values(path)
click to toggle source
# File lib/schema-evolution-manager/db.rb, line 41 def Db.attribute_values(path) Preconditions.assert_class(path, String) options = [] ['quiet', 'no-align', 'tuples-only'].each do |v| options << "--#{v}" end SchemaEvolutionManager::MigrationFile.new(path).attribute_values.map do |value| if value.attribute.name == "transaction" if value.value == "single" options << "--single-transaction" elsif value.value == "none" # No-op else raise "File[%s] - attribute[%s] unsupported value[%s]" % [path, value.attribute.name, value.value] end else raise "File[%s] - unsupported attribute named[%s]" % [path, value.attribute.name] end end options end
from_args(args, opts={})
click to toggle source
@param password: Optional password to use when connecting to the database.
# File lib/schema-evolution-manager/db.rb, line 108 def Db.from_args(args, opts={}) Preconditions.assert_class(args, Args) password = opts.delete(:password) Preconditions.assert_empty_opts(opts) options = { :password => password, :set => args.set } if args.url Db.new(args.url, options) else base = "%s:%s/%s" % [args.host || "localhost", args.port || ConnectionData::DEFAULT_PORT, args.name] url = args.user ? "%s@%s" % [args.user, base] : base Db.new("postgres://" + url, options) end end
new(url, opts={})
click to toggle source
# File lib/schema-evolution-manager/db.rb, line 7 def initialize(url, opts={}) @url = Preconditions.check_not_blank(url, "url cannot be blank") password = opts.delete(:password) @psql_executable_with_options = "psql" (opts.delete(:set) || []).each do |arg| @psql_executable_with_options << " --set #{arg}" end Preconditions.assert_empty_opts(opts) connection_data = ConnectionData.parse_url(@url) if password ENV['PGPASSFILE'] = Db.password_to_tempfile(connection_data.pgpass(password)) end end
parse_command_line_config(arg_string)
click to toggle source
Parses command line arguments returning an instance of Db
. Exists if invalid config.
# File lib/schema-evolution-manager/db.rb, line 101 def Db.parse_command_line_config(arg_string) Preconditions.assert_class(arg_string, String) args = Args.new(arg_string, :optional => ['url', 'host', 'user', 'name', 'port', 'set']) Db.from_args(args) end
password_to_tempfile(contents)
click to toggle source
# File lib/schema-evolution-manager/db.rb, line 128 def Db.password_to_tempfile(contents) file = Tempfile.new("sem-db") file.write(contents) file.rewind file.path end
schema_name()
click to toggle source
Returns the name of the schema_evolution_manager schema
# File lib/schema-evolution-manager/db.rb, line 124 def Db.schema_name "schema_evolution_manager" end
Public Instance Methods
bootstrap!()
click to toggle source
Installs schema_evolution_manager. Automatically upgrades schema_evolution_manager.
# File lib/schema-evolution-manager/db.rb, line 25 def bootstrap! scripts = Scripts.new(self, Scripts::BOOTSTRAP_SCRIPTS) dir = File.join(Library.base_dir, "scripts") scripts.each_pending(dir) do |filename, path| psql_file(filename, path) scripts.record_as_run!(filename) end end
psql_command(sql_command)
click to toggle source
executes a simple sql command.
# File lib/schema-evolution-manager/db.rb, line 35 def psql_command(sql_command) Preconditions.assert_class(sql_command, String) command = "#{@psql_executable_with_options} --no-align --tuples-only --no-psqlrc --command \"%s\" %s" % [sql_command, @url] Library.system_or_error(command) end
psql_file(filename, path)
click to toggle source
executes sql commands from a file in a single transaction
# File lib/schema-evolution-manager/db.rb, line 68 def psql_file(filename, path) Preconditions.assert_class(path, String) Preconditions.check_state(File.exist?(path), "File[%s] not found" % path) options = Db.attribute_values(path).join(" ") Library.with_temp_file(:prefix => File.basename(path)) do |tmp| File.open(tmp, "w") do |out| out << "\\set ON_ERROR_STOP true\n\n" out << IO.read(path) end command = "#{@psql_executable_with_options} --file \"%s\" #{options} %s" % [tmp, @url] Library.with_temp_file do |output| result = `#{command} > #{output} 2>&1`.strip status = $? if status.to_i > 0 errors = File.exist?(output) ? IO.read(output) : result raise ScriptError.new(self, filename, path, errors) end end end end
schema_schema_evolution_manager_exists?()
click to toggle source
True if the specific schema exists; false otherwise
# File lib/schema-evolution-manager/db.rb, line 94 def schema_schema_evolution_manager_exists? sql = "select count(*) from pg_namespace where nspname='%s'" % Db.schema_name psql_command(sql).to_i > 0 end