X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq.c;h=f1db28f16fbf006074b62aee8bafaeb771fe17c1;hp=6058057de9e78754a6279c93c6d6deed0856e21c;hb=f96bf1b561253e6259f02332d3895a292511d519;hpb=62733e47d1c382366f5d7dd1298745bc51ca0023 diff --git a/src/php_pq.c b/src/php_pq.c index 6058057..f1db28f 100644 --- a/src/php_pq.c +++ b/src/php_pq.c @@ -86,7 +86,7 @@ typedef struct php_pqconn_object { zend_object zo; PGconn *conn; int (*poller)(PGconn *); - unsigned blocking:1; + unsigned async:1; } php_pqconn_object_t; typedef enum php_pqres_fetch { @@ -336,7 +336,7 @@ static zend_object_value php_pqconn_create_object_ex(zend_class_entry *ce, PGcon if (conn) { o->conn = conn; - o->blocking = !PQisnonblocking(o->conn); + o->async = !PQisnonblocking(o->conn); } ov.handle = zend_objects_store_put((zend_object *) o, NULL, php_pqconn_object_free, NULL TSRMLS_CC); @@ -734,26 +734,26 @@ static STATUS php_pqconn_update_socket(zval *this_ptr, php_pqconn_object_t *obj ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct, 0, 0, 1) ZEND_ARG_INFO(0, dsn) - ZEND_ARG_INFO(0, block) + ZEND_ARG_INFO(0, async) ZEND_END_ARG_INFO(); static PHP_METHOD(pqconn, __construct) { zend_error_handling zeh; char *dsn_str; int dsn_len; - zend_bool block = 1; + zend_bool async = 0; zend_replace_error_handling(EH_THROW, NULL, &zeh TSRMLS_CC); - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &dsn_str, &dsn_len, &block)) { + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &dsn_str, &dsn_len, &async)) { php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); if (obj->conn) { PQfinish(obj->conn); } - if ((obj->blocking = block)) { - obj->conn = PQconnectdb(dsn_str); - } else { + if ((obj->async = async)) { obj->conn = PQconnectStart(dsn_str); obj->poller = (int (*)(PGconn*)) PQconnectPoll; + } else { + obj->conn = PQconnectdb(dsn_str); } if (SUCCESS != php_pqconn_update_socket(getThis(), obj TSRMLS_CC)) { @@ -770,16 +770,19 @@ static PHP_METHOD(pqconn, reset) { php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); if (obj->conn) { - if (obj->blocking) { + if (obj->async) { + if (PQresetStart(obj->conn)) { + obj->poller = (int (*)(PGconn*)) PQresetPoll; + RETURN_TRUE; + } + } else { PQreset(obj->conn); + if (CONNECTION_OK == PQstatus(obj->conn)) { RETURN_TRUE; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection reset failed: %s", PQerrorMessage(obj->conn)); } - } else if (PQresetStart(obj->conn)) { - obj->poller = (int (*)(PGconn*)) PQresetPoll; - RETURN_TRUE; } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection not initialized"); @@ -796,7 +799,11 @@ static PHP_METHOD(pqconn, poll) { if (obj->conn) { if (obj->poller) { - RETURN_LONG(obj->poller(obj->conn)); + if (obj->poller == PQconsumeInput) { + RETURN_LONG(obj->poller(obj->conn) * PGRES_POLLING_OK); + } else { + RETURN_LONG(obj->poller(obj->conn)); + } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No asynchronous operation active"); } @@ -813,7 +820,7 @@ static STATUS php_pqres_success(PGresult *res TSRMLS_DC) case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: case PGRES_FATAL_ERROR: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: %s", PQresStatus(PQresultStatus(res)), PQresultErrorMessage(res)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", PQresultErrorMessage(res)); return FAILURE; default: return SUCCESS;