pgq/triggers: 'deny' argument to logutriga/sqltriga
authorMarko Kreen <markokr@gmail.com>
Wed, 1 Dec 2010 13:06:12 +0000 (15:06 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 1 Dec 2010 13:06:12 +0000 (15:06 +0200)
Needed for deny trigger on leafs.

sql/pgq/expected/logutriga.out
sql/pgq/sql/logutriga.sql
sql/pgq/triggers/common.c
sql/pgq/triggers/common.h

index 597960206482532d4f0ae0bd7bd06b664dd491dd..b3c1fd71f894bca7a428d1639bec55289b69a4e7 100644 (file)
@@ -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)
index 428ee871dedc97b960127246cf2d0d4c33a987ba..86104e963a7491e7ddad1122c3953b5fe37ffe49 100644 (file)
@@ -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;
+
index ccfa45e6e89b2e69cb18a2f575b9d9c55cccafb6..aaf2459cf5fa25a76b0b970de369d439cb07889e 100644 (file)
@@ -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
         */
index 78a4e7f65e29b6d00c437afbfdf96703b0b09cc1..310002ca96e5608eb991fe816dc375dd074eef13 100644 (file)
@@ -54,6 +54,7 @@ struct PgqTriggerInfo {
        bool skip;
        bool backup;
        bool custom_fields;
+       bool deny;
 
        const char *ignore_list;
        const char *pkey_list;