DragonFly On-Line Manual Pages
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 *format, ...);
int PQputvf(PGparam *param, char *stmtBuf, size_t stmtBufLen,
const char *format, 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
parameters can be put at the same time.
The format argument is a data type specifier string indicating the
parameters being put, such as "%int4 %polygon". format cannot be NULL
or an empty string. The variable argument list must match the format,
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 construct a parameterized command string
from format, as long as stmtBuf and stmtBufLen have been provided. If
the construction of stmtBuf is not desired, set it to NULL and set
stmtBufLen to 0. When a constructed statement is desired, the contents
of format 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). It is similar to
PQexecf(). The only difference is that the PQexecf implementation uses
a smaller stack buffer and allocates heap memory when needed.
PGresult *
execf(PGconn *conn, const char *format, ...)
{
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, format);
if(PQputvf(param, stmt, sizeof(stmt), format, 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) 2011 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 2011 PQputf(3)