summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2007-09-17 15:09:48 +0000
committerMarko Kreen2007-09-17 15:09:48 +0000
commitb0973f513def9df121a7cff1e4adf6ad2cafb151 (patch)
treeeb2c3245b70c6a844ed9d35cc3c570bf98b9d926
parentf607d6611cb96fcd4b1f196c33dfb8d0e66bdad8 (diff)
add trigger funcs to upgrade
-rw-r--r--upgrade/final/v2.1.5_londiste.sql168
-rw-r--r--upgrade/src/v2.1.5_londiste.sql11
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