mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Improve testlibpq3.c's example of PQexecParams() usage to include sending
a parameter in binary format. Also, add a TIP explaining how to use casts in the query text to avoid needing to specify parameter types by OID. Also fix bogus spacing --- apparently somebody expanded the tabs in the example programs to 8 spaces instead of 4 when transposing them into SGML.
This commit is contained in:
@ -17,6 +17,10 @@
|
||||
* t = (11 bytes) 'joe's place'
|
||||
* b = (5 bytes) \000\001\002\003\004
|
||||
*
|
||||
* tuple 0: got
|
||||
* i = (4 bytes) 2
|
||||
* t = (8 bytes) 'ho there'
|
||||
* b = (5 bytes) \004\003\002\001\000
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -36,67 +40,20 @@ exit_nicely(PGconn *conn)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
/*
|
||||
* This function prints a query result that is a binary-format fetch from
|
||||
* a table defined as in the comment above. We split it out because the
|
||||
* main() function uses it twice.
|
||||
*/
|
||||
static void
|
||||
show_binary_results(PGresult *res)
|
||||
{
|
||||
const char *conninfo;
|
||||
PGconn *conn;
|
||||
PGresult *res;
|
||||
const char *paramValues[1];
|
||||
int i,
|
||||
j;
|
||||
int i_fnum,
|
||||
t_fnum,
|
||||
b_fnum;
|
||||
|
||||
/*
|
||||
* If the user supplies a parameter on the command line, use it as the
|
||||
* conninfo string; otherwise default to setting dbname=postgres and using
|
||||
* environment variables or defaults for all other connection parameters.
|
||||
*/
|
||||
if (argc > 1)
|
||||
conninfo = argv[1];
|
||||
else
|
||||
conninfo = "dbname = postgres";
|
||||
|
||||
/* Make a connection to the database */
|
||||
conn = PQconnectdb(conninfo);
|
||||
|
||||
/* Check to see that the backend connection was successfully made */
|
||||
if (PQstatus(conn) != CONNECTION_OK)
|
||||
{
|
||||
fprintf(stderr, "Connection to database failed: %s",
|
||||
PQerrorMessage(conn));
|
||||
exit_nicely(conn);
|
||||
}
|
||||
|
||||
/*
|
||||
* The point of this program is to illustrate use of PQexecParams() with
|
||||
* out-of-line parameters, as well as binary transmission of results. By
|
||||
* using out-of-line parameters we can avoid a lot of tedious mucking
|
||||
* about with quoting and escaping. Notice how we don't have to do
|
||||
* anything special with the quote mark in the parameter value.
|
||||
*/
|
||||
|
||||
/* Here is our out-of-line parameter value */
|
||||
paramValues[0] = "joe's place";
|
||||
|
||||
res = PQexecParams(conn,
|
||||
"SELECT * FROM test1 WHERE t = $1",
|
||||
1, /* one param */
|
||||
NULL, /* let the backend deduce param type */
|
||||
paramValues,
|
||||
NULL, /* don't need param lengths since text */
|
||||
NULL, /* default to all text params */
|
||||
1); /* ask for binary results */
|
||||
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||
{
|
||||
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
|
||||
PQclear(res);
|
||||
exit_nicely(conn);
|
||||
}
|
||||
|
||||
/* Use PQfnumber to avoid assumptions about field order in result */
|
||||
i_fnum = PQfnumber(res, "i");
|
||||
t_fnum = PQfnumber(res, "t");
|
||||
@ -141,6 +98,109 @@ main(int argc, char **argv)
|
||||
printf("\\%03o", bptr[j]);
|
||||
printf("\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
const char *conninfo;
|
||||
PGconn *conn;
|
||||
PGresult *res;
|
||||
const char *paramValues[1];
|
||||
int paramLengths[1];
|
||||
int paramFormats[1];
|
||||
uint32_t binaryIntVal;
|
||||
|
||||
/*
|
||||
* If the user supplies a parameter on the command line, use it as the
|
||||
* conninfo string; otherwise default to setting dbname=postgres and using
|
||||
* environment variables or defaults for all other connection parameters.
|
||||
*/
|
||||
if (argc > 1)
|
||||
conninfo = argv[1];
|
||||
else
|
||||
conninfo = "dbname = postgres";
|
||||
|
||||
/* Make a connection to the database */
|
||||
conn = PQconnectdb(conninfo);
|
||||
|
||||
/* Check to see that the backend connection was successfully made */
|
||||
if (PQstatus(conn) != CONNECTION_OK)
|
||||
{
|
||||
fprintf(stderr, "Connection to database failed: %s",
|
||||
PQerrorMessage(conn));
|
||||
exit_nicely(conn);
|
||||
}
|
||||
|
||||
/*
|
||||
* The point of this program is to illustrate use of PQexecParams() with
|
||||
* out-of-line parameters, as well as binary transmission of data.
|
||||
*
|
||||
* This first example transmits the parameters as text, but receives the
|
||||
* results in binary format. By using out-of-line parameters we can
|
||||
* avoid a lot of tedious mucking about with quoting and escaping, even
|
||||
* though the data is text. Notice how we don't have to do anything
|
||||
* special with the quote mark in the parameter value.
|
||||
*/
|
||||
|
||||
/* Here is our out-of-line parameter value */
|
||||
paramValues[0] = "joe's place";
|
||||
|
||||
res = PQexecParams(conn,
|
||||
"SELECT * FROM test1 WHERE t = $1",
|
||||
1, /* one param */
|
||||
NULL, /* let the backend deduce param type */
|
||||
paramValues,
|
||||
NULL, /* don't need param lengths since text */
|
||||
NULL, /* default to all text params */
|
||||
1); /* ask for binary results */
|
||||
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||
{
|
||||
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
|
||||
PQclear(res);
|
||||
exit_nicely(conn);
|
||||
}
|
||||
|
||||
show_binary_results(res);
|
||||
|
||||
PQclear(res);
|
||||
|
||||
/*
|
||||
* In this second example we transmit an integer parameter in binary
|
||||
* form, and again retrieve the results in binary form.
|
||||
*
|
||||
* Although we tell PQexecParams we are letting the backend deduce
|
||||
* parameter type, we really force the decision by casting the parameter
|
||||
* symbol in the query text. This is a good safety measure when sending
|
||||
* binary parameters.
|
||||
*/
|
||||
|
||||
/* Convert integer value "2" to network byte order */
|
||||
binaryIntVal = htonl((uint32_t) 2);
|
||||
|
||||
/* Set up parameter arrays for PQexecParams */
|
||||
paramValues[0] = (char *) &binaryIntVal;
|
||||
paramLengths[0] = sizeof(binaryIntVal);
|
||||
paramFormats[0] = 1; /* binary */
|
||||
|
||||
res = PQexecParams(conn,
|
||||
"SELECT * FROM test1 WHERE i = $1::int4",
|
||||
1, /* one param */
|
||||
NULL, /* let the backend deduce param type */
|
||||
paramValues,
|
||||
paramLengths,
|
||||
paramFormats,
|
||||
1); /* ask for binary results */
|
||||
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||
{
|
||||
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
|
||||
PQclear(res);
|
||||
exit_nicely(conn);
|
||||
}
|
||||
|
||||
show_binary_results(res);
|
||||
|
||||
PQclear(res);
|
||||
|
||||
|
Reference in New Issue
Block a user