londiste: trigger-cleanup trigger on londiste.table_info
authorMarko Kreen <markokr@gmail.com>
Wed, 13 Oct 2010 13:58:53 +0000 (16:58 +0300)
committerMarko Kreen <markokr@gmail.com>
Wed, 13 Oct 2010 13:58:53 +0000 (16:58 +0300)
sql/londiste/Makefile
sql/londiste/expected/londiste_provider.out
sql/londiste/functions/londiste.drop_table_triggers.sql [new file with mode: 0644]
sql/londiste/functions/londiste.local_remove_table.sql
sql/londiste/functions/londiste.table_info_trigger.sql [new file with mode: 0644]
sql/londiste/sql/londiste_install.sql
sql/londiste/sql/londiste_provider.sql
sql/londiste/structure/functions.sql
sql/londiste/structure/triggers.sql [new file with mode: 0644]

index 5295e10d4734b7c981215821283599396be25f95..6d6d0c03ceb70c76babdd0d60d520d8b974e9eaf 100644 (file)
@@ -1,7 +1,7 @@
 
 DATA_built = londiste.sql londiste.upgrade.sql
 
-SQLS = structure/tables.sql structure/grants.sql structure/functions.sql
+SQLS = structure/tables.sql structure/grants.sql structure/functions.sql structure/triggers.sql
 FUNCS = $(shell sed -e 's/^[^\\].*//' -e 's/\\i //' $(SQLS))
 SRCS = $(SQLS) $(FUNCS)
 
index 877618ddf4b8b70e879d094da58df3da8ebbd5c7..46eea29a62bd623171a7621fadbb25878796db58 100644 (file)
@@ -122,3 +122,16 @@ select ev_id, ev_type, ev_data, ev_extra1, ev_extra4 from pgq.event_template whe
      6 | R       |                              | public.trg_test | 
 (2 rows)
 
+select tgname from pg_trigger where tgrelid = 'public.trg_test'::regclass order by 1;
+         tgname          
+-------------------------
+ _londiste_aset
+ _londiste_aset_truncate
+(2 rows)
+
+delete from londiste.table_info where table_name = 'public.trg_test';
+select tgname from pg_trigger where tgrelid = 'public.trg_test'::regclass order by 1;
+ tgname 
+--------
+(0 rows)
+
diff --git a/sql/londiste/functions/londiste.drop_table_triggers.sql b/sql/londiste/functions/londiste.drop_table_triggers.sql
new file mode 100644 (file)
index 0000000..2ab0c9c
--- /dev/null
@@ -0,0 +1,39 @@
+
+create or replace function londiste.drop_table_triggers(
+    in i_queue_name text, in i_table_name text)
+returns void as $$
+-- ----------------------------------------------------------------------
+-- Function: londiste.drop_table_triggers(2)
+--
+--      Remove Londiste triggers from table.
+--
+-- Parameters:
+--      i_queue_name      - set name
+--      i_table_name      - table name
+--
+-- Returns:
+--      200 - OK
+--      404 - Table not found
+-- ----------------------------------------------------------------------
+declare
+    logtrg_name     text;
+    b_queue_name    bytea;
+begin
+    -- 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(i_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(i_table_name);
+    end loop;
+end;
+$$ language plpgsql strict;
+
index d70dceda7160ef94d2ff6a7503c5e3ac53fdd6a0..097e0b6f294247767c77612b105f6656563ef9d2 100644 (file)
@@ -18,9 +18,7 @@ as $$
 -- ----------------------------------------------------------------------
 declare
     fq_table_name   text;
-    logtrg_name     text;
     tbl             record;
-    b_queue_name    bytea;
 begin
     fq_table_name := londiste.make_fqname(i_table_name);
 
@@ -34,21 +32,7 @@ begin
     end if;
 
     if tbl.local then
-        -- 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;
+        perform londiste.drop_table_triggers(i_queue_name, fq_table_name);
 
         -- reset data
         update londiste.table_info
diff --git a/sql/londiste/functions/londiste.table_info_trigger.sql b/sql/londiste/functions/londiste.table_info_trigger.sql
new file mode 100644 (file)
index 0000000..1a22520
--- /dev/null
@@ -0,0 +1,17 @@
+
+create or replace function londiste.table_info_trigger()
+returns trigger as $$
+-- ----------------------------------------------------------------------
+-- Function: londiste.table_info_trigger(0)
+--
+--      Trigger on londiste.table_info.  Cleans triggers from tables
+--      when table is removed from londiste.table_info.
+-- ----------------------------------------------------------------------
+begin
+    if TG_OP = 'DELETE' then
+        perform londiste.drop_table_triggers(OLD.queue_name, OLD.table_name);
+    end if;
+    return null;
+end;
+$$ language plpgsql;
+
index e88c50acbbc6e384151ce30c2b8e4849997bf83c..3621a39320d45609213047faab4e1f73dd676fb2 100644 (file)
@@ -10,9 +10,7 @@ create language plpgsql;
 \i ../pgq/pgq.sql
 \i ../pgq_node/pgq_node.sql
 
--- install directly from source files
-\i structure/tables.sql
-\i structure/functions.sql
+\i londiste.sql
 
 \set ECHO all
 
index 63a62f847edf48a6f661d7b752bb98ff063c832b..2209f8b6f28fcc7c133c618f711849601d0e572a 100644 (file)
@@ -45,4 +45,7 @@ insert into trg_test values (1, 'data');
 truncate trg_test;
 select ev_id, ev_type, ev_data, ev_extra1, ev_extra4 from pgq.event_template where ev_extra1 = 'public.trg_test';
 
+select tgname from pg_trigger where tgrelid = 'public.trg_test'::regclass order by 1;
+delete from londiste.table_info where table_name = 'public.trg_test';
+select tgname from pg_trigger where tgrelid = 'public.trg_test'::regclass order by 1;
 
index 2914721e6a21504d88d86a6e589ea6b596b7404b..a8320f098a04d6ad7f891c072d3a668b784efe93 100644 (file)
@@ -38,4 +38,6 @@
 \i functions/londiste.quote_fqname.sql
 \i functions/londiste.make_fqname.sql
 \i functions/londiste.split_fqname.sql
+\i functions/londiste.table_info_trigger.sql
+\i functions/londiste.drop_table_triggers.sql
 
diff --git a/sql/londiste/structure/triggers.sql b/sql/londiste/structure/triggers.sql
new file mode 100644 (file)
index 0000000..ad75359
--- /dev/null
@@ -0,0 +1,4 @@
+
+create trigger table_info_trigger_sync after delete on londiste.table_info
+for each row execute procedure londiste.table_info_trigger();
+