· 8 years ago · Jul 18, 2018, 05:16 PM
1##########################
2# CONFIG
3##########################
4
5# select and require the appropriate database driver here:
6require "pg"
7# require "sqlite"
8# require "mysql"
9
10TABLE_NAME = "schema_version"
11COLUMN_NAME = "version"
12
13migration_path = "db/migrations"
14MIGRATION_FILE_REGEX = /(?<version>\d+)(_(?<name>\w+))?\.sql/
15MIGRATION_CMD_PREFIX = /-- \+micrate/
16NEW_MIGRATION_CMD = "-- +migrate"
17
18##########################
19# Rewriting migration files
20##########################
21
22require "colorize"
23
24glob = File.join Dir.current, migration_path, "*.sql"
25puts "Searching in #{glob}"
26
27migration_versions = [] of String
28
29Dir[glob].each_with_index do |entry, i|
30 filename = File.basename entry
31
32 unless filename_parts = MIGRATION_FILE_REGEX.match(filename)
33 puts "#{filename} doesnt match, skipping"
34 next
35 end
36
37 migration_versions << filename_parts["version"]
38
39 lines = File.read_lines entry
40 lines_changed = 0
41 lines.map! do |line|
42 if MIGRATION_CMD_PREFIX.match line
43 lines_changed += 1
44 line.gsub MIGRATION_CMD_PREFIX, NEW_MIGRATION_CMD
45 else
46 line
47 end
48 end
49
50 if lines_changed > 0
51 print "rewriting: ".colorize(:green)
52 puts filename
53 lines.push "" if lines.last != ""
54 File.write entry, lines.join("\n")
55 end
56end
57
58last_version = migration_versions.sort.last
59
60###############################
61# WRITING NEW MIGRATION HISTORY
62###############################
63
64database_connection = DB.open(Amber.settings.database_url)
65
66statements = [] of String
67statements << "DROP TABLE IF EXISTS #{TABLE_NAME}"
68statements << "CREATE TABLE #{TABLE_NAME} (#{COLUMN_NAME} BIGINT NOT NULL)"
69statements << "TRUNCATE TABLE #{TABLE_NAME}"
70statements << "INSERT INTO #{TABLE_NAME} (#{COLUMN_NAME}) VALUES (#{last_version})"
71statements << "DROP TABLE IF EXISTS micrate_db_version"
72
73statements.each do |statement|
74 database_connection.exec statement
75end
76
77
78###############################
79# CONNECT MIGRATOR AND GET STATUS
80###############################
81
82require "../config/application"
83require "migrate"
84
85migrator = Migrate::Migrator.new(
86 database_connection,
87 Logger.new(STDOUT),
88 File.join("db", "migrations"), # Path to migrations
89 TABLE_NAME, # Version table name
90 COLUMN_NAME # Version column name
91)
92
93puts "connected to #{Amber.settings.database_url}"
94puts "current version: #{migrator.current_version}"
95puts "next version: #{migrator.next_version}"
96puts "previous version: #{migrator.previous_version}"