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)
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)
+
--- /dev/null
+
+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;
+
-- ----------------------------------------------------------------------
declare
fq_table_name text;
- logtrg_name text;
tbl record;
- b_queue_name bytea;
begin
fq_table_name := londiste.make_fqname(i_table_name);
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
--- /dev/null
+
+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;
+
\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
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;
\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
--- /dev/null
+
+create trigger table_info_trigger_sync after delete on londiste.table_info
+for each row execute procedure londiste.table_info_trigger();
+