X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq_misc.c;h=296c6b54157ec86998c0f6f76b75999126cc3499;hp=a3db8bbcd52827c0f1258d4a841a77fa55975042;hb=a06db6d217fc8ba0fd9b8273a9e595477d59afcc;hpb=0d8fc412a6fdd65f6bc89ae77b132ca119e00c6c diff --git a/src/php_pq_misc.c b/src/php_pq_misc.c index a3db8bb..296c6b5 100644 --- a/src/php_pq_misc.c +++ b/src/php_pq_misc.c @@ -24,10 +24,64 @@ #include "php_pq.h" #include "php_pqexc.h" +#include "php_pqconn_event.h" #include "php_pq_misc.h" #undef PHP_PQ_TYPE #include "php_pq_type.h" + +/* clear result object associated with a result handle */ +void php_pq_clear_res(PGresult *r) { + php_pq_object_t *o = PQresultInstanceData(r, php_pqconn_event); + + if (o) { + TSRMLS_FETCH(); + php_pq_object_delref(o TSRMLS_CC); + } else { + PQclear(r); + } +} + +/* clear any asynchronous results */ +void php_pq_clear_conn(PGconn *conn) { + PGresult *r; + php_pqconn_event_data_t *evdata = PQinstanceData(conn, php_pqconn_event); + + while ((r = PQgetResult(conn))) { + php_pq_clear_res(r); + } + + if (evdata && evdata->obj) { + if (php_pq_callback_is_enabled(&evdata->obj->intern->onevent)) { + TSRMLS_FETCH_FROM_CTX(evdata->ts); + + if (php_pq_callback_is_locked(&evdata->obj->intern->onevent TSRMLS_CC)) { + php_pq_callback_disable(&evdata->obj->intern->onevent TSRMLS_CC); + } else { + php_pq_callback_dtor(&evdata->obj->intern->onevent); + } + } + } +} + +/* safe wrappers to clear any asynchronous wrappers before querying synchronously */ +PGresult *php_pq_exec(PGconn *conn, const char *query) { + php_pq_clear_conn(conn); + return PQexec(conn, query); +} +PGresult *php_pq_exec_params(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const * paramValues, const int *paramLengths, const int *paramFormats, int resultFormat) { + php_pq_clear_conn(conn); + return PQexecParams(conn, command, nParams, paramTypes, paramValues, paramLengths, paramFormats, resultFormat); +} +PGresult *php_pq_prepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes) { + php_pq_clear_conn(conn); + return PQprepare(conn, stmtName, query, nParams, paramTypes); +} +PGresult *php_pq_exec_prepared(PGconn *conn, const char *stmtName, int nParams, const char *const * paramValues, const int *paramLengths, const int *paramFormats, int resultFormat) { + php_pq_clear_conn(conn); + return PQexecPrepared(conn, stmtName, nParams, paramValues, paramLengths, paramFormats, resultFormat); +} + char *php_pq_rtrim(char *e) { size_t l = strlen(e);