summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2010-12-01 13:06:12 +0000
committerMarko Kreen2010-12-01 13:06:12 +0000
commite4e81d0869eb7f91a04613b9ccc32cf93f91e492 (patch)
tree7533f31c43a66afc6cac8443df149127575d26f4
parent73b6c4c96798fe6b6c49b65c82f3e3fa396317b1 (diff)
pgq/triggers: 'deny' argument to logutriga/sqltriga
Needed for deny trigger on leafs.
-rw-r--r--sql/pgq/expected/logutriga.out14
-rw-r--r--sql/pgq/sql/logutriga.sql13
-rw-r--r--sql/pgq/triggers/common.c7
-rw-r--r--sql/pgq/triggers/common.h1
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;