summaryrefslogtreecommitdiff
path: root/sql/pgq/triggers/common.h
blob: 0192c493c80252e17d91d0ebee4f13fef1cf5511 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
enum PgqFields {
	EV_TYPE = 0,
	EV_DATA,
	EV_EXTRA1,
	EV_EXTRA2,
	EV_EXTRA3,
	EV_EXTRA4,
	EV_WHEN,
	EV_NFIELDS
};

/*
 * Per-event temporary data.
 */
struct PgqTriggerEvent {
	char op_type;

	/* overridable fields */
	// fixme: check proper usage
	const char *table_name;
	const char *queue_name;
	const char *pkey_list;

	/* no cache for old-style args */
	const char *attkind;
	int attkind_len;

	/* cached per-table info */
	struct PgqTableInfo *info;

	/* cached per-trigger args */
	struct PgqTriggerInfo *tgargs;

	/* current event data */
	TriggerData *tgdata;

	/* result fields */
	StringInfo field[EV_NFIELDS];

	/* if 'when=' query fails */
	bool skip_event;
};
typedef struct PgqTriggerEvent PgqTriggerEvent;

/*
 * Per trigger cached info, stored under table cache,
 * so that invalidate can drop it.
 */
struct PgqTriggerInfo {
	struct PgqTriggerInfo *next;
	Oid tgoid;
	bool finalized;

	bool skip;
	bool backup;
	bool custom_fields;
	bool deny;

	const char *ignore_list;
	const char *pkey_list;

	struct QueryBuilder *query[EV_NFIELDS];
};

/*
 * Per-table cached info.
 *
 * Per-trigger info should be cached under tg_cache.
 */
struct PgqTableInfo {
	Oid reloid;		/* must be first, used by htab */
	int n_pkeys;		/* number of pkeys */
	const char *pkey_list;	/* pk column name list */
	int *pkey_attno;	/* pk column positions */
	char *table_name;	/* schema-quelified table name */
	int invalid;		/* set if the info was invalidated */

	struct PgqTriggerInfo *tg_cache;
};

/* common.c */
void pgq_prepare_event(struct PgqTriggerEvent *ev, TriggerData *tg, bool newstyle);
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, int i, int attkind_idx);
bool pgqtriga_is_pkey(PgqTriggerEvent *ev, int i, int attkind_idx);
void pgq_insert_tg_event(PgqTriggerEvent *ev);

bool pgq_is_logging_disabled(void);

/* makesql.c */
int pgqtriga_make_sql(PgqTriggerEvent *ev, StringInfo sql);

/* logutriga.c */
void pgq_urlenc_row(PgqTriggerEvent *ev, HeapTuple row, StringInfo buf);

#ifndef TRIGGER_FIRED_BY_TRUNCATE
#define TRIGGER_FIRED_BY_TRUNCATE(tg)	0
#endif