lib/pg_migrate/migrator.rb in pg_migrate-0.1.11 vs lib/pg_migrate/migrator.rb in pg_migrate-0.1.12

- old
+ new

@@ -1,94 +1,94 @@ -module PgMigrate - - class Migrator - - attr_accessor :conn, :connection_hash, :manifest_path, :manifest, :manifest_reader, :sql_reader - - # options = gem 'pg' connection_hash options, or connstring => dbname=test port=5432, or pgconn => PG::Connection object - def initialize(manifest_reader, sql_reader, options = {}) - @log = Logging.logger[self] - @connection_hash = options - @manifest = nil - @builder_version = nil - @manifest_reader = manifest_reader - @sql_reader = sql_reader - end - - # 'migrate' attempt to migrate your database based on the contents of your built manifest - # The manifest_path argument should point to your manifest - # manifest_path = the directory containing your 'manifest' file, 'up' directory, 'down' directory, 'test' directory - # this method will throw an exception if anything goes wrong (such as bad SQL in the migrations themselves) - def migrate(manifest_path) - @manifest_path = manifest_path - - @conn = Util::get_conn(@connection_hash) - - # this is used to record the version of the 'migrator' in the pg_migrate table - @conn.exec("SET application_name = 'pg_migrate_ruby-#{PgMigrate::VERSION}'") - - # load the manifest, and version of the builder that made it - process_manifest() - - # execute the migrations - run_migrations(@manifest) - end - - - # load the manifest's migration declarations, and validate that each migration points to a real file - def process_manifest - @manifest, @builder_version = @manifest_reader.load_output_manifest(@manifest_path) - @manifest_reader.validate_migration_paths(@manifest_path, @manifest) - end - - # run all necessary migrations - def run_migrations(manifest) - - # run bootstrap before user migrations to prepare database - run_bootstrap - - # loop through the manifest, executing migrations in turn - manifest.each_with_index do |migration, index| - execute_migration(migration.name, migration.filepath) - end - - end - - # executes the bootstrap method - def run_bootstrap - bootstrap = File.join(@manifest_path, UP_DIRNAME, BOOTSTRAP_FILENAME) - execute_migration('bootstrap.sql', bootstrap) - end - - # execute a single migration by loading it's statements from file, and then executing each - def execute_migration(name, filepath) - @log.info "executing migration #{filepath}" - - statements = @sql_reader.load_migration(filepath) - if statements.length == 0 - raise 'no statements found in migration #{filepath}' - end - run_migration(name, statements) - end - - # execute all the statements of a single migration - def run_migration(name, statements) - - begin - statements.each do |statement| - conn.exec(statement).clear - end - rescue Exception => e - # we make a special allowance for one exception; it just means this migration - # has already occurred, and we should just treat it like a continue - if e.message.index('pg_migrate: code=migration_exists').nil? - conn.exec("ROLLBACK") - raise e - else - conn.exec("ROLLBACK") - @log.info "migration #{name} already run" - end - end - end - end -end - +module PgMigrate + + class Migrator + + attr_accessor :conn, :connection_hash, :manifest_path, :manifest, :manifest_reader, :sql_reader + + # options = gem 'pg' connection_hash options, or connstring => dbname=test port=5432, or pgconn => PG::Connection object + def initialize(manifest_reader, sql_reader, options = {}) + @log = Logging.logger[self] + @connection_hash = options + @manifest = nil + @builder_version = nil + @manifest_reader = manifest_reader + @sql_reader = sql_reader + end + + # 'migrate' attempt to migrate your database based on the contents of your built manifest + # The manifest_path argument should point to your manifest + # manifest_path = the directory containing your 'manifest' file, 'up' directory, 'down' directory, 'test' directory + # this method will throw an exception if anything goes wrong (such as bad SQL in the migrations themselves) + def migrate(manifest_path) + @manifest_path = manifest_path + + @conn = Util::get_conn(@connection_hash) + + # this is used to record the version of the 'migrator' in the pg_migrate table + @conn.exec("SET application_name = 'pg_migrate_ruby-#{PgMigrate::VERSION}'") + + # load the manifest, and version of the builder that made it + process_manifest() + + # execute the migrations + run_migrations(@manifest) + end + + + # load the manifest's migration declarations, and validate that each migration points to a real file + def process_manifest + @manifest, @builder_version = @manifest_reader.load_output_manifest(@manifest_path) + @manifest_reader.validate_migration_paths(@manifest_path, @manifest) + end + + # run all necessary migrations + def run_migrations(manifest) + + # run bootstrap before user migrations to prepare database + run_bootstrap + + # loop through the manifest, executing migrations in turn + manifest.each_with_index do |migration, index| + execute_migration(migration.name, migration.filepath) + end + + end + + # executes the bootstrap method + def run_bootstrap + bootstrap = File.join(@manifest_path, UP_DIRNAME, BOOTSTRAP_FILENAME) + execute_migration('bootstrap.sql', bootstrap) + end + + # execute a single migration by loading it's statements from file, and then executing each + def execute_migration(name, filepath) + @log.info "executing migration #{filepath}" + + statements = @sql_reader.load_migration(filepath) + if statements.length == 0 + raise 'no statements found in migration #{filepath}' + end + run_migration(name, statements) + end + + # execute all the statements of a single migration + def run_migration(name, statements) + + begin + statements.each do |statement| + conn.exec(statement).clear + end + rescue Exception => e + # we make a special allowance for one exception; it just means this migration + # has already occurred, and we should just treat it like a continue + if e.message.index('pg_migrate: code=migration_exists').nil? + conn.exec("ROLLBACK") + raise e + else + conn.exec("ROLLBACK") + @log.info "migration #{name} already run" + end + end + end + end +end +