libpqtypes home page
PQputf(3) libpqtypes Manual PQputf(3)
NAME
PQputf, PQputvf - Packs a set of parameters in a PGparam for use with a
parameterized query.
SYNOPSIS
#include <libpqtypes.h>
int PQputf(PGparam *param, const char *spec, ...);
int PQputvf(PGparam *param, char *stmtBuf, size_t stmtBufLen,
const char *spec, va_list ap);
DESCRIPTION
The PQputf() and PQputvf() functions put one or more query parameters
into a PGparam using a printf style interface. Any number of parame-
ters can be put at the same time.
The spec argument is a data type specifier string indicating the param-
eters being put, such as "%int4 %polygon". spec cannot be NULL or an
empty string. The variable argument list must match the spec, either
"..." or ap. The number of arguments required for each data type is
dependant on the data type itself; built-in PostgreSQL types always
require a single argument.
The PQputvf() function can contruct a parameterized command string from
spec, as long as stmtBuf and stmtBufLen have been provided. If the
construction of stmtBuf is not desired, set it to NULL and set stmtBu-
fLen to 0. When a constructed statement is desired, the contents of
spec will be copied to stmtBuf and all data type specifiers, like
"%int4", will be replaced with $1, $2, etc... syntax. The result is a
parameterized statement in synch with param and ready to be executed.
For instance: if spec is "SELECT %int4 + %int4", the resulting stmtBuf
would be "SELECT $1 + $2".
RETURN VALUE
On success, a non-zero value is returned. On error, zero is returned
and PQgeterror(3) will contain an error message.
If any put operation fails, the param is reverted back to the number of
parameters it had prior to the function call; partial puts are not
allowed.
EXAMPLES
Using PQputf
The example uses PQputf() to put a couple parameters into a PGparam.
PGtext text = "foobar";
PGint8 i8 = PQT_INT64CONST(1099511627776);
PGparam *param = PQparamCreate(conn);
if(!PQputf(param, "%text %int8", text, i8))
fprintf(stderr, "*ERROR: %s\n", PQgeterror());
PQparamClear(param);
Using PQputvf
The example creates an application function named execf. execf is a
wrapper to PQputvf(), as well as PQparamExec(3). This is a very useful
function but was excluded from libpqtypes because there are many dif-
ferent ways of implementing it. For instance: how stmt buffer or
PGparam is managed, how errors are handled or thread-safety concerns.
In the end, the execf idea felt more like an application function
rather than a library one.
PGresult *
execf(PGconn *conn, const char *stmtSpec, ...)
{
va_list ap;
char stmt[32768];
PGparam *param;
PGresult *res = NULL;
/* create the temporary PGparam */
if(!(param = PQparamCreate(conn)))
return NULL; /* PQseterror already called */
/* put the params, create the stmt and exec it */
va_start(ap, stmtSpec);
if(PQputvf(param, stmt, sizeof(stmt), stmtSpec, ap))
res = PQparamExec(conn, param, stmt, 1); // resfmt is binary
va_end(ap);
/* param must be cleared */
PQparamClear(param);
return res;
}
/* Example: execf will put 2 ints and execute "SELECT $1 + $2" */
PGresult *res = execf(conn, "SELECT %int4 + %int4", 100, 67);
if(!res)
fprintf(stderr, "*ERROR: %s\n", PQgeterror());
AUTHOR
A contribution of eSilo, LLC. for the PostgreSQL Database Management
System. Written by Andrew Chernow and Merlin Moncure.
REPORTING BUGS
Report bugs to <libpqtypes@esilo.com>.
COPYRIGHT
Copyright (c) 2008 eSilo, LLC. All rights reserved.
This is free software; see the source for copying conditions. There is
NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
SEE ALSO
pqt-specs(3), PQparamCreate(3), PQgeterror(3), PQseterror(3)
libpqtypes 2008 PQputf(3)
libpqtypes home page