static void fill_json_type(PgqTriggerEvent *ev, HeapTuple row, StringInfo ev_type) { appendStringInfo(ev_type, "{\"op\":\"%s\"", ev->op_type_str); if (ev->tgargs->pkey_list) { static const char pkey_tag[] = "\"pkey\":"; const char *cstart, *cpos; char *start, *pos, *tmp; char sep = '['; cstart = ev->info->json_info; cpos = strstr(cstart, "\"pkey\":"); appendBinaryStringInfo(ev_type, cstart, cpos - cstart + strlen(pkey_tag)); start = tmp = pstrdup(ev->tgargs->pkey_list); pos = strchr(start, ','); while (pos) { appendStringInfoChar(ev_type, sep); sep = ','; *pos = 0; pgq_encode_cstring(ev_type, start, TBUF_QUOTE_JSON); start = pos + 1; pos = strchr(start, ','); } appendStringInfoChar(ev_type, sep); pgq_encode_cstring(ev_type, start, TBUF_QUOTE_JSON); appendStringInfoChar(ev_type, ']'); pfree(tmp); } else { appendStringInfoString(ev_type, ev->info->json_info); } appendStringInfoChar(ev_type, '}'); }
static void append_normal_eq(StringInfo buf, const char *col_ident, const char *col_value) { pgq_encode_cstring(buf, col_ident, TBUF_QUOTE_IDENT); appendStringInfoChar(buf, '='); if (col_value != NULL) pgq_encode_cstring(buf, col_value, TBUF_QUOTE_LITERAL); else appendStringInfoString(buf, "NULL"); }
static void append_key_eq(StringInfo buf, const char *col_ident, const char *col_value) { if (col_value == NULL) elog(ERROR, "logtriga: Unexpected NULL key value"); pgq_encode_cstring(buf, col_ident, TBUF_QUOTE_IDENT); appendStringInfoChar(buf, '='); pgq_encode_cstring(buf, col_value, TBUF_QUOTE_LITERAL); }
void pgq_urlenc_row(PgqTriggerEvent *ev, HeapTuple row, StringInfo buf) { TriggerData *tg = ev->tgdata; TupleDesc tupdesc = tg->tg_relation->rd_att; bool first = true; int i; const char *col_ident, *col_value; int attkind_idx = -1; for (i = 0; i < tg->tg_relation->rd_att->natts; i++) { /* Skip dropped columns */ if (tupdesc->attrs[i]->attisdropped) continue; attkind_idx++; if (pgqtriga_skip_col(ev, i, attkind_idx)) continue; if (first) first = false; else appendStringInfoChar(buf, '&'); /* quote column name */ col_ident = SPI_fname(tupdesc, i + 1); pgq_encode_cstring(buf, col_ident, TBUF_QUOTE_URLENC); /* quote column value */ col_value = SPI_getvalue(row, tupdesc, i + 1); if (col_value != NULL) { appendStringInfoChar(buf, '='); pgq_encode_cstring(buf, col_value, TBUF_QUOTE_URLENC); } } }
static void pgq_jsonenc_row(PgqTriggerEvent *ev, HeapTuple row, StringInfo buf) { Oid col_type; Datum col_datum; bool isnull; TriggerData *tg = ev->tgdata; TupleDesc tupdesc = tg->tg_relation->rd_att; bool first = true; int i; const char *col_ident, *col_value; int attkind_idx = -1; if (ev->op_type == 'R') { appendStringInfoString(buf, "{}"); return; } appendStringInfoChar(buf, '{'); for (i = 0; i < tg->tg_relation->rd_att->natts; i++) { /* Skip dropped columns */ if (TupleDescAttr(tupdesc, i)->attisdropped) continue; attkind_idx++; if (pgqtriga_skip_col(ev, i, attkind_idx)) continue; if (first) first = false; else appendStringInfoChar(buf, ','); /* quote column name */ col_ident = SPI_fname(tupdesc, i + 1); pgq_encode_cstring(buf, col_ident, TBUF_QUOTE_JSON); appendStringInfoChar(buf, ':'); /* quote column value */ col_type = TupleDescAttr(tupdesc, i)->atttypid; col_datum = SPI_getbinval(row, tupdesc, i + 1, &isnull); col_value = NULL; if (isnull) { appendStringInfoString(buf, "null"); continue; } switch (col_type) { case BOOLOID: if (DatumGetBool(col_datum)) { appendStringInfoString(buf, "true"); } else { appendStringInfoString(buf, "false"); } break; case TIMESTAMPOID: timestamp_to_json(col_datum, buf); break; case TIMESTAMPTZOID: timestamptz_to_json(col_datum, buf); break; case DATEOID: date_to_json(col_datum, buf); break; case INT2OID: appendStringInfo(buf, "%d", (int)DatumGetInt16(col_datum)); break; case INT4OID: appendStringInfo(buf, "%d", (int)DatumGetInt32(col_datum)); break; case INT8OID: col_value = SPI_getvalue(row, tupdesc, i + 1); appendStringInfoString(buf, col_value); break; default: col_value = SPI_getvalue(row, tupdesc, i + 1); pgq_encode_cstring(buf, col_value, TBUF_QUOTE_JSON); break; } if (col_value) pfree((void*)col_value); } appendStringInfoChar(buf, '}'); }
static void process_insert(PgqTriggerEvent *ev, StringInfo sql) { TriggerData *tg = ev->tgdata; HeapTuple new_row = tg->tg_trigtuple; TupleDesc tupdesc = tg->tg_relation->rd_att; int i; int need_comma = false; int attkind_idx; /* * Specify all the columns */ appendStringInfoChar(sql, '('); attkind_idx = -1; for (i = 0; i < tupdesc->natts; i++) { char *col_ident; /* Skip dropped columns */ if (tupdesc->attrs[i]->attisdropped) continue; /* Check if allowed by colstring */ attkind_idx++; if (pgqtriga_skip_col(ev, i, attkind_idx)) continue; if (need_comma) appendStringInfoChar(sql, ','); else need_comma = true; /* quote column name */ col_ident = SPI_fname(tupdesc, i + 1); pgq_encode_cstring(sql, col_ident, TBUF_QUOTE_IDENT); } /* * Append the string ") values (" */ appendStringInfoString(sql, ") values ("); /* * Append the values */ need_comma = false; attkind_idx = -1; for (i = 0; i < tupdesc->natts; i++) { char *col_value; /* Skip dropped columns */ if (tupdesc->attrs[i]->attisdropped) continue; /* Check if allowed by colstring */ attkind_idx++; if (pgqtriga_skip_col(ev, i, attkind_idx)) continue; if (need_comma) appendStringInfoChar(sql, ','); else need_comma = true; /* quote column value */ col_value = SPI_getvalue(new_row, tupdesc, i + 1); if (col_value == NULL) appendStringInfoString(sql, "null"); else pgq_encode_cstring(sql, col_value, TBUF_QUOTE_LITERAL); } /* * Terminate and done */ appendStringInfoChar(sql, ')'); }