Class: Migration
- Inherits:
-
Object
- Object
- Migration
- Defined in:
- lib/migsql/migration.rb
Instance Method Summary collapse
- #apply_migration(server_name, migration) ⇒ Object
- #apply_migration_plan(server_name, migration_plan, final_state) ⇒ Object
- #count_servers ⇒ Object
- #create_migration(server_name, migration_name) ⇒ Object
- #create_server(name, address, database, username, password) ⇒ Object
- #get_down_plan(server_name, to, from) ⇒ Object
- #get_first_server_name ⇒ Object
- #get_latest_migration(server_name) ⇒ Object
- #get_migration_by_name(server_name, name) ⇒ Object
- #get_migration_files(server_name, direction) ⇒ Object
- #get_migration_plan(server_name, to, from) ⇒ Object
- #get_migration_status(server_name) ⇒ Object
- #get_server(name) ⇒ Object
- #get_up_plan(server_name, to, from) ⇒ Object
-
#initialize(path) ⇒ Migration
constructor
A new instance of Migration.
- #load ⇒ Object
- #save ⇒ Object
Constructor Details
#initialize(path) ⇒ Migration
Returns a new instance of Migration.
7 8 9 10 11 |
# File 'lib/migsql/migration.rb', line 7 def initialize(path) @path = path @root = File.dirname(@path) @servers = {} end |
Instance Method Details
#apply_migration(server_name, migration) ⇒ Object
119 120 121 122 123 124 125 |
# 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) ⇒ Object
109 110 111 112 113 114 115 116 117 |
# 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 ⇒ Object
34 35 36 |
# File 'lib/migsql/migration.rb', line 34 def count_servers @servers.length end |
#create_migration(server_name, migration_name) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# 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) ⇒ Object
13 14 15 |
# 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) ⇒ Object
92 93 94 95 96 97 98 99 |
# 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 ⇒ Object
21 22 23 |
# File 'lib/migsql/migration.rb', line 21 def get_first_server_name @servers.keys.first end |
#get_latest_migration(server_name) ⇒ Object
57 58 59 60 61 |
# 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) ⇒ Object
101 102 103 104 105 106 107 |
# 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) ⇒ Object
78 79 80 81 |
# 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) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# 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) ⇒ Object
127 128 129 |
# File 'lib/migsql/migration.rb', line 127 def get_migration_status(server_name) get_server(server_name).get_migration_status end |
#get_server(name) ⇒ Object
17 18 19 |
# File 'lib/migsql/migration.rb', line 17 def get_server(name) @servers[name] end |
#get_up_plan(server_name, to, from) ⇒ Object
83 84 85 86 87 88 89 90 |
# 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 ⇒ Object
30 31 32 |
# File 'lib/migsql/migration.rb', line 30 def load @servers = YAML.load_file(@path) if File.file?(@path) end |
#save ⇒ Object
25 26 27 28 |
# File 'lib/migsql/migration.rb', line 25 def save FileUtils.mkdir_p @root File.open(@path, 'w') { |f| f.write @servers.to_yaml } end |