db-evolve 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tasks/db.rb +41 -10
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df4390a732399e47e5810e40f119ffc1dfaf48b2
4
- data.tar.gz: 9d90300f7b49ad447022b53320b3d88b14b39bbc
3
+ metadata.gz: 694c48e78daf4ddf885edf8bf20889058bc298cd
4
+ data.tar.gz: ac15d6126a72447c50b4d83ea9fe5631b7fb8315
5
5
  SHA512:
6
- metadata.gz: c433eed0a2d0df2b78438ef62ec61b91c0d303aff4ccb26b3399f96f64311296f424990d7701753ae7dcc9c27a4cb1cb4a573dd5c26c73783261cd97efc4c5d6
7
- data.tar.gz: 653cf0759eeae31361ab782e8b2660de2cdd2c18177f3d52222945a7ac7705916e18ef527463ff619a1efa067cebca4c3adc8bd683386af3424eea7d250e5e63
6
+ metadata.gz: 66620868e04882314151f08f9f3a739158c3dc016b4e6dd17cd3068d904a0c1f3188838a1ed4416404618d4266b985502f9e31d5cb45761d22de8f79fb0c708f
7
+ data.tar.gz: 62f3056ed8d5d15d0c57fd6b2a4bb9e1ae1f4aa8befe88e2d08f044b9983d383cf7e75e6d728dc145109f43e27065505e0202584c73c081131c8647f7e01b5a6
data/lib/tasks/db.rb CHANGED
@@ -105,7 +105,7 @@ def do_evolve(noop, yes, nowait)
105
105
 
106
106
  to_run += calc_index_changes(existing_indexes, $schema_indexes, renames, rename_cols_by_table)
107
107
 
108
- to_run += calc_fk_changes($foreign_keys, Set.new($schema_tables.keys) + Set.new(existing_tables.keys))
108
+ to_run += calc_fk_changes($foreign_keys, Set.new(existing_tables.keys), renames)
109
109
 
110
110
  to_run += calc_perms_changes($schema_tables, noop) unless $check_perms_for.empty?
111
111
 
@@ -169,6 +169,11 @@ end
169
169
  def calc_index_changes(existing_indexes, schema_indexes, table_renames, rename_cols_by_table)
170
170
  # rename_cols_by_table is by the new table name
171
171
  existing_indexes = Set.new existing_indexes
172
+ existing_indexes.each do |index|
173
+ if table_renames[index[:table]].present?
174
+ index[:table] = table_renames[index[:table]]
175
+ end
176
+ end
172
177
  schema_indexes = Set.new schema_indexes
173
178
 
174
179
  add_indexes = schema_indexes - existing_indexes
