pg_repack/lib/pgut/pgut-spi.c
2009-07-02 09:55:57 +00:00

110 lines
2.5 KiB
C
Executable File

/*-------------------------------------------------------------------------
*
* 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