Class: Tina4::Migration

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

Constant Summary collapse

TRACKING_TABLE =
"tina4_migrations"

Instance Method Summary collapse

Constructor Details

#initialize(db, migrations_dir: nil) ⇒ Migration

Returns a new instance of Migration.



8
9
10
11
12
# File 'lib/tina4/migration.rb', line 8

def initialize(db, migrations_dir: nil)
  @db = db
  @migrations_dir = migrations_dir || File.join(Dir.pwd, "migrations")
  ensure_tracking_table
end

Instance Method Details

#create(name) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/tina4/migration.rb', line 50

def create(name)
  FileUtils.mkdir_p(@migrations_dir)
  timestamp = Time.now.strftime("%Y%m%d%H%M%S")
  filename = "#{timestamp}_#{name.gsub(/\s+/, '_')}.sql"
  filepath = File.join(@migrations_dir, filename)
  File.write(filepath, "-- Migration: #{name}\n-- Created: #{Time.now}\n\n")

  down_filepath = filepath.sub(".sql", ".down.sql")
  File.write(down_filepath, "-- Rollback: #{name}\n-- Created: #{Time.now}\n\n")

  Tina4::Debug.info("Created migration: #{filename}")
  filepath
end

#rollback(steps = 1) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/tina4/migration.rb', line 29

def rollback(steps = 1)
  completed = completed_migrations.last(steps)
  completed.reverse.each do |name|
    down_file = File.join(@migrations_dir, name.sub(".sql", ".down.sql"))
    if File.exist?(down_file)
      execute_sql_file(down_file)
      remove_migration_record(name)
      Tina4::Debug.info("Rolled back: #{name}")
    else
      Tina4::Debug.warning("No rollback file for: #{name}")
    end
  end
end

#runObject



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/tina4/migration.rb', line 14

def run
  pending = pending_migrations
  if pending.empty?
    Tina4::Debug.info("No pending migrations")
    return []
  end

  results = []
  pending.each do |file|
    result = run_migration(file)
    results << result
  end
  results
end

#statusObject



43
44
45
46
47
48
# File 'lib/tina4/migration.rb', line 43

def status
  {
    completed: completed_migrations,
    pending: pending_migrations.map { |f| File.basename(f) }
  }
end