Skip to content

Commit 309cb48

Browse files
committed
batch and stats
1 parent 002b677 commit 309cb48

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

lib/active_record/connection_adapters/cockroachdb/database_statements.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,22 @@ def insert_fixtures_set(fixture_set, tables_to_delete = [])
2323
fixture_inserts = build_fixture_statements(fixture_set)
2424
table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
2525
statements = table_deletes + fixture_inserts
26+
if !defined?($total)
27+
$total = 0
28+
$success = 0
29+
at_exit do
30+
puts "Skipping disable stat\nTotal: #{$total}, Success: #{$success} (#{($success.to_f / $total * 100).round(2)}%)"
31+
end
32+
end
2633

34+
$total += 1
2735
begin # much faster without disabling referential integrity, worth trying.
2836
transaction(requires_new: true) do
2937
execute_batch(statements, "Fixtures Load")
3038
end
39+
$success += 1
3140
rescue
32-
puts "Retrying fixture load with referential integrity disabled for #{fixture_set}"
41+
print "X"
3342
disable_referential_integrity do
3443
execute_batch(statements, "Fixtures Load")
3544
end

lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ def check_all_foreign_keys_valid!
3636
def disable_referential_integrity
3737
foreign_keys = all_foreign_keys
3838

39-
foreign_keys.each do |foreign_key|
39+
statements = foreign_keys.map do |foreign_key|
4040
# We do not use the `#remove_foreign_key` method here because it
4141
# checks for foreign keys existance in the schema cache. This method
4242
# is performance critical and we know the foreign key exist.
4343
at = create_alter_table foreign_key.from_table
4444
at.drop_foreign_key foreign_key.name
4545

46-
execute schema_creation.accept(at)
46+
schema_creation.accept(at)
4747
end
48+
execute_batch(statements, "Disable referential integrity -> remove foreign keys")
4849

4950
yield
5051

@@ -66,11 +67,16 @@ def disable_referential_integrity
6667
# for every key. This method is performance critical for the test suite, hence
6768
# we use the `#all_foreign_keys` method that only make one query to the database.
6869
already_inserted_foreign_keys = all_foreign_keys
69-
foreign_keys.each do |foreign_key|
70+
statements = foreign_keys.map do |foreign_key|
7071
next if already_inserted_foreign_keys.any? { |fk| fk.from_table == foreign_key.from_table && fk.options[:name] == foreign_key.options[:name] }
7172

72-
add_foreign_key(foreign_key.from_table, foreign_key.to_table, **foreign_key.options)
73+
options = foreign_key_options(foreign_key.from_table, foreign_key.to_table, foreign_key.options)
74+
at = create_alter_table foreign_key.from_table
75+
at.add_foreign_key foreign_key.to_table, options
76+
77+
schema_creation.accept(at)
7378
end
79+
execute_batch(statements.compact, "Disable referential integrity -> add foreign keys")
7480
ensure
7581
ActiveRecord::Base.table_name_prefix = old_prefix
7682
ActiveRecord::Base.table_name_suffix = old_suffix

0 commit comments

Comments
 (0)