Class: Migration

Inherits:
Object
  • Object
show all
Defined in:
lib/migsql/migration.rb

Instance Method Summary collapse

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_serversObject



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_nameObject



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

#loadObject



30
31
32
# File 'lib/migsql/migration.rb', line 30

def load
  @servers = YAML.load_file(@path) if File.file?(@path)
end

#saveObject



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