Class: DataMigrate::DatabaseTasks

Inherits:
Object
  • Object
show all
Extended by:
ActiveRecord::Tasks::DatabaseTasks
Defined in:
lib/data_migrate/database_tasks.rb

Overview

This class extends DatabaseTasks to add a schema_file method.

Class Method Summary collapse

Class Method Details

.check_schema_file(filename) ⇒ Object



30
31
32
33
34
35
# File 'lib/data_migrate/database_tasks.rb', line 30

def check_schema_file(filename)
  unless File.exist?(filename)
    message = +%{#{filename} doesn't exist yet. Run `rake data:migrate` to create it, then try again.}
    Kernel.abort message
  end
end

.data_migrations_pathObject



52
53
54
# File 'lib/data_migrate/database_tasks.rb', line 52

def data_migrations_path
  ::DataMigrate.config.data_migrations_path
end

.dump_filename(spec_name, format = ActiveRecord::Base.schema_format) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/data_migrate/database_tasks.rb', line 20

def dump_filename(spec_name, format = ActiveRecord::Base.schema_format)
  filename = if spec_name == "primary"
    schema_file_type(format)
  else
    "#{spec_name}_#{schema_file_type(format)}"
  end

  ENV["DATA_SCHEMA"] || File.join(db_dir, filename)
end

.forward(step = 1) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/data_migrate/database_tasks.rb', line 87

def self.forward(step = 1)
  DataMigrate::DataMigrator.create_data_schema_table
  migrations = pending_migrations.reverse.pop(step).reverse
  migrations.each do | pending_migration |
    if pending_migration[:kind] == :data
      ActiveRecord::Migration.write("== %s %s" % ["Data", "=" * 71])
      DataMigrate::DataMigrator.run(:up, data_migrations_path, pending_migration[:version])
    elsif pending_migration[:kind] == :schema
      ActiveRecord::Migration.write("== %s %s" % ["Schema", "=" * 69])
      DataMigrate::SchemaMigration.run(:up, DataMigrate::SchemaMigration.migrations_paths, pending_migration[:version])
    end
  end
end

.past_migrations(sort = nil) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/data_migrate/database_tasks.rb', line 111

def self.past_migrations(sort = nil)
  data_versions = DataMigrate::DataSchemaMigration.table_exists? ? DataMigrate::DataSchemaMigration.normalized_versions : []
  schema_versions = ActiveRecord::SchemaMigration.normalized_versions
  migrations = data_versions.map { |v| { version: v.to_i, kind: :data } } + schema_versions.map { |v| { version: v.to_i, kind: :schema } }

  sort&.downcase == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse
end

.pending_data_migrationsObject



101
102
103
104
105
# File 'lib/data_migrate/database_tasks.rb', line 101

def self.pending_data_migrations
  data_migrations = DataMigrate::DataMigrator.migrations(data_migrations_path)
  sort_migrations(DataMigrate::DataMigrator.new(:up, data_migrations ).
    pending_migrations.map {|m| { version: m.version, name: m.name, kind: :data }})
end

.pending_migrationsObject



37
38
39
40
41
42
# File 'lib/data_migrate/database_tasks.rb', line 37

def pending_migrations
  sort_migrations(
    pending_schema_migrations,
    pending_data_migrations
  )
end

.pending_schema_migrationsObject



107
108
109
# File 'lib/data_migrate/database_tasks.rb', line 107

def self.pending_schema_migrations
  ::DataMigrate::SchemaMigration.pending_schema_migrations
end

.run_migration(migration, direction) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/data_migrate/database_tasks.rb', line 56

def run_migration(migration, direction)
  if migration[:kind] == :data
    ::ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71])
    ::DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version])
  else
    ::ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69])
    ::DataMigrate::SchemaMigration.run(
      direction,
      ::DataMigrate::SchemaMigration.migrations_paths,
      migration[:version]
    )
  end
end

.schema_dump_path(db_config, format = ActiveRecord.schema_format) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/data_migrate/database_tasks.rb', line 70

def schema_dump_path(db_config, format = ActiveRecord.schema_format)
  return ENV["DATA_SCHEMA"] if ENV["DATA_SCHEMA"]

  # We only require a schema.rb file for the primary database
  return unless db_config.primary?

  super.gsub(/(_)?schema\.rb\z/, '\1data_schema.rb')
end

.schema_file(_format = nil) ⇒ Object



12
13
14
# File 'lib/data_migrate/database_tasks.rb', line 12

def schema_file(_format = nil)
  File.join(db_dir, "data_schema.rb")
end

.schema_file_type(_format = nil) ⇒ Object



16
17
18
# File 'lib/data_migrate/database_tasks.rb', line 16

def schema_file_type(_format = nil)
  "data_schema.rb"
end

.schema_sha1(file) ⇒ Object

Override this method from ActiveRecord::Tasks::DatabaseTasks to ensure that the sha saved in ar_internal_metadata table is from the original schema.rb file



82
83
84
# File 'lib/data_migrate/database_tasks.rb', line 82

def schema_sha1(file)
  super(file.gsub(/data_schema.rb\z/, 'schema.rb'))
end

.sort_migrations(*migrations) ⇒ Object



44
45
46
# File 'lib/data_migrate/database_tasks.rb', line 44

def sort_migrations(*migrations)
  migrations.flatten.sort { |a, b|  sort_string(a) <=> sort_string(b) }
end

.sort_string(migration) ⇒ Object



48
49
50
# File 'lib/data_migrate/database_tasks.rb', line 48

def sort_string migration
  "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
end