diff options
author | Marko Kreen | 2007-09-17 15:09:48 +0000 |
---|---|---|
committer | Marko Kreen | 2007-09-17 15:09:48 +0000 |
commit | b0973f513def9df121a7cff1e4adf6ad2cafb151 (patch) | |
tree | eb2c3245b70c6a844ed9d35cc3c570bf98b9d926 | |
parent | f607d6611cb96fcd4b1f196c33dfb8d0e66bdad8 (diff) |
add trigger funcs to upgrade
-rw-r--r-- | upgrade/final/v2.1.5_londiste.sql | 168 | ||||
-rw-r--r-- | upgrade/src/v2.1.5_londiste.sql | 11 |
2 files changed, 173 insertions, 6 deletions
diff --git a/upgrade/final/v2.1.5_londiste.sql b/upgrade/final/v2.1.5_londiste.sql index 5cb78f6f..c37b4b52 100644 --- a/upgrade/final/v2.1.5_londiste.sql +++ b/upgrade/final/v2.1.5_londiste.sql @@ -10,6 +10,14 @@ create table londiste.subscriber_pending_fkeys( primary key (from_table, fkey_name) ); +create table londiste.subscriber_pending_triggers ( + table_name text not null, + trigger_name text not null, + trigger_def text not null, + + primary key (table_name, trigger_name) +); + drop function londiste.denytrigger(); @@ -24,7 +32,10 @@ begin for fkey in select n1.nspname || '.' || t1.relname as from_table, n2.nspname || '.' || t2.relname as to_table, - conname::text as fkey_name, pg_get_constraintdef(c.oid) as fkey_def + conname::text as fkey_name, + 'alter table only ' || quote_ident(n1.nspname) || '.' || quote_ident(t1.relname) + || ' add constraint ' || quote_ident(fkey.fkey_name) || ' ' || pg_get_constraintdef(c.oid) + as fkey_def from pg_constraint c, pg_namespace n1, pg_class t1, pg_namespace n2, pg_class t2 where c.contype = 'f' and (c.conrelid = tbl_oid or c.confrelid = tbl_oid) and t1.oid = c.conrelid and n1.oid = t1.relnamespace @@ -41,6 +52,27 @@ $$ language plpgsql strict stable; + +create or replace function londiste.find_table_triggers(i_table_name text) +returns setof londiste.subscriber_pending_triggers as $$ +declare + tg record; +begin + for tg in + select n.nspname || '.' || c.relname as table_name, t.tgname::text as name, pg_get_triggerdef(t.oid) as def + from pg_trigger t, pg_class c, pg_namespace n + where n.oid = c.relnamespace and c.oid = t.tgrelid + and t.tgrelid = londiste.find_table_oid(i_table_name) + and not t.tgisconstraint + loop + return next tg; + end loop; + + return; +end; +$$ language plpgsql strict stable; + + create or replace function londiste.find_column_types(tbl text) returns text as $$ declare @@ -124,12 +156,13 @@ begin where fkey_name = i_fkey_name and from_table = i_from_table; if not found then - return 1; + return 0; end if; insert into londiste.subscriber_pending_fkeys values (fkey.from_table, fkey.to_table, i_fkey_name, fkey.fkey_def); - execute 'alter table only ' || fkey.from_table || ' drop constraint ' || i_fkey_name || ';'; + execute 'alter table only ' || londiste.quote_fqname(fkey.from_table) + || ' drop constraint ' || quote_ident(i_fkey_name); return 1; end; @@ -146,13 +179,12 @@ begin where fkey_name = i_fkey_name and from_table = i_from_table; if not found then - return 1; + return 0; end if; delete from londiste.subscriber_pending_fkeys where fkey_name = fkey.fkey_name; - execute 'alter table only ' || fkey.from_table || ' add constraint ' - || fkey.fkey_name || ' ' || fkey.fkey_def || ';'; + execute fkey.fkey_def; return 1; end; @@ -160,6 +192,130 @@ $$ language plpgsql; +create or replace function londiste.subscriber_get_table_pending_triggers(i_table_name text) +returns setof londiste.subscriber_pending_triggers as $$ +declare + trigger record; +begin + for trigger in + select * + from londiste.subscriber_pending_triggers + where table_name = i_table_name + loop + return next trigger; + end loop; + + return; +end; +$$ language plpgsql strict stable; + + +create or replace function londiste.subscriber_drop_table_trigger(i_table_name text, i_trigger_name text) +returns integer as $$ +declare + trig_def record; +begin + select * into trig_def + from londiste.find_table_triggers(i_table_name) + where trigger_name = i_trigger_name; + + if FOUND is not true then + return 0; + end if; + + insert into londiste.subscriber_pending_triggers(table_name, trigger_name, trigger_def) + values (i_table_name, i_trigger_name, trig_def.trigger_def); + + execute 'drop trigger ' || i_trigger_name || ' on ' || i_table_name; + + return 1; +end; +$$ language plpgsql; + + +create or replace function londiste.subscriber_drop_all_table_triggers(i_table_name text) +returns integer as $$ +declare + trigger record; +begin + for trigger in + select trigger_name as name + from londiste.find_table_triggers(i_table_name) + loop + perform londiste.subscriber_drop_table_trigger(i_table_name, trigger.name); + end loop; + + return 1; +end; +$$ language plpgsql; + + +create or replace function londiste.subscriber_restore_table_trigger(i_table_name text, i_trigger_name text) +returns integer as $$ +declare + trig_def text; +begin + select trigger_def into trig_def + from londiste.subscriber_pending_triggers + where (table_name, trigger_name) = (i_table_name, i_trigger_name); + + if not found then + return 0; + end if; + + delete from londiste.subscriber_pending_triggers + where table_name = i_table_name and trigger_name = i_trigger_name; + + execute trig_def; + + return 1; +end; +$$ language plpgsql; + + +create or replace function londiste.subscriber_restore_all_table_triggers(i_table_name text) +returns integer as $$ +declare + trigger record; +begin + for trigger in + select trigger_name as name + from londiste.subscriber_get_table_pending_triggers(i_table_name) + loop + perform londiste.subscriber_restore_table_trigger(i_table_name, trigger.name); + end loop; + + return 1; +end; +$$ language plpgsql; + + + + + +create or replace function londiste.quote_fqname(i_name text) +returns text as $$ +declare + res text; + pos integer; + s text; + n text; +begin + pos := position('.' in i_name); + if pos > 0 then + s := substring(i_name for pos - 1); + n := substring(i_name from pos + 1); + else + s := 'public'; + n := i_name; + end if; + return quote_ident(s) || '.' || quote_ident(n); +end; +$$ language plpgsql strict immutable; + + + + create or replace function londiste.find_rel_oid(tbl text, kind text) returns oid as $$ declare diff --git a/upgrade/src/v2.1.5_londiste.sql b/upgrade/src/v2.1.5_londiste.sql index f949878d..5f641fa3 100644 --- a/upgrade/src/v2.1.5_londiste.sql +++ b/upgrade/src/v2.1.5_londiste.sql @@ -9,11 +9,22 @@ create table londiste.subscriber_pending_fkeys( primary key (from_table, fkey_name) ); +create table londiste.subscriber_pending_triggers ( + table_name text not null, + trigger_name text not null, + trigger_def text not null, + + primary key (table_name, trigger_name) +); + drop function londiste.denytrigger(); \i ../sql/londiste/functions/londiste.find_table_fkeys.sql +\i ../sql/londiste/functions/londiste.find_table_triggers.sql \i ../sql/londiste/functions/londiste.find_column_types.sql \i ../sql/londiste/functions/londiste.subscriber_fkeys_funcs.sql +\i ../sql/londiste/functions/londiste.subscriber_trigger_funcs.sql +\i ../sql/londiste/functions/londiste.quote_fqname.sql \i ../sql/londiste/functions/londiste.find_table_oid.sql \i ../sql/londiste/functions/londiste.get_last_tick.sql |