@@ -201,10 +206,10 @@ def calc_index_changes(existing_indexes, schema_indexes, table_renames, rename_c
201
206
  return to_run
202
207
  end
203
208
 
204
- def calc_fk_changes(foreign_keys, tables)
209
+ def calc_fk_changes(foreign_keys, existing_tables, renames)
205
210
  existing_foreign_keys = []
206
- unless tables.empty?
207
- tables_sql = (tables.map {|tn| ActiveRecord::Base.sanitize(tn)}).join(',')
211
+ unless existing_tables.empty?
212
+ existing_tables_sql = (existing_tables.map {|tn| ActiveRecord::Base.sanitize(tn)}).join(',')
208
213
  sql = %{
209
214
  SELECT
210
215
  tc.constraint_name, tc.table_name, kcu.column_name,
@@ -217,12 +222,16 @@ def calc_fk_changes(foreign_keys, tables)
217
222
  JOIN information_schema.constraint_column_usage AS ccu
218
223
  ON ccu.constraint_name = tc.constraint_name
219
224
  WHERE constraint_type = 'FOREIGN KEY'
220
- AND tc.table_name in (#{tables_sql});
225
+ AND tc.table_name in (#{existing_tables_sql});
221
226
  }
222
227
  build_pg_connection.exec(sql).each do |row|
228
+ from_table = row['table_name']
229
+ from_table = renames[from_table] if renames[from_table].present?
230
+ to_table = row['foreign_table_name']
231
+ to_table = renames[to_table] if renames[to_table].present?
223
232
  existing_foreign_keys << HashWithIndifferentAccess.new({
224
- :from_table => row['table_name'],
225
- :to_table => row['foreign_table_name'],
233
+ :from_table => from_table,
234
+ :to_table => to_table,
226
235
  :column => row['column_name'],
227
236
  :primary_key => row['foreign_column_name'],
228
237
  :name => row['constraint_name'],
@@ -234,6 +243,26 @@ def calc_fk_changes(foreign_keys, tables)
234
243
  foreign_keys = Set.new foreign_keys
235
244
  add_fks = foreign_keys - existing_foreign_keys
236
245
  delete_fks = existing_foreign_keys - foreign_keys
246
+
247
+ rename_fks = []
248
+ delete_fks.each do |delete_fk|
249
+ dfk = delete_fk.clone
250
+ dfk.delete(:name)
251
+ add_fks.each do |add_fk|
252
+ afk = add_fk.clone
253
+ afk.delete(:name)
254
+ if afk==dfk
255
+ delete_fks.delete delete_fk
256
+ add_fks.delete add_fk
257
+ rename_fks << {
258
+ :table => delete_fk[:from_table],
259
+ :from_name => delete_fk[:name],
260
+ :to_name => add_fk[:name]
261
+ }
262
+ # ALTER TABLE name RENAME CONSTRAINT "error_test_id_fkey" TO "the_new_name_fkey";
263
+ end
264
+ end
265
+ end
237
266
 
238
267
  to_run = []
239
268
  delete_fks.each do |fk|
@@ -242,6 +271,9 @@ def calc_fk_changes(foreign_keys, tables)
242
271
  add_fks.each do |fk|
243
272
  to_run << "ALTER TABLE #{escape_table(fk[:from_table])} ADD CONSTRAINT #{escape_table(fk[:name])} FOREIGN KEY (#{escape_table(fk[:column])}) REFERENCES #{escape_table(fk[:to_table])} (#{escape_table(fk[:primary_key])}) MATCH FULL"
244
273
  end
274
+ rename_fks.each do |fk|
275
+ to_run << "ALTER TABLE #{escape_table(fk[:table])} RENAME CONSTRAINT #{escape_table(fk[:from_name])} TO #{escape_table(fk[:to_name])}"
276
+ end
245
277
 
246
278
  if !to_run.empty?
247
279
  to_run.unshift("\n-- update foreign keys")
@@ -499,12 +531,11 @@ def gen_pg_adapter()
499
531
  end
500
532
 
501
533
  def sql_renames(renames)
502
- to_run = []
503
534
  pg_a = gen_pg_adapter()
504
535
  renames.each do |k,v|
505
536
  pg_a.rename_table(k, v)
506
- to_run += $tmp_to_run
507
537
  end
538
+ to_run = $tmp_to_run.clone
508
539
  if !to_run.empty?
509
540
  to_run.unshift("\n-- rename tables")
510
541
  end
@@ -539,7 +570,7 @@ def sql_adds(tables)
539
570
  $tmp_to_run << "REVOKE ALL ON #{(tables.map {|t| escape_table(t)}).join(',')} FROM #{$check_perms_for.to_a.join(',')}"
540
571
  end
541
572
  end
542
- return $tmp_to_run
573
+ return $tmp_to_run.clone
543
574
  end
544
575
 
545
576
  def can_convert(type1, type2)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db-evolve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Derek Anderson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-04 00:00:00.000000000 Z
11
+ date: 2016-03-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A diff/patch-esque tool to replace schema migrations in Ruby. See https://github.com/keredson/ruby-db-evolve
14
14
  for details.