Class: DBGeni::MigrationCLI

Inherits:
Object
  • Object
show all
Defined in:
lib/dbgeni/migration_cli.rb

Direct Known Subclasses

DmlCLI

Instance Method Summary collapse

Constructor Details

#initialize(base_installer, config, logger) ⇒ MigrationCLI

Returns a new instance of MigrationCLI.


4
5
6
7
8
9
# File 'lib/dbgeni/migration_cli.rb', line 4

def initialize(base_installer, config, logger)
  @base       = base_installer
  @config     = config
  @logger     = logger
  set_plugin_hooks
end

Instance Method Details

#applied_and_broken_migrationsObject


28
29
30
31
32
# File 'lib/dbgeni/migration_cli.rb', line 28

def applied_and_broken_migrations
  ensure_initialized
  migrations
  @migration_list.applied_and_broken(@config, connection)
end

#applied_migrationsObject


22
23
24
25
26
# File 'lib/dbgeni/migration_cli.rb', line 22

def applied_migrations
  ensure_initialized
  migrations
  @migration_list.applied(@config, connection)
end

#apply_all_migrations(force = nil) ⇒ Object

Applying


42
43
44
45
46
47
48
49
# File 'lib/dbgeni/migration_cli.rb', line 42

def apply_all_migrations(force=nil)
  ensure_initialized
  migrations = outstanding_migrations
  if migrations.length == 0
    raise DBGeni::NoOutstandingMigrations
  end
  apply_migration_list(migrations, force)
end

#apply_list_of_migrations(migration_list, force = nil) ⇒ Object


72
73
74
75
76
# File 'lib/dbgeni/migration_cli.rb', line 72

def apply_list_of_migrations(migration_list, force=nil)
  ensure_initialized
  migration_files = list_of_migrations(migration_list)
  apply_migration_list(migration_files, force)
end

#apply_migration(migration, force = nil) ⇒ Object


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/dbgeni/migration_cli.rb', line 79

def apply_migration(migration, force=nil)
  ensure_initialized
  begin
    run_plugin(@before_up_run_plugin, migration)
    migration.apply!(@config, connection, force)
    @logger.info "Applied #{migration.to_s}"
    run_plugin(@after_up_run_plugin, migration)
  rescue DBGeni::MigratorCouldNotConnect
    @logger.error "Failed to connect to the database CLI"
    raise DBGeni::MigrationApplyFailed, migration.to_s
  rescue DBGeni::MigrationApplyFailed
    @logger.error "Failed #{migration.to_s}. Errors in #{migration.logfile}\n\n#{migration.error_messages}\n\n"
    raise DBGeni::MigrationApplyFailed, migration.to_s
  end
end

#apply_next_migration(force = nil) ⇒ Object


51
52
53
54
55
56
57
58
# File 'lib/dbgeni/migration_cli.rb', line 51

def apply_next_migration(force=nil)
  ensure_initialized
  migrations = outstanding_migrations
  if migrations.length == 0
    raise DBGeni::NoOutstandingMigrations
  end
  apply_migration_list([migrations.first], force)
end

#apply_until_migration(migration_name, force = nil) ⇒ Object


60
61
62
63
64
65
66
67
68
69
70
# File 'lib/dbgeni/migration_cli.rb', line 60

def apply_until_migration(migration_name, force=nil)
  ensure_initialized
  milestone = find_migration(migration_name)
  outstanding = outstanding_migrations
  index = outstanding.index milestone
  unless index
    # milestone migration doesn't exist or is already applied.
    raise MigrationNotOutstanding, milestone.to_s
  end
  apply_migration_list(outstanding[0..index], force)
end

#list_of_migrations(list) ⇒ Object


34
35
36
37
38
# File 'lib/dbgeni/migration_cli.rb', line 34

def list_of_migrations(list)
  ensure_initialized
  migrations
  @migration_list.list(list, @config, connection)
end

#migrationsObject


11
12
13
14
# File 'lib/dbgeni/migration_cli.rb', line 11

def migrations
  @migration_list ||= DBGeni::MigrationList.new(@config.migration_directory) unless @migration_list
  @migration_list.migrations
end

#outstanding_migrationsObject


16
17
18
19
20
# File 'lib/dbgeni/migration_cli.rb', line 16

def outstanding_migrations
  ensure_initialized
  migrations
  @migration_list.outstanding(@config, connection)
end

#rollback_all_migrations(force = nil) ⇒ Object

rolling back


97
98
99
100
101
102
103
104
# File 'lib/dbgeni/migration_cli.rb', line 97

def rollback_all_migrations(force=nil)
  ensure_initialized
  migrations = applied_and_broken_migrations.reverse
  if migrations.length == 0
    raise DBGeni::NoAppliedMigrations
  end
  apply_migration_list(migrations, force, false)
end

#rollback_last_migration(force = nil) ⇒ Object


106
107
108
109
110
111
112
113
114
# File 'lib/dbgeni/migration_cli.rb', line 106

def rollback_last_migration(force=nil)
  ensure_initialized
  migrations = applied_and_broken_migrations
  if migrations.length == 0
    raise DBGeni::NoAppliedMigrations
  end
  # the most recent one is at the end of the array!!
  apply_migration_list([migrations.last], force, false)
end

#rollback_list_of_migrations(migration_list, force = nil) ⇒ Object


130
131
132
133
134
# File 'lib/dbgeni/migration_cli.rb', line 130

def rollback_list_of_migrations(migration_list, force=nil)
  ensure_initialized
  migration_files = list_of_migrations(migration_list).reverse
  apply_migration_list(migration_files, force, false)
end

#rollback_migration(migration, force = nil) ⇒ Object


136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/dbgeni/migration_cli.rb', line 136

def rollback_migration(migration, force=nil)
  ensure_initialized
  begin
    run_plugin(@before_down_run_plugin, migration)
    migration.rollback!(@config, connection, force)
    @logger.info  "Rolledback #{migration.to_s}"
    run_plugin(@after_down_run_plugin, migration)
  rescue DBGeni::MigratorCouldNotConnect
    @logger.error "Failed to connect to the database CLI"
    raise DBGeni::MigrationApplyFailed, migration.to_s
  rescue DBGeni::MigrationApplyFailed
    @logger.error "Failed #{migration.to_s}. Errors in #{migration.logfile}\n\n#{migration.error_messages}\n\n"
    raise DBGeni::MigrationApplyFailed, migration.to_s
  end
end

#rollback_until_migration(migration_name, force = nil) ⇒ Object


116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/dbgeni/migration_cli.rb', line 116

def rollback_until_migration(migration_name, force=nil)
  ensure_initialized
  milestone = find_migration(migration_name)
  applied = applied_and_broken_migrations.reverse
  index = applied.index milestone
  unless index
    # milestone migration doesn't exist or is already applied.
    raise DBGeni::MigrationNotApplied, milestone.to_s
  end
  # Note the triple ... in the range to exclude the end element
  # This is because we don't want to rollback the final migration as its upto but not including
  apply_migration_list(applied[0...index], force, false)
end