ridgepole 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/ridgepole/delta.rb +1 -1
- data/lib/ridgepole/diff.rb +3 -3
- data/lib/ridgepole/dsl_parser.rb +25 -7
- data/lib/ridgepole/version.rb +1 -1
- data/spec/mysql/fk/migrate_create_fk_spec.rb +53 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a09a114ad24ead5072a479593d757ea2dad1d0f42ebf9ae84febad36db8ba78
|
4
|
+
data.tar.gz: e4e14f15a869ac1b66cff3b869f4ca5d246975e4b62e4a8f5e8ecf040efe9d9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a664d190502ef67c91b9dc96f95cf4289812195939f8193354fea005de1bb83a31e479758dc0c64115dae02b6c7d62588fcd89f9129ebc2664c0bf8eef5906c1
|
7
|
+
data.tar.gz: ac81928fe43c71c13542686361af7d54868782728a1d02731f431827dba66204098baf6b2a674cf817b239f285b94b5e2edf48d842997e7cdf47b238234aac71
|
data/README.md
CHANGED
@@ -107,6 +107,8 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
|
|
107
107
|
* Support `postgres://` schema ([pull#285](https://github.com/winebarrel/ridgepole/pull/285))
|
108
108
|
* `>= 0.8.3`
|
109
109
|
* Fix "topological sort failed" error ([pull#287](https://github.com/winebarrel/ridgepole/pull/287))
|
110
|
+
* `>= 0.8.4`
|
111
|
+
* Display a warning if an InnoDB table doesn't have any indexes on a column where it has a foreign key ([pull#290](https://github.com/winebarrel/ridgepole/pull/290))
|
110
112
|
</details>
|
111
113
|
|
112
114
|
## Installation
|
data/lib/ridgepole/delta.rb
CHANGED
@@ -191,7 +191,7 @@ module Ridgepole
|
|
191
191
|
errmsg = lines.with_index.map do |l, i|
|
192
192
|
line_num = i + 1
|
193
193
|
prefix = line_num == err_num ? '* ' : ' '
|
194
|
-
format("#{prefix}
|
194
|
+
format("#{prefix}%<line_num>#{digit_number}d: #{l}", line_num: line_num)
|
195
195
|
end
|
196
196
|
|
197
197
|
if err_num > 0
|
data/lib/ridgepole/diff.rb
CHANGED
@@ -565,10 +565,10 @@ module Ridgepole
|
|
565
565
|
child_label = "#{child_table}.#{column_name}"
|
566
566
|
label_len = [parent_label.length, child_label.length].max
|
567
567
|
|
568
|
-
@logger.warn(format(<<-MSG,
|
568
|
+
@logger.warn(format(<<-MSG, parent_label: parent_label, child_label: child_label))
|
569
569
|
[WARNING] Relation column type is different.
|
570
|
-
|
571
|
-
|
570
|
+
%<parent_label>#{label_len}s: #{parent_column_info}
|
571
|
+
%<child_label>#{label_len}s: #{child_column_info}
|
572
572
|
MSG
|
573
573
|
end
|
574
574
|
end
|
data/lib/ridgepole/dsl_parser.rb
CHANGED
@@ -8,22 +8,40 @@ module Ridgepole
|
|
8
8
|
|
9
9
|
def parse(dsl, opts = {})
|
10
10
|
definition, execute = Context.eval(dsl, opts)
|
11
|
-
|
12
|
-
check_orphan_foreign_key(definition)
|
11
|
+
check_definition(definition)
|
13
12
|
[definition, execute]
|
14
13
|
end
|
15
14
|
|
16
15
|
private
|
17
16
|
|
18
|
-
def
|
17
|
+
def check_definition(definition)
|
19
18
|
definition.each do |table_name, attrs|
|
20
|
-
|
19
|
+
check_orphan_index(table_name, attrs)
|
20
|
+
check_orphan_foreign_key(table_name, attrs)
|
21
|
+
check_foreign_key_without_index(table_name, attrs)
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
25
|
+
def check_orphan_index(table_name, attrs)
|
26
|
+
raise "Table `#{table_name}` to create the index is not defined: #{attrs[:indices].keys.join(',')}" if attrs[:indices] && !(attrs[:definition])
|
27
|
+
end
|
28
|
+
|
29
|
+
def check_orphan_foreign_key(table_name, attrs)
|
30
|
+
raise "Table `#{table_name}` to create the foreign key is not defined: #{attrs[:foreign_keys].keys.join(',')}" if attrs[:foreign_keys] && !(attrs[:definition])
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_foreign_key_without_index(table_name, attrs)
|
34
|
+
return unless attrs[:foreign_keys]
|
35
|
+
return unless attrs[:options][:options]&.include?('ENGINE=InnoDB')
|
36
|
+
|
37
|
+
attrs[:foreign_keys].each do |_, foreign_key_attrs|
|
38
|
+
fk_index = foreign_key_attrs[:options][:column] || "#{foreign_key_attrs[:to_table].singularize}_id"
|
39
|
+
next if attrs[:indices]&.any? { |_k, v| v[:column_name].first == fk_index }
|
40
|
+
|
41
|
+
Ridgepole::Logger.instance.warn(<<-MSG)
|
42
|
+
[WARNING] Table `#{table_name}` has a foreign key on `#{fk_index}` column, but doesn't have any indexes on the column.
|
43
|
+
Although an index will be added automatically by InnoDB, please add an index explicitly for your future operations.
|
44
|
+
MSG
|
27
45
|
end
|
28
46
|
end
|
29
47
|
end
|
data/lib/ridgepole/version.rb
CHANGED
@@ -169,4 +169,57 @@ describe 'Ridgepole::Client#diff -> migrate' do
|
|
169
169
|
end.to raise_error('Table `child` to create the foreign key is not defined: child_ibfk_1')
|
170
170
|
}
|
171
171
|
end
|
172
|
+
|
173
|
+
context 'when create fk without any indexes for its column' do
|
174
|
+
let(:dsl) do
|
175
|
+
erbh(<<-ERB)
|
176
|
+
create_table "parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
177
|
+
end
|
178
|
+
|
179
|
+
create_table "child", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
180
|
+
t.integer "parent_id"
|
181
|
+
end
|
182
|
+
add_foreign_key "child", "parent", name: "child_ibfk_1"
|
183
|
+
ERB
|
184
|
+
end
|
185
|
+
|
186
|
+
subject { client(dump_without_table_options: false) }
|
187
|
+
|
188
|
+
it {
|
189
|
+
expect(Ridgepole::Logger.instance).to receive(:warn).with(<<-MSG).twice
|
190
|
+
[WARNING] Table `child` has a foreign key on `parent_id` column, but doesn't have any indexes on the column.
|
191
|
+
Although an index will be added automatically by InnoDB, please add an index explicitly for your future operations.
|
192
|
+
MSG
|
193
|
+
subject.diff(dsl).migrate
|
194
|
+
|
195
|
+
expect do
|
196
|
+
subject.diff(dsl).migrate
|
197
|
+
end.to raise_error(/Mysql2::Error: Cannot drop index/)
|
198
|
+
}
|
199
|
+
end
|
200
|
+
|
201
|
+
context 'when create fk with first key of multiple column indexes for its column' do
|
202
|
+
let(:dsl) do
|
203
|
+
erbh(<<-ERB)
|
204
|
+
create_table "parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
205
|
+
end
|
206
|
+
|
207
|
+
create_table "child", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
|
208
|
+
t.integer "parent_id"
|
209
|
+
t.string "name"
|
210
|
+
t.index ["parent_id", "name"], name: "par_id", <%= i cond(5.0, using: :btree) %>
|
211
|
+
end
|
212
|
+
add_foreign_key "child", "parent", name: "child_ibfk_1"
|
213
|
+
ERB
|
214
|
+
end
|
215
|
+
|
216
|
+
subject { client(dump_without_table_options: false) }
|
217
|
+
|
218
|
+
it {
|
219
|
+
expect(Ridgepole::Logger.instance).to_not receive(:warn)
|
220
|
+
subject.diff(dsl).migrate
|
221
|
+
|
222
|
+
expect { subject.diff(dsl).migrate }.to_not raise_error
|
223
|
+
}
|
224
|
+
end
|
172
225
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ridgepole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|