|
|
|
|
|
|
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
class MigrationContext < ActiveRecord::MigrationContext |
|
|
|
|
|
def up(target_version = nil) |
|
|
|
|
|
selected_migrations = if block_given? |
|
|
|
|
|
migrations.select { |m| yield m } |
|
|
|
|
|
else |
|
|
|
|
|
migrations |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
Migrator.new(:up, selected_migrations, target_version).migrate |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def down(target_version = nil) |
|
|
|
|
|
selected_migrations = if block_given? |
|
|
|
|
|
migrations.select { |m| yield m } |
|
|
|
|
|
else |
|
|
|
|
|
migrations |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
Migrator.new(:down, selected_migrations, target_version).migrate |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def run(direction, target_version) |
|
|
|
|
|
Migrator.new(direction, migrations, target_version).run |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def open |
|
|
|
|
|
Migrator.new(:up, migrations, nil) |
|
|
|
|
|
end |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
class Migrator < ActiveRecord::Migrator |
|
|
class Migrator < ActiveRecord::Migrator |
|
|
# We need to be able to set the 'current' plugin being migrated. |
|
|
# We need to be able to set the 'current' plugin being migrated. |
|
|
cattr_accessor :current_plugin |
|
|
cattr_accessor :current_plugin |
|
|
|
|
|
|
|
|
def migrate_plugin(plugin, version) |
|
|
def migrate_plugin(plugin, version) |
|
|
self.current_plugin = plugin |
|
|
self.current_plugin = plugin |
|
|
return if current_version(plugin) == version |
|
|
return if current_version(plugin) == version |
|
|
migrate(plugin.migration_directory, version) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MigrationContext.new(plugin.migration_directory).migrate(version) |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
def current_version(plugin=current_plugin) |
|
|
|
|
|
|
|
|
def get_all_versions(plugin = current_plugin) |
|
|
# Delete migrations that don't match .. to_i will work because the number comes first |
|
|
# Delete migrations that don't match .. to_i will work because the number comes first |
|
|
sm_table = ::ActiveRecord::SchemaMigration.table_name |
|
|
|
|
|
::ActiveRecord::Base.connection.select_values( |
|
|
|
|
|
"SELECT version FROM #{sm_table}" |
|
|
|
|
|
).delete_if{ |v| v.match(/-#{plugin.id}$/) == nil }.map(&:to_i).max || 0 |
|
|
|
|
|
|
|
|
@all_versions ||= {} |
|
|
|
|
|
@all_versions[plugin.id.to_s] ||= begin |
|
|
|
|
|
sm_table = ::ActiveRecord::SchemaMigration.table_name |
|
|
|
|
|
migration_versions = ActiveRecord::Base.connection.select_values("SELECT version FROM #{sm_table}") |
|
|
|
|
|
versions_by_plugins = migration_versions.group_by { |version| version.match(/-(.*)$/).try(:[], 1) } |
|
|
|
|
|
@all_versions = versions_by_plugins.transform_values! {|versions| versions.map!(&:to_i).sort! } |
|
|
|
|
|
@all_versions[plugin.id.to_s] || [] |
|
|
|
|
|
end |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def current_version(plugin = current_plugin) |
|
|
|
|
|
get_all_versions(plugin).last || 0 |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
def migrated |
|
|
|
|
|
sm_table = ::ActiveRecord::SchemaMigration.table_name |
|
|
|
|
|
::ActiveRecord::Base.connection.select_values( |
|
|
|
|
|
"SELECT version FROM #{sm_table}" |
|
|
|
|
|
).delete_if{ |v| v.match(/-#{current_plugin.id}$/) == nil }.map(&:to_i).sort |
|
|
|
|
|
|
|
|
def load_migrated |
|
|
|
|
|
@migrated_versions = Set.new(self.class.get_all_versions(current_plugin)) |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
def record_version_state_after_migrating(version) |
|
|
def record_version_state_after_migrating(version) |