diff options
author | Marko Kreen | 2009-10-14 13:30:18 +0000 |
---|---|---|
committer | Marko Kreen | 2009-10-14 13:30:18 +0000 |
commit | fc41ef5f83372e766ba31165d01d7ed2d74b034c (patch) | |
tree | 46a590bc1551ec4f4d446a7814aa2685d098b392 | |
parent | 2c0e16d5478effe8c84db9082847671309f96cdb (diff) |
sql/pgq/triggers: magic fields to set event fields directly.
pgq.sqltriga() / pgq.logutriga() now consider following fields magic:
_pgq_ev_type
_pgq_ev_data
_pgq_ev_extra1
_pgq_ev_extra2
_pgq_ev_extra3
_pgq_ev_extra4
If any of them is present in table, corresponding event field is set directly
to it's value, overriding value generated by trigger.
-rw-r--r-- | sql/pgq/expected/logutriga.out | 31 | ||||
-rw-r--r-- | sql/pgq/expected/sqltriga.out | 65 | ||||
-rw-r--r-- | sql/pgq/sql/logutriga.sql | 19 | ||||
-rw-r--r-- | sql/pgq/sql/sqltriga.sql | 19 | ||||
-rw-r--r-- | sql/pgq/triggers/common.c | 101 | ||||
-rw-r--r-- | sql/pgq/triggers/common.h | 9 | ||||
-rw-r--r-- | sql/pgq/triggers/logtriga.c | 2 | ||||
-rw-r--r-- | sql/pgq/triggers/logutriga.c | 2 | ||||
-rw-r--r-- | sql/pgq/triggers/sqltriga.c | 2 | ||||
-rw-r--r-- | sql/pgq/triggers/stringutil.c | 1 |
10 files changed, 204 insertions, 47 deletions
diff --git a/sql/pgq/expected/logutriga.out b/sql/pgq/expected/logutriga.out index 782c5965..62262718 100644 --- a/sql/pgq/expected/logutriga.out +++ b/sql/pgq/expected/logutriga.out @@ -16,17 +16,17 @@ create trigger utest AFTER insert or update or delete ON udata for each row execute procedure pgq.logutriga('udata_que'); insert into udata (txt) values ('text1'); NOTICE: insert_event(udata_que, I:id, id=1&txt=text1&bin, public.udata) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" insert into udata (bin) values (E'bi\tn\\000bin'); NOTICE: insert_event(udata_que, I:id, id=2&txt&bin=bi%5c011n%5c000bin, public.udata) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" -- test missing pkey create table nopkey2 (dat text); create trigger nopkey_triga2 after insert or update or delete on nopkey2 for each row execute procedure pgq.logutriga('que3'); insert into nopkey2 values ('foo'); NOTICE: insert_event(que3, I:, dat=foo, public.nopkey2) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update nopkey2 set dat = 'bat'; ERROR: Update/Delete on table without pkey delete from nopkey2; @@ -38,8 +38,31 @@ create trigger ucustom_triga after insert or update or delete on ucustom_pkey for each row execute procedure pgq.logutriga('que3'); insert into ucustom_pkey values ('foo', '2'); NOTICE: insert_event(que3, I:, dat1=foo&dat2=2&dat3, public.ucustom_pkey) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update ucustom_pkey set dat3 = 'bat'; ERROR: Update/Delete on table without pkey delete from ucustom_pkey; ERROR: Update/Delete on table without pkey +-- test custom fields +create table custom_fields2 ( + dat1 text not null primary key, + dat2 int2 not null, + dat3 text, + _pgq_ev_type text default 'my_type', + _pgq_ev_extra1 text default 'e1', + _pgq_ev_extra2 text default 'e2', + _pgq_ev_extra3 text default 'e3', + _pgq_ev_extra4 text default 'e4' +); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "custom_fields2_pkey" for table "custom_fields2" +create trigger customf2_triga after insert or update or delete on custom_fields2 +for each row execute procedure pgq.logutriga('que3'); +insert into custom_fields2 values ('foo', '2'); +NOTICE: insert_event(que3, my_type, dat1=foo&dat2=2&dat3, e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +update custom_fields2 set dat3 = 'bat'; +NOTICE: insert_event(que3, my_type, dat1=foo&dat2=2&dat3=bat, e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +delete from custom_fields2; +NOTICE: insert_event(que3, my_type, dat1=foo&dat2=2&dat3=bat, e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" diff --git a/sql/pgq/expected/sqltriga.out b/sql/pgq/expected/sqltriga.out index 3eb91ef3..6f225867 100644 --- a/sql/pgq/expected/sqltriga.out +++ b/sql/pgq/expected/sqltriga.out @@ -9,40 +9,40 @@ for each row execute procedure pgq.sqltriga('que'); -- simple test insert into rtest values (1, 'value1'); NOTICE: insert_event(que, I, (id,dat) values ('1','value1'), public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat = 'value2'; NOTICE: insert_event(que, U, dat='value2' where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from rtest; NOTICE: insert_event(que, D, id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" -- test new fields alter table rtest add column dat2 text; insert into rtest values (1, 'value1'); NOTICE: insert_event(que, I, (id,dat,dat2) values ('1','value1',null), public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat = 'value2'; NOTICE: insert_event(que, U, dat='value2' where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from rtest; NOTICE: insert_event(que, D, id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" -- test field ignore drop trigger rtest_triga on rtest; create trigger rtest_triga after insert or update or delete on rtest for each row execute procedure pgq.sqltriga('que2', 'ignore=dat2'); insert into rtest values (1, '666', 'newdat'); NOTICE: insert_event(que2, I, (id,dat) values ('1','666'), public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat = 5, dat2 = 'newdat2'; NOTICE: insert_event(que2, U, dat='5' where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat = 6; NOTICE: insert_event(que2, U, dat='6' where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from rtest; NOTICE: insert_event(que2, D, id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" -- test hashed pkey -- drop trigger rtest_triga on rtest; -- create trigger rtest_triga after insert or update or delete on rtest @@ -57,32 +57,32 @@ create trigger rtest_triga after insert or update or delete on rtest for each row execute procedure pgq.sqltriga('que3'); insert into rtest values (1, 0, 'non-null'); NOTICE: insert_event(que3, I, (id,dat,dat2) values ('1','0','non-null'), public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" insert into rtest values (2, 0, NULL); NOTICE: insert_event(que3, I, (id,dat,dat2) values ('2','0',null), public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat2 = 'non-null2' where id=1; NOTICE: insert_event(que3, U, dat2='non-null2' where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat2 = NULL where id=1; NOTICE: insert_event(que3, U, dat2=NULL where id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update rtest set dat2 = 'new-nonnull' where id=2; NOTICE: insert_event(que3, U, dat2='new-nonnull' where id='2', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from rtest where id=1; NOTICE: insert_event(que3, D, id='1', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from rtest where id=2; NOTICE: insert_event(que3, D, id='2', public.rtest) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" -- test missing pkey create table nopkey (dat text); create trigger nopkey_triga after insert or update or delete on nopkey for each row execute procedure pgq.sqltriga('que3'); insert into nopkey values ('foo'); NOTICE: insert_event(que3, I, (dat) values ('foo'), public.nopkey) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update nopkey set dat = 'bat'; ERROR: Update/Delete on table without pkey delete from nopkey; @@ -93,10 +93,33 @@ create trigger custom_triga after insert or update or delete on custom_pkey for each row execute procedure pgq.sqltriga('que3', 'pkey=dat1,dat2'); insert into custom_pkey values ('foo', '2'); NOTICE: insert_event(que3, I, (dat1,dat2,dat3) values ('foo','2',null), public.custom_pkey) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" update custom_pkey set dat3 = 'bat'; NOTICE: insert_event(que3, U, dat3='bat' where dat1='foo' and dat2='2', public.custom_pkey) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" delete from custom_pkey; NOTICE: insert_event(que3, D, dat1='foo' and dat2='2', public.custom_pkey) -CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, null, null)" +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +-- test custom fields +create table custom_fields ( + dat1 text not null primary key, + dat2 int2 not null, + dat3 text, + _pgq_ev_type text default 'my_type', + _pgq_ev_extra1 text default 'e1', + _pgq_ev_extra2 text default 'e2', + _pgq_ev_extra3 text default 'e3', + _pgq_ev_extra4 text default 'e4' +); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "custom_fields_pkey" for table "custom_fields" +create trigger customf_triga after insert or update or delete on custom_fields +for each row execute procedure pgq.sqltriga('que3'); +insert into custom_fields values ('foo', '2'); +NOTICE: insert_event(que3, my_type, (dat1,dat2,dat3) values ('foo','2',null), e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +update custom_fields set dat3 = 'bat'; +NOTICE: insert_event(que3, my_type, dat3='bat' where dat1='foo', e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" +delete from custom_fields; +NOTICE: insert_event(que3, my_type, dat1='foo', e1) +CONTEXT: SQL statement "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)" diff --git a/sql/pgq/sql/logutriga.sql b/sql/pgq/sql/logutriga.sql index 8ba31621..ce5e42c6 100644 --- a/sql/pgq/sql/logutriga.sql +++ b/sql/pgq/sql/logutriga.sql @@ -38,3 +38,22 @@ insert into ucustom_pkey values ('foo', '2'); update ucustom_pkey set dat3 = 'bat'; delete from ucustom_pkey; +-- test custom fields +create table custom_fields2 ( + dat1 text not null primary key, + dat2 int2 not null, + dat3 text, + _pgq_ev_type text default 'my_type', + _pgq_ev_extra1 text default 'e1', + _pgq_ev_extra2 text default 'e2', + _pgq_ev_extra3 text default 'e3', + _pgq_ev_extra4 text default 'e4' +); +create trigger customf2_triga after insert or update or delete on custom_fields2 +for each row execute procedure pgq.logutriga('que3'); + +insert into custom_fields2 values ('foo', '2'); +update custom_fields2 set dat3 = 'bat'; +delete from custom_fields2; + + diff --git a/sql/pgq/sql/sqltriga.sql b/sql/pgq/sql/sqltriga.sql index 9ac38a4e..f23adce4 100644 --- a/sql/pgq/sql/sqltriga.sql +++ b/sql/pgq/sql/sqltriga.sql @@ -74,3 +74,22 @@ insert into custom_pkey values ('foo', '2'); update custom_pkey set dat3 = 'bat'; delete from custom_pkey; +-- test custom fields +create table custom_fields ( + dat1 text not null primary key, + dat2 int2 not null, + dat3 text, + _pgq_ev_type text default 'my_type', + _pgq_ev_extra1 text default 'e1', + _pgq_ev_extra2 text default 'e2', + _pgq_ev_extra3 text default 'e3', + _pgq_ev_extra4 text default 'e4' +); +create trigger customf_triga after insert or update or delete on custom_fields +for each row execute procedure pgq.sqltriga('que3'); + +insert into custom_fields values ('foo', '2'); +update custom_fields set dat3 = 'bat'; +delete from custom_fields; + + diff --git a/sql/pgq/triggers/common.c b/sql/pgq/triggers/common.c index 0cc2bb49..20e47395 100644 --- a/sql/pgq/triggers/common.c +++ b/sql/pgq/triggers/common.c @@ -39,6 +39,9 @@ PG_MODULE_MAGIC; #endif +/* memcmp is ok on NameData fields */ +#define is_magic_field(s) (memcmp(s, "_pgq_ev_", 8) == 0) + /* * primary key info */ @@ -49,7 +52,8 @@ static HTAB *tbl_cache_map; static const char pkey_sql[] = "SELECT k.attnum, k.attname FROM pg_index i, pg_attribute k" " WHERE i.indrelid = $1 AND k.attrelid = i.indexrelid" - " AND i.indisprimary AND k.attnum > 0 AND NOT k.attisdropped" " ORDER BY k.attnum"; + " AND i.indisprimary AND k.attnum > 0 AND NOT k.attisdropped" + " ORDER BY k.attnum"; static void *pkey_plan; static void relcache_reset_cb(Datum arg, Oid relid); @@ -59,19 +63,20 @@ static void relcache_reset_cb(Datum arg, Oid relid); * * does not support NULL arguments. */ -void pgq_simple_insert(const char *queue_name, Datum ev_type, Datum ev_data, Datum ev_extra1, Datum ev_extra2) +void pgq_simple_insert(const char *queue_name, Datum ev_type, Datum ev_data, + Datum ev_extra1, Datum ev_extra2, Datum ev_extra3, Datum ev_extra4) { - Datum values[5]; - char nulls[5]; + Datum values[7]; + char nulls[7]; static void *plan = NULL; int res; if (!plan) { const char *sql; - Oid types[5] = { TEXTOID, TEXTOID, TEXTOID, TEXTOID, TEXTOID }; + Oid types[7] = { TEXTOID, TEXTOID, TEXTOID, TEXTOID, TEXTOID, TEXTOID, TEXTOID }; - sql = "select pgq.insert_event($1, $2, $3, $4, $5, null, null)"; - plan = SPI_saveplan(SPI_prepare(sql, 5, types)); + sql = "select pgq.insert_event($1, $2, $3, $4, $5, $6, $7)"; + plan = SPI_saveplan(SPI_prepare(sql, 7, types)); if (plan == NULL) elog(ERROR, "logtriga: SPI_prepare() failed"); } @@ -80,23 +85,77 @@ void pgq_simple_insert(const char *queue_name, Datum ev_type, Datum ev_data, Dat values[2] = ev_data; values[3] = ev_extra1; values[4] = ev_extra2; + values[5] = ev_extra3; + values[6] = ev_extra4; nulls[0] = ' '; - nulls[1] = ' '; - nulls[2] = ' '; - nulls[3] = ' '; + nulls[1] = ev_type ? ' ' : 'n'; + nulls[2] = ev_data ? ' ' : 'n'; + nulls[3] = ev_extra1 ? ' ' : 'n'; nulls[4] = ev_extra2 ? ' ' : 'n'; + nulls[5] = ev_extra3 ? ' ' : 'n'; + nulls[6] = ev_extra4 ? ' ' : 'n'; res = SPI_execute_plan(plan, values, nulls, false, 0); if (res != SPI_OK_SELECT) elog(ERROR, "call of pgq.insert_event failed"); } -void pgq_insert_tg_event(PgqTriggerEvent *ev) +static void fill_magic_columns(PgqTriggerEvent *ev, TriggerData *tg) +{ + int i; + char *col_name, *col_value; + StringInfo *dst = NULL; + TupleDesc tupdesc = tg->tg_relation->rd_att; + HeapTuple row; + + if (TRIGGER_FIRED_BY_UPDATE(tg->tg_event)) + row = tg->tg_newtuple; + else + row = tg->tg_trigtuple; + + for (i = 0; i < tupdesc->natts; i++) { + /* Skip dropped columns */ + if (tupdesc->attrs[i]->attisdropped) + continue; + col_name = NameStr(tupdesc->attrs[i]->attname); + if (!is_magic_field(col_name)) + continue; + if (strcmp(col_name, "_pgq_ev_type") == 0) + dst = &ev->ev_type; + else if (strcmp(col_name, "_pgq_ev_data") == 0) + dst = &ev->ev_data; + else if (strcmp(col_name, "_pgq_ev_extra1") == 0) + dst = &ev->ev_extra1; + else if (strcmp(col_name, "_pgq_ev_extra2") == 0) + dst = &ev->ev_extra2; + else if (strcmp(col_name, "_pgq_ev_extra3") == 0) + dst = &ev->ev_extra3; + else if (strcmp(col_name, "_pgq_ev_extra4") == 0) + dst = &ev->ev_extra4; + else + elog(ERROR, "Unknown magic column: %s", col_name); + + col_value = SPI_getvalue(row, tupdesc, i + 1); + if (col_value != NULL) { + *dst = pgq_init_varbuf(); + appendStringInfoString(*dst, col_value); + } else { + *dst = NULL; + } + } +} + +void pgq_insert_tg_event(PgqTriggerEvent *ev, TriggerData *tg) { + if (ev->custom_fields) + fill_magic_columns(ev, tg); + pgq_simple_insert(ev->queue_name, pgq_finish_varbuf(ev->ev_type), pgq_finish_varbuf(ev->ev_data), pgq_finish_varbuf(ev->ev_extra1), - ev->ev_extra2 ? pgq_finish_varbuf(ev->ev_extra2) : (Datum)0); + pgq_finish_varbuf(ev->ev_extra2), + pgq_finish_varbuf(ev->ev_extra3), + pgq_finish_varbuf(ev->ev_extra4)); } char *pgq_find_table_name(Relation rel) @@ -415,15 +474,21 @@ bool pgqtriga_skip_col(PgqTriggerEvent *ev, TriggerData *tg, int i, int attkind_ TupleDesc tupdesc; const char *name; + tupdesc = tg->tg_relation->rd_att; + if (tupdesc->attrs[i]->attisdropped) + return true; + name = NameStr(tupdesc->attrs[i]->attname); + + if (is_magic_field(name)) { + ev->custom_fields = 1; + return true; + } + if (ev->attkind) { if (attkind_idx >= ev->attkind_len) return true; return ev->attkind[attkind_idx] == 'i'; } else if (ev->ignore_list) { - tupdesc = tg->tg_relation->rd_att; - if (tupdesc->attrs[i]->attisdropped) - return true; - name = NameStr(tupdesc->attrs[i]->attname); return pgq_strlist_contains(ev->ignore_list, name); } return false; @@ -446,6 +511,10 @@ bool pgqtriga_is_pkey(PgqTriggerEvent *ev, TriggerData *tg, int i, int attkind_i if (tupdesc->attrs[i]->attisdropped) return false; name = NameStr(tupdesc->attrs[i]->attname); + if (is_magic_field(name)) { + ev->custom_fields = 1; + return false; + } return pgq_strlist_contains(ev->pkey_list, name); } return false; diff --git a/sql/pgq/triggers/common.h b/sql/pgq/triggers/common.h index 957a02df..0adaa7b1 100644 --- a/sql/pgq/triggers/common.h +++ b/sql/pgq/triggers/common.h @@ -14,6 +14,7 @@ struct PgqTriggerEvent { char op_type; bool skip; bool backup; + bool custom_fields; struct PgqTableInfo *info; @@ -21,6 +22,8 @@ struct PgqTriggerEvent { StringInfo ev_data; StringInfo ev_extra1; StringInfo ev_extra2; + StringInfo ev_extra3; + StringInfo ev_extra4; }; typedef struct PgqTriggerEvent PgqTriggerEvent; @@ -42,11 +45,11 @@ struct PgqTableInfo { struct PgqTableInfo *pgq_find_table_info(Relation rel); void pgq_prepare_event(struct PgqTriggerEvent *ev, TriggerData *tg, bool newstyle); char *pgq_find_table_name(Relation rel); -void pgq_simple_insert(const char *queue_name, Datum ev_type, Datum ev_data, Datum ev_extra1, - Datum ev_extra2); +void pgq_simple_insert(const char *queue_name, Datum ev_type, Datum ev_data, + Datum ev_extra1, Datum ev_extra2, Datum ev_extra3, Datum ev_extra4); bool pgqtriga_skip_col(PgqTriggerEvent *ev, TriggerData *tg, int i, int attkind_idx); bool pgqtriga_is_pkey(PgqTriggerEvent *ev, TriggerData *tg, int i, int attkind_idx); -void pgq_insert_tg_event(PgqTriggerEvent *ev); +void pgq_insert_tg_event(PgqTriggerEvent *ev, TriggerData *tg); bool pgq_is_logging_disabled(void); diff --git a/sql/pgq/triggers/logtriga.c b/sql/pgq/triggers/logtriga.c index bc0a40bf..0a474198 100644 --- a/sql/pgq/triggers/logtriga.c +++ b/sql/pgq/triggers/logtriga.c @@ -73,7 +73,7 @@ Datum pgq_logtriga(PG_FUNCTION_ARGS) * create sql and insert if interesting */ if (pgqtriga_make_sql(&ev, tg, ev.ev_data)) - pgq_insert_tg_event(&ev); + pgq_insert_tg_event(&ev, tg); if (SPI_finish() < 0) elog(ERROR, "SPI_finish failed"); diff --git a/sql/pgq/triggers/logutriga.c b/sql/pgq/triggers/logutriga.c index f6f7ff17..59a0cf04 100644 --- a/sql/pgq/triggers/logutriga.c +++ b/sql/pgq/triggers/logutriga.c @@ -115,7 +115,7 @@ Datum pgq_logutriga(PG_FUNCTION_ARGS) /* * Construct the parameter array and insert the log row. */ - pgq_insert_tg_event(&ev); + pgq_insert_tg_event(&ev, tg); if (SPI_finish() < 0) elog(ERROR, "SPI_finish failed"); diff --git a/sql/pgq/triggers/sqltriga.c b/sql/pgq/triggers/sqltriga.c index d06917ee..e75bd511 100644 --- a/sql/pgq/triggers/sqltriga.c +++ b/sql/pgq/triggers/sqltriga.c @@ -68,7 +68,7 @@ Datum pgq_sqltriga(PG_FUNCTION_ARGS) * create sql and insert if interesting */ if (pgqtriga_make_sql(&ev, tg, ev.ev_data)) - pgq_insert_tg_event(&ev); + pgq_insert_tg_event(&ev, tg); if (SPI_finish() < 0) elog(ERROR, "SPI_finish failed"); diff --git a/sql/pgq/triggers/stringutil.c b/sql/pgq/triggers/stringutil.c index 230567bc..b379e788 100644 --- a/sql/pgq/triggers/stringutil.c +++ b/sql/pgq/triggers/stringutil.c @@ -39,6 +39,7 @@ StringInfo pgq_init_varbuf(void) Datum pgq_finish_varbuf(StringInfo buf) { + if (!buf) return (Datum)0; SET_VARSIZE(buf->data, buf->len); return PointerGetDatum(buf->data); } |