X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq_misc.c;h=619559d0fe724d393d299b72b467c0b84cd5a673;hp=10defedd4c70cfc313dc345fcdb9169d23fdbf91;hb=843fc4cf789fa12ef08e6beefc4653498fe73bfd;hpb=1e2615005272bb2347820bccb38c94b9caccafb8 diff --git a/src/php_pq_misc.c b/src/php_pq_misc.c index 10defed..619559d 100644 --- a/src/php_pq_misc.c +++ b/src/php_pq_misc.c @@ -25,9 +25,60 @@ #include "php_pq.h" #include "php_pqexc.h" #include "php_pq_misc.h" +#include "php_pqconn_event.h" #undef PHP_PQ_TYPE #include "php_pq_type.h" + +/* clear result object associated with a result handle */ +void php_pqres_clear(PGresult *r) { + php_pq_object_t *o = PQresultInstanceData(r, php_pqconn_event); + + if (o) { + php_pq_object_delref(o); + } else { + PQclear(r); + } +} + +/* clear any asynchronous results */ +void php_pqconn_clear(PGconn *conn) { + PGresult *r; + php_pqconn_event_data_t *evdata = PQinstanceData(conn, php_pqconn_event); + + while ((r = PQgetResult(conn))) { + php_pqres_clear(r); + } + + if (evdata && evdata->obj) { + if (php_pq_callback_is_enabled(&evdata->obj->intern->onevent)) { + if (php_pq_callback_is_locked(&evdata->obj->intern->onevent)) { + php_pq_callback_disable(&evdata->obj->intern->onevent); + } 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_pqconn_clear(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_pqconn_clear(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_pqconn_clear(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_pqconn_clear(conn); + return PQexecPrepared(conn, stmtName, nParams, paramValues, paramLengths, paramFormats, resultFormat); +} + char *php_pq_rtrim(char *e) { size_t l = strlen(e); @@ -88,7 +139,11 @@ static PHP_METHOD(pqdt, __toString) ZEND_BEGIN_ARG_INFO_EX(ai_pqdt_create_from_format, 0, 0, 2) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, datetime) +#if PHP_VERSION_ID >= 70200 + ZEND_ARG_OBJ_INFO(0, object, DateTimeZone, 1) +#else ZEND_ARG_INFO(0, timezone) +#endif ZEND_END_ARG_INFO(); static PHP_METHOD(pqdt, createFromFormat) { @@ -263,6 +318,9 @@ static ZEND_RESULT_CODE parse_element(ArrayParserState *a, char delim) case '{': return parse_array(a); + case '}': + return SUCCESS; + case '"': a->quotes = 1; ++a->ptr; @@ -312,7 +370,7 @@ static ZEND_RESULT_CODE parse_element(ArrayParserState *a, char delim) static ZEND_RESULT_CODE parse_elements(ArrayParserState *a) { - char delims[] = {'}', PHP_PQ_DELIM_OF_ARRAY(a->typ), 0}; + char delims[] = {'}', (char) PHP_PQ_DELIM_OF_ARRAY(a->typ), 0}; while (SUCCESS == parse_element(a, delims[1])) { switch (caa(a, delims, 0)) { @@ -370,7 +428,7 @@ static ZEND_RESULT_CODE parse_array(ArrayParserState *a) return SUCCESS; } -HashTable *php_pq_parse_array(php_pqres_t *res, const char *val_str, size_t val_len, Oid typ TSRMLS_DC) +HashTable *php_pq_parse_array(php_pqres_t *res, const char *val_str, size_t val_len, Oid typ) { HashTable *ht = NULL; ArrayParserState a = {0};