forked from imdrasil/jennifer.cr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
runner.cr
55 lines (50 loc) · 1.68 KB
/
runner.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require "../support"
module Jennifer
module Migration
module Runner
def self.migrate
Adapter.adapter.ready_to_migrate!
return if ::Jennifer::Migration::Base::REGISTERED_MIGRATIONS.empty?
interpolation = {} of String => typeof(Base::REGISTERED_MIGRATIONS[0])
Base::REGISTERED_MIGRATIONS.each { |m| interpolation[m.to_s[-18..-1]] = m }
pending = interpolation.keys - Version.all.pluck(:version).flat_map(&.values)
return if pending.empty?
brocken = Version.where { version.in(pending) }.pluck(:version).flat_map(&.values)
unless brocken.empty?
puts "Can't run migrations because some of them are older then relase version."
puts "They are:"
brocken.each do |v|
puts "- #{v}"
end
return
end
pending.each do |p|
klass = interpolation[p]
puts "Migration #{klass}"
instance = klass.new
begin
instance.up
rescue e
instance.down
puts "rollbacked"
raise e
end
Version.create(version: p)
end
end
def self.create
puts Adapter.adapter_class.create_database
puts "DB created!"
end
def self.drop
puts Adapter.adapter_class.drop_database
puts "DB droped"
end
def self.generate(name)
time = Time.now.to_s("%Y%m%d%H%M%S%L")
str = "class #{name.camelcase + time} < Jennifer::Migration::Base\n def up\n end\n\n def down\n end\nend"
File.write(File.join(Config.migration_files_path.to_s, "#{time}_#{name.underscore}.cr"), str)
end
end
end
end