PQdescribePrepared.c
text/plain
Filename: PQdescribePrepared.c
Type: text/plain
Part: 1
#include <stdio.h>
#include "libpq-fe.h"
int
main(void)
{
PGconn *conn = PQconnectdb("dbname=template1");
PGresult *res;
int ret;
/*
* Make an erronous Describe ('D') request.
*/
printf("=== PQdescribePrepared>\n");
ret = PQdescribePrepared(conn, "not_exists");
if (ret)
{
printf("PQdescribePrepared() failed! [%s]\n", PQerrorMessage(conn));
PQfinish(conn);
return 1;
}
/*
* Receive erronous describe response.
*/
printf("=== PQgetResult>\n");
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
printf("PQgetResult() failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
printf("(***Expected Error.***)\n");
}
PQclear(res);
/*
* Flush result set.
*/
printf("=== PQgetResult> (Flush result set)\n");
res = PQgetResult(conn);
if (res)
{
printf("Failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
/*
* PREPARE a statement to describe.
*/
printf("=== PREPARE>\n");
res = PQexec(conn,
"PREPARE my_plan (int4, text, float) AS"
" SELECT "
" (random()*$1)::float8 AS c1, "
" $2 AS c2, "
" (random()*$3)::int8 AS c3, "
" 'some text' AS c4;");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
printf("Failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
PQclear(res);
/*
* Make a Describe ('D') request.
*/
printf("=== PQdescribePrepared>\n");
ret = PQdescribePrepared(conn, "my_plan");
if (ret)
{
printf("PQdescribePrepared() failed! [%s]\n", PQerrorMessage(conn));
PQfinish(conn);
return 1;
}
/*
* Receive Describe response (ParameterDescription).
*/
printf("=== PQgetResult>\n");
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
printf("PQgetResult() failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
else
{
int i, n = PQnfields(res);
printf("PQftype\n");
for (i = 0; i < n; i++)
printf(" %d:%d\n", i, PQftype(res, i));
}
PQclear(res);
printf("=== PQgetResult>\n");
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
printf("PQgetResult() failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
else
{
int i, n = PQnfields(res);
printf("PQfname\n");
for (i = 0; i < n; i++)
printf(" %d:%s\n", i, PQfname(res, i));
}
PQclear(res);
/*
* Flush result set.
*/
printf("=== PQgetResult> (Flush result set)\n");
res = PQgetResult(conn);
if (res)
{
printf("Failed! %s [%s || Conn: %s]\n",
PQresStatus(PQresultStatus(res)),
PQresultErrorMessage(res),
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
PQclear(res);
PQfinish(conn);
return 0;
}