diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt new file mode 100644 index 56d0bb8..d1b3136 *** a/src/interfaces/libpq/exports.txt --- b/src/interfaces/libpq/exports.txt *************** PQsetSingleRowMode 161 *** 164,166 **** --- 164,170 ---- lo_lseek64 162 lo_tell64 163 lo_truncate64 164 + PQexecParams2 165 + PQexecPrepared2 166 + PQsendQueryParams2 167 + PQsendQueryPrepared2 168 diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c new file mode 100644 index 77124ef..51f7c9c *** a/src/interfaces/libpq/fe-exec.c --- b/src/interfaces/libpq/fe-exec.c *************** static int PQsendQueryGuts(PGconn *conn, *** 61,67 **** const char *const * paramValues, const int *paramLengths, const int *paramFormats, ! int resultFormat); static void parseInput(PGconn *conn); static bool PQexecStart(PGconn *conn); static PGresult *PQexecFinish(PGconn *conn); --- 61,68 ---- const char *const * paramValues, const int *paramLengths, const int *paramFormats, ! int nResults, ! const int *resultFormats); static void parseInput(PGconn *conn); static bool PQexecStart(PGconn *conn); static PGresult *PQexecFinish(PGconn *conn); *************** PQsendQueryParams(PGconn *conn, *** 1168,1173 **** --- 1169,1201 ---- const int *paramFormats, int resultFormat) { + return PQsendQueryParams2(conn, + command, + nParams, + paramTypes, + paramValues, + paramLengths, + paramFormats, + 1, + &resultFormat); + } + + /* + * PQsendQueryParams2 + * Like PQsendQueryParams, but allows to pass an array + * of result formats + */ + int + PQsendQueryParams2(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats) + { if (!PQsendQueryStart(conn)) return 0; *************** PQsendQueryParams(PGconn *conn, *** 1184,1189 **** --- 1212,1223 ---- libpq_gettext("number of parameters must be between 0 and 65535\n")); return 0; } + if (nResults < 0 || nResults > 65535) + { + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("number of result formats must be between 0 and 65535\n")); + return 0; + } return PQsendQueryGuts(conn, command, *************** PQsendQueryParams(PGconn *conn, *** 1193,1199 **** paramValues, paramLengths, paramFormats, ! resultFormat); } /* --- 1227,1234 ---- paramValues, paramLengths, paramFormats, ! nResults, ! resultFormats); } /* *************** PQsendQueryPrepared(PGconn *conn, *** 1309,1314 **** --- 1344,1374 ---- const int *paramFormats, int resultFormat) { + return PQsendQueryPrepared2(conn, + stmtName, + nParams, + paramValues, + paramLengths, + paramFormats, + 1, + &resultFormat); + } + + /* + * PQsendQueryPrepared2 + * Like PQsendQueryPrepared, but allows to pass an array + * of result formats + */ + int + PQsendQueryPrepared2(PGconn *conn, + const char *stmtName, + int nParams, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats) + { if (!PQsendQueryStart(conn)) return 0; *************** PQsendQueryPrepared(PGconn *conn, *** 1325,1330 **** --- 1385,1396 ---- libpq_gettext("number of parameters must be between 0 and 65535\n")); return 0; } + if (nResults < 0 || nResults > 65535) + { + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("number of result formats must be between 0 and 65535\n")); + return 0; + } return PQsendQueryGuts(conn, NULL, /* no command to parse */ *************** PQsendQueryPrepared(PGconn *conn, *** 1334,1340 **** paramValues, paramLengths, paramFormats, ! resultFormat); } /* --- 1400,1407 ---- paramValues, paramLengths, paramFormats, ! nResults, ! resultFormats); } /* *************** PQsendQueryGuts(PGconn *conn, *** 1391,1397 **** const char *const * paramValues, const int *paramLengths, const int *paramFormats, ! int resultFormat) { int i; --- 1458,1465 ---- const char *const * paramValues, const int *paramLengths, const int *paramFormats, ! int nResults, ! const int *resultFormats) { int i; *************** PQsendQueryGuts(PGconn *conn, *** 1495,1503 **** goto sendFailed; } } ! if (pqPutInt(1, 2, conn) < 0 || ! pqPutInt(resultFormat, 2, conn)) goto sendFailed; if (pqPutMsgEnd(conn) < 0) goto sendFailed; --- 1563,1576 ---- goto sendFailed; } } ! ! /* send result formats */ ! if (pqPutInt(nResults, 2, conn) < 0) goto sendFailed; + for (i = 0; i < nResults; ++i) + if (pqPutInt(resultFormats[i], 2, conn)) + goto sendFailed; + if (pqPutMsgEnd(conn) < 0) goto sendFailed; *************** PQexecParams(PGconn *conn, *** 1822,1832 **** const int *paramFormats, int resultFormat) { if (!PQexecStart(conn)) return NULL; ! if (!PQsendQueryParams(conn, command, nParams, paramTypes, paramValues, paramLengths, ! paramFormats, resultFormat)) return NULL; return PQexecFinish(conn); } --- 1895,1932 ---- const int *paramFormats, int resultFormat) { + return PQexecParams2(conn, + command, + nParams, + paramTypes, + paramValues, + paramLengths, + paramFormats, + 1, + &resultFormat); + } + + /* + * PQexecParams2 + * Like PQexecParams, but allows to pass an array + * of result formats + */ + PGresult * + PQexecParams2(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats) + { if (!PQexecStart(conn)) return NULL; ! if (!PQsendQueryParams2(conn, command, nParams, paramTypes, paramValues, paramLengths, ! paramFormats, nResults, resultFormats)) return NULL; return PQexecFinish(conn); } *************** PQexecPrepared(PGconn *conn, *** 1868,1878 **** const int *paramFormats, int resultFormat) { if (!PQexecStart(conn)) return NULL; ! if (!PQsendQueryPrepared(conn, stmtName, nParams, paramValues, paramLengths, ! paramFormats, resultFormat)) return NULL; return PQexecFinish(conn); } --- 1968,2003 ---- const int *paramFormats, int resultFormat) { + return PQexecPrepared2(conn, + stmtName, + nParams, + paramValues, + paramLengths, + paramFormats, + 1, + &resultFormat); + } + + /* + * PQexecPrepared2 + * Like PQexecPrepared, but allows to pass an array + * of result formats + */ + PGresult * + PQexecPrepared2(PGconn *conn, + const char *stmtName, + int nParams, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats) + { if (!PQexecStart(conn)) return NULL; ! if (!PQsendQueryPrepared2(conn, stmtName, nParams, paramValues, paramLengths, ! paramFormats, nResults, resultFormats)) return NULL; return PQexecFinish(conn); } diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h new file mode 100644 index 0b8d9a6..8df0051 *** a/src/interfaces/libpq/libpq-fe.h --- b/src/interfaces/libpq/libpq-fe.h *************** extern PGresult *PQexecParams(PGconn *co *** 358,363 **** --- 358,372 ---- const int *paramLengths, const int *paramFormats, int resultFormat); + extern PGresult *PQexecParams2(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats); extern PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes); *************** extern PGresult *PQexecPrepared(PGconn * *** 368,373 **** --- 377,390 ---- const int *paramLengths, const int *paramFormats, int resultFormat); + extern PGresult *PQexecPrepared2(PGconn *conn, + const char *stmtName, + int nParams, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats); /* Interface for multiple-result or asynchronous queries */ extern int PQsendQuery(PGconn *conn, const char *query); *************** extern int PQsendQueryParams(PGconn *con *** 379,384 **** --- 396,410 ---- const int *paramLengths, const int *paramFormats, int resultFormat); + extern int PQsendQueryParams2(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats); extern int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes); *************** extern int PQsendQueryPrepared(PGconn *c *** 389,394 **** --- 415,428 ---- const int *paramLengths, const int *paramFormats, int resultFormat); + extern int PQsendQueryPrepared2(PGconn *conn, + const char *stmtName, + int nParams, + const char *const * paramValues, + const int *paramLengths, + const int *paramFormats, + int nResults, + const int *resultFormats); extern int PQsetSingleRowMode(PGconn *conn); extern PGresult *PQgetResult(PGconn *conn);