Skip to content

Commit

Permalink
Added --disable-integrity-v2 option - #94
Browse files Browse the repository at this point in the history
  • Loading branch information
ankane committed Jun 9, 2020
1 parent 6a85a68 commit 88d17cd
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## 0.6.2 (unreleased)

- Added `--disable-integrity-v2` option
- Fixed error when excluded table not found in source

## 0.6.1 (2020-06-07)
Expand Down
1 change: 1 addition & 0 deletions lib/pgsync/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def slop_options
o.boolean "--defer-constraints", "defer constraints", default: false
o.boolean "--disable-user-triggers", "disable non-system triggers", default: false
o.boolean "--disable-integrity", "disable foreign key triggers", default: false
o.boolean "--disable-integrity-v2", "disable foreign key triggers", default: false
o.boolean "-v", "--version", "print the version"
o.boolean "-h", "--help", "prints help"
o
Expand Down
12 changes: 10 additions & 2 deletions lib/pgsync/task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -275,15 +275,18 @@ def quoted_primary_key(table, primary_key, rule)
end

def maybe_disable_triggers
if opts[:disable_integrity] || opts[:disable_user_triggers]
if opts[:disable_integrity] || opts[:disable_integrity_v2] || opts[:disable_user_triggers]
destination.transaction do
triggers = destination.triggers(table)
triggers.select! { |t| t["enabled"] == "t" }
internal_triggers, user_triggers = triggers.partition { |t| t["internal"] == "t" }
integrity_triggers = internal_triggers.select { |t| t["integrity"] == "t" }
restore_triggers = []

if opts[:disable_integrity]
if opts[:disable_integrity_v2]
role = destination.execute("SHOW session_replication_role").first["session_replication_role"]
destination.execute("SET session_replication_role = replica")
elsif opts[:disable_integrity]
integrity_triggers.each do |trigger|
destination.execute("ALTER TABLE #{quoted_table} DISABLE TRIGGER #{quote_ident(trigger["name"])}")
end
Expand All @@ -300,6 +303,11 @@ def maybe_disable_triggers

result = yield

if opts[:disable_integrity_v2]
raise Error, "Unknown role: #{role}" unless ["origin", "replica", "local"].include?(role)
destination.execute("SET session_replication_role = #{role}")
end

# restore triggers that were previously enabled
restore_triggers.each do |trigger|
destination.execute("ALTER TABLE #{quoted_table} ENABLE TRIGGER #{quote_ident(trigger["name"])}")
Expand Down
10 changes: 10 additions & 0 deletions test/sync_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,14 @@ def test_disable_integrity
assert_equal [], conn2.exec("SELECT * FROM posts ORDER BY id").to_a
assert_equal [{"post_id" => 1}], conn2.exec("SELECT post_id FROM comments ORDER BY post_id").to_a
end

def test_disable_integrity_v2
insert(conn1, "posts", [{"id" => 1}])
insert(conn1, "comments", [{"post_id" => 1}])
assert_error "Sync failed for 1 table: comments", "comments", config: true
assert_works "comments --disable-integrity-v2", config: true
# integrity is lost! (as expected)
assert_equal [], conn2.exec("SELECT * FROM posts ORDER BY id").to_a
assert_equal [{"post_id" => 1}], conn2.exec("SELECT post_id FROM comments ORDER BY post_id").to_a
end
end

0 comments on commit 88d17cd

Please sign in to comment.