17 #include "catalog/pg_type.h" 18 #include "executor/spi.h" 19 #include "access/xact.h" 40 int result = SPI_connect();
41 if (result == SPI_ERROR_CONNECT) {
44 result = SPI_connect();
49 if (result != SPI_OK_CONNECT) {
51 (errcode(ERRCODE_INTERNAL_ERROR),
53 errdetail(
"SPI_connect() failed, returning %d.", result)));
68 int spi_result = SPI_finish();
72 if (spi_result != SPI_OK_FINISH) {
74 (errcode(ERRCODE_INTERNAL_ERROR),
76 errdetail(
"SPI_finish() failed, returning %d.", spi_result)));
112 if (saved_plan && *saved_plan) {
113 /* A previously prepared plan is available, so use it */ 117 if (!(plan = SPI_prepare(qry, nargs, argtypes))) {
119 (errcode(ERRCODE_INTERNAL_ERROR),
120 errmsg(
"prepare_query fails"),
121 errdetail(
"SPI_prepare('%s') returns NULL " 127 /* We have somewhere to put the saved plan, so save it. */ 128 *saved_plan = SPI_saveplan(plan);
132 exec_result = SPI_execute_plan(plan, args, nulls, read_only, 0);
133 if (exec_result < 0) {
135 (errcode(ERRCODE_INTERNAL_ERROR),
136 errmsg(
"prepare_query fails"),
137 errdetail(
"SPI_execute_plan('%s') returns error %d",
179 SPITupleTable *tuptab;
181 prepare_query(qry, nargs, argtypes, args, nulls, read_only, saved_plan);
182 fetched = SPI_processed;
183 tuptab = SPI_tuptable;
185 for(row = 0; row < fetched; row++) {
187 /* Process a row using the processor function */ 188 cntinue = process_row(tuptab->vals[row],
228 read_only, saved_plan, process_row, fn_param);
244 bool is_null =
false;
245 bool col = DatumGetBool(SPI_getbinval(tuple, tupdesc, 1, &is_null));
246 *((
bool *) p_result) = col;
275 rows =
veil2_query(qry, nargs, argtypes, args,
false, saved_plan,
static bool fetch_one_bool(HeapTuple tuple, TupleDesc tupdesc, void *p_result)
static void prepare_query(const char *qry, int nargs, Oid *argtypes, Datum *args, const char *nulls, bool read_only, void **saved_plan)
Main header file for veil2.
void veil2_spi_finish(bool pushed, const char *msg)
int veil2_query_wn(const char *qry, int nargs, Oid *argtypes, Datum *args, const char *nulls, bool read_only, void **saved_plan, Fetch_fn process_row, void *fn_param)
bool() Fetch_fn(HeapTuple, TupleDesc, void *)
bool veil2_bool_from_query(const char *qry, int nargs, Oid *argtypes, Datum *args, void **saved_plan, bool *result)
int veil2_query(const char *qry, int nargs, Oid *argtypes, Datum *args, bool read_only, void **saved_plan, Fetch_fn process_row, void *fn_param)
void veil2_spi_connect(bool *p_pushed, const char *msg)