/*------------------------------------------------------------------------- * * pgut-spi.c * * Copyright (c) 2009, NIPPON TELEGRAPH AND TELEPHONE CORPORATION * *------------------------------------------------------------------------- */ #include "postgres.h" #include "pgut-spi.h" static void termStringInfo(StringInfo str) { if (str && str->data) pfree(str->data); } /* simple execute */ void execute(int expected, const char *sql) { int ret = SPI_execute(sql, false, 0); if ((expected > 0 && ret != expected) || ret < 0) elog(ERROR, "query failed: (sql=%s, code=%d, expected=%d)", sql, ret, expected); } /* execute prepared plan */ void execute_plan(int expected, SPIPlanPtr plan, Datum *values, const char *nulls) { int ret = SPI_execute_plan(plan, values, nulls, false, 0); if ((expected > 0 && ret != expected) || ret < 0) elog(ERROR, "query failed: (code=%d, expected=%d)", ret, expected); } /* execute sql with format */ void execute_with_format(int expected, const char *format, ...) { va_list ap; StringInfoData sql; int ret; initStringInfo(&sql); va_start(ap, format); appendStringInfoVA(&sql, format, ap); va_end(ap); ret = SPI_exec(sql.data, 0); if ((expected > 0 && ret != expected) || ret < 0) elog(ERROR, "query failed: (sql=%s, code=%d, expected=%d)", sql.data, ret, expected); termStringInfo(&sql); } void execute_with_args(int expected, const char *src, int nargs, Oid argtypes[], Datum values[], const bool nulls[]) { int ret; int i; char c_nulls[FUNC_MAX_ARGS]; for (i = 0; i < nargs; i++) c_nulls[i] = (nulls[i] ? 'n' : ' '); ret = SPI_execute_with_args(src, nargs, argtypes, values, c_nulls, false, 0); if ((expected > 0 && ret != expected) || ret < 0) elog(ERROR, "query failed: (sql=%s, code=%d, expected=%d)", src, ret, expected); } void execute_with_format_args(int expected, const char *format, int nargs, Oid argtypes[], Datum values[], const bool nulls[], ...) { va_list ap; StringInfoData sql; initStringInfo(&sql); va_start(ap, nulls); appendStringInfoVA(&sql, format, ap); va_end(ap); execute_with_args(expected, sql.data, nargs, argtypes, values, nulls); termStringInfo(&sql); } #if PG_VERSION_NUM < 80400 int SPI_execute_with_args(const char *src, int nargs, Oid *argtypes, Datum *values, const char *nulls, bool read_only, long tcount) { SPIPlanPtr plan; int ret; plan = SPI_prepare(src, nargs, argtypes); if (plan == NULL) return SPI_result; ret = SPI_execute_plan(plan, values, nulls, read_only, tcount); SPI_freeplan(plan); return ret; } #endif