From 47aa10c7fa3a27cb57399538f79a3891fc3d1a75 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Mon, 10 May 2010 15:25:56 +0300 Subject: [PATCH] londiste.local_remove_table: dynamically detect triggers to be dropped. --- sql/londiste/expected/londiste_provider.out | 11 ++++++++++ .../functions/londiste.local_remove_table.sql | 21 +++++++++++++++---- sql/londiste/sql/londiste_provider.sql | 2 ++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/sql/londiste/expected/londiste_provider.out b/sql/londiste/expected/londiste_provider.out index fb162245..e7c21fbb 100644 --- a/sql/londiste/expected/londiste_provider.out +++ b/sql/londiste/expected/londiste_provider.out @@ -41,6 +41,12 @@ select * from londiste.local_add_table('aset', 'public.testdata'); 200 | Table added: public.testdata (1 row) +select tgname from pg_trigger where tgrelid = 'public.testdata'::regclass; + tgname +---------------- + _londiste_aset +(1 row) + insert into testdata (txt) values ('test-data'); select * from londiste.get_table_list('aset'); table_name | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role @@ -68,6 +74,11 @@ select * from londiste.local_remove_table('aset', 'public.testdata'); 400 | Table not found: public.testdata (1 row) +select tgname from pg_trigger where tgrelid = 'public.testdata'::regclass; + tgname +-------- +(0 rows) + select * from londiste.get_table_list('aset'); table_name | local | merge_state | custom_snapshot | table_attrs | dropped_ddl | copy_role ------------+-------+-------------+-----------------+-------------+-------------+----------- diff --git a/sql/londiste/functions/londiste.local_remove_table.sql b/sql/londiste/functions/londiste.local_remove_table.sql index d4f4aea2..d70dceda 100644 --- a/sql/londiste/functions/londiste.local_remove_table.sql +++ b/sql/londiste/functions/londiste.local_remove_table.sql @@ -20,6 +20,7 @@ declare fq_table_name text; logtrg_name text; tbl record; + b_queue_name bytea; begin fq_table_name := londiste.make_fqname(i_table_name); @@ -33,10 +34,22 @@ begin end if; if tbl.local then - -- drop trigger if exists - logtrg_name := i_queue_name || '_logtrigger'; - execute 'drop trigger if exists ' || quote_ident(logtrg_name) - || ' on ' || londiste.quote_fqname(fq_table_name); + -- cast to bytea + b_queue_name := replace(i_queue_name, E'\\', E'\\\\')::bytea; + + -- drop all replication triggers that target our queue. + -- by checking trigger func and queue name there is not + -- dependency on naming standard or side-storage. + for logtrg_name in + select tgname from pg_catalog.pg_trigger + where tgrelid = londiste.find_table_oid(fq_table_name) + and tgfoid in ('pgq.sqltriga'::regproc::oid, 'pgq.logutriga'::regproc::oid) + and substring(tgargs for (position(E'\\000'::bytea in tgargs) - 1)) = b_queue_name + loop + execute 'drop trigger ' || quote_ident(logtrg_name) + || ' on ' || londiste.quote_fqname(fq_table_name); + end loop; + -- reset data update londiste.table_info set local = false, diff --git a/sql/londiste/sql/londiste_provider.sql b/sql/londiste/sql/londiste_provider.sql index 196023ef..65307379 100644 --- a/sql/londiste/sql/londiste_provider.sql +++ b/sql/londiste/sql/londiste_provider.sql @@ -21,11 +21,13 @@ select * from pgq_node.create_node('aset', 'root', 'rnode', 'londiste_root', nul select * from londiste.local_add_table('aset', 'public.testdata_nopk'); select * from londiste.local_add_table('aset', 'public.testdata'); +select tgname from pg_trigger where tgrelid = 'public.testdata'::regclass; insert into testdata (txt) values ('test-data'); select * from londiste.get_table_list('aset'); select * from londiste.local_show_missing('aset'); select * from londiste.local_remove_table('aset', 'public.testdata'); select * from londiste.local_remove_table('aset', 'public.testdata'); +select tgname from pg_trigger where tgrelid = 'public.testdata'::regclass; select * from londiste.get_table_list('aset'); select ev_id, ev_type, ev_data, ev_extra1 from pgq.event_template; -- 2.39.5