class Migration
Public Class Methods
new(path)
click to toggle source
# File lib/migsql/migration.rb, line 7 def initialize(path) @path = path @root = File.dirname(@path) @servers = {} end
Public Instance Methods
apply_migration(server_name, migration)
click to toggle source
# File lib/migsql/migration.rb, line 119 def apply_migration(server_name, migration) migration_name, updown = /([0-9]+.*)_(.*)\.sql/.match(migration).captures puts " - #{migration_name} #{updown}".white server = get_server(server_name) server.apply_migration(migration) server.set_migration_status(migration_name) if updown.eql? 'up' end
apply_migration_plan(server_name, migration_plan, final_state)
click to toggle source
# File lib/migsql/migration.rb, line 109 def apply_migration_plan(server_name, migration_plan, final_state) puts "Applying migration to: #{server_name}".yellow migration_plan.each do |migration| apply_migration server_name, migration end server = get_server(server_name) server.set_migration_status(final_state) puts "Migration Complete, current state: #{final_state}".green end
count_servers()
click to toggle source
# File lib/migsql/migration.rb, line 34 def count_servers @servers.length end
create_migration(server_name, migration_name)
click to toggle source
# File lib/migsql/migration.rb, line 38 def create_migration(server_name, migration_name) if get_migration_by_name(server_name, migration_name).nil? migration_name = "#{DateTime.now.strftime('%Q')}_#{migration_name}" server_root = "#{@root}/#{server_name}" up = "#{server_root}/#{migration_name}_up.sql" down = "#{server_root}/#{migration_name}_down.sql" FileUtils.mkdir_p server_root FileUtils.touch up FileUtils.touch down puts "Migration '#{migration_name}' created.".green puts "Up: #{up}".white puts "Down: #{down}".white return true else puts 'Error: migration name already in use'.red return false end end
create_server(name, address, database, username, password)
click to toggle source
# File lib/migsql/migration.rb, line 13 def create_server(name, address, database, username, password) @servers[name] = SqlServer.new name, address, database, username, password end
get_down_plan(server_name, to, from)
click to toggle source
# File lib/migsql/migration.rb, line 92 def get_down_plan(server_name, to, from) plan = [] get_migration_files(server_name, 'down').reverse.each do |migration| current_item = /([0-9]+)_?.*/.match(migration).captures[0] plan.push(migration) if current_item > to && current_item <= from end plan end
get_first_server_name()
click to toggle source
# File lib/migsql/migration.rb, line 21 def get_first_server_name @servers.keys.first end
get_latest_migration(server_name)
click to toggle source
# File lib/migsql/migration.rb, line 57 def get_latest_migration(server_name) server_root = "#{@root}/#{server_name}" latest_mig = File.basename(Dir["#{server_root}/*_up.sql"].sort.reverse[0]) /([0-9]+_.*)(_up|_down)\.sql/.match(latest_mig).captures[0] end
get_migration_by_name(server_name, name)
click to toggle source
# File lib/migsql/migration.rb, line 101 def get_migration_by_name(server_name, name) server_root = "#{@root}/#{server_name}" migration = Dir["#{server_root}/*#{name}_up.sql"][0] migration = /([0-9]+_.*)(_up|_down)\.sql/.match(migration).captures[0]\ unless migration.nil? migration end
get_migration_files(server_name, direction)
click to toggle source
# File lib/migsql/migration.rb, line 78 def get_migration_files(server_name, direction) server_root = "#{@root}/#{server_name}" Dir["#{server_root}/*_#{direction}.sql"].sort end
get_migration_plan(server_name, to, from)
click to toggle source
# File lib/migsql/migration.rb, line 63 def get_migration_plan(server_name, to, from) puts "Creating migration plan for #{server_name} from #{from} to #{to}" to ||= get_latest_migration(server_name) to_i = /([0-9]+)_?.*/.match(to).captures[0] from_i = /([0-9]+)_?.*/.match(from).captures[0] if to_i > from_i plan = get_up_plan server_name, to_i, from_i elsif to_i < from_i plan = get_down_plan server_name, to_i, from_i else puts 'No migration needed, database already at current level'.green end plan end
get_migration_status(server_name)
click to toggle source
# File lib/migsql/migration.rb, line 127 def get_migration_status(server_name) get_server(server_name).get_migration_status end
get_server(name)
click to toggle source
# File lib/migsql/migration.rb, line 17 def get_server(name) @servers[name] end
get_up_plan(server_name, to, from)
click to toggle source
# File lib/migsql/migration.rb, line 83 def get_up_plan(server_name, to, from) plan = [] get_migration_files(server_name, 'up').each do |migration| current_item = /([0-9]+)_?.*/.match(migration).captures[0] plan.push(migration) if current_item > from && current_item <= to end plan end
load()
click to toggle source
# File lib/migsql/migration.rb, line 30 def load @servers = YAML.load_file(@path) if File.file?(@path) end
save()
click to toggle source
# File lib/migsql/migration.rb, line 25 def save FileUtils.mkdir_p @root File.open(@path, 'w') { |f| f.write @servers.to_yaml } end