diff options
author | Marko Kreen | 2010-12-01 13:06:12 +0000 |
---|---|---|
committer | Marko Kreen | 2010-12-01 13:06:12 +0000 |
commit | e4e81d0869eb7f91a04613b9ccc32cf93f91e492 (patch) | |
tree | 7533f31c43a66afc6cac8443df149127575d26f4 | |
parent | 73b6c4c96798fe6b6c49b65c82f3e3fa396317b1 (diff) |
pgq/triggers: 'deny' argument to logutriga/sqltriga
Needed for deny trigger on leafs.
-rw-r--r-- | sql/pgq/expected/logutriga.out | 14 | ||||
-rw-r--r-- | sql/pgq/sql/logutriga.sql | 13 | ||||
-rw-r--r-- | sql/pgq/triggers/common.c | 7 | ||||
-rw-r--r-- | sql/pgq/triggers/common.h | 1 |
4 files changed, 35 insertions, 0 deletions
diff --git a/sql/pgq/expected/logutriga.out b/sql/pgq/expected/logutriga.out index 59796020..b3c1fd71 100644 --- a/sql/pgq/expected/logutriga.out +++ b/sql/pgq/expected/logutriga.out @@ -152,3 +152,17 @@ for each statement execute procedure pgq.logutriga('que3'); truncate when_test; NOTICE: insert_event(que3, R, , public.when_test) CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +-- test deny +create table deny_test ( + dat1 text not null primary key, + dat2 text +); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "deny_test_pkey" for table "deny_test" +create trigger deny_triga after insert or update or delete on deny_test +for each row execute procedure pgq.logutriga('noqueue', 'deny'); +create trigger deny_triga2 after truncate on deny_test +for each statement execute procedure pgq.logutriga('noqueue', 'deny'); +insert into deny_test values ('1', '2'); +ERROR: Table 'public.deny_test' to queue 'noqueue': change not allowed (I) +truncate deny_test; +ERROR: Table 'public.deny_test' to queue 'noqueue': change not allowed (R) diff --git a/sql/pgq/sql/logutriga.sql b/sql/pgq/sql/logutriga.sql index 428ee871..86104e96 100644 --- a/sql/pgq/sql/logutriga.sql +++ b/sql/pgq/sql/logutriga.sql @@ -113,3 +113,16 @@ select * from when_test; create trigger trunc_triga after truncate on when_test for each statement execute procedure pgq.logutriga('que3'); truncate when_test; + +-- test deny +create table deny_test ( + dat1 text not null primary key, + dat2 text +); +create trigger deny_triga after insert or update or delete on deny_test +for each row execute procedure pgq.logutriga('noqueue', 'deny'); +create trigger deny_triga2 after truncate on deny_test +for each statement execute procedure pgq.logutriga('noqueue', 'deny'); +insert into deny_test values ('1', '2'); +truncate deny_test; + diff --git a/sql/pgq/triggers/common.c b/sql/pgq/triggers/common.c index ccfa45e6..aaf2459c 100644 --- a/sql/pgq/triggers/common.c +++ b/sql/pgq/triggers/common.c @@ -407,6 +407,8 @@ static void parse_newstyle_args(PgqTriggerEvent *ev, TriggerData *tg) ev->tgargs->pkey_list = MemoryContextStrdup(tbl_cache_ctx, arg + 5); else if (strcmp(arg, "backup") == 0) ev->tgargs->backup = true; + else if (strcmp(arg, "deny") == 0) + ev->tgargs->deny = true; else if (strncmp(arg, "ev_extra4=", 10) == 0) make_query(ev, EV_EXTRA4, arg + 10); else if (strncmp(arg, "ev_extra3=", 10) == 0) @@ -539,6 +541,11 @@ void pgq_prepare_event(struct PgqTriggerEvent *ev, TriggerData *tg, bool newstyl /* dont care ??? */ ; } + if (ev->tgargs->deny) { + elog(ERROR, "Table '%s' to queue '%s': change not allowed (%c)", + ev->table_name, ev->queue_name, ev->op_type); + } + /* * init data */ diff --git a/sql/pgq/triggers/common.h b/sql/pgq/triggers/common.h index 78a4e7f6..310002ca 100644 --- a/sql/pgq/triggers/common.h +++ b/sql/pgq/triggers/common.h @@ -54,6 +54,7 @@ struct PgqTriggerInfo { bool skip; bool backup; bool custom_fields; + bool deny; const char *ignore_list; const char *pkey_list; |