diff --git a/package.xml b/package.xml
index 741cddc..4956eda 100644
--- a/package.xml
+++ b/package.xml
@@ -90,6 +90,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
+
@@ -114,6 +115,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
+
diff --git a/src/php_pqres.c b/src/php_pqres.c
index addeab3..de33fd2 100644
--- a/src/php_pqres.c
+++ b/src/php_pqres.c
@@ -883,6 +883,25 @@ static PHP_METHOD(pqres, count) {
}
}
+ZEND_BEGIN_ARG_INFO_EX(ai_pqres_desc, 0, 0, 0)
+ZEND_END_ARG_INFO();
+static PHP_METHOD(pqres, desc) {
+ if (SUCCESS == zend_parse_parameters_none()) {
+ php_pqres_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (!obj->intern) {
+ throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Result not initialized");
+ } else {
+ int p, params;
+
+ array_init(return_value);
+ for (p = 0, params = PQnparams(obj->intern->res); p < params; ++p) {
+ add_next_index_long(return_value, PQparamtype(obj->intern->res, p));
+ }
+ }
+ }
+}
+
static zend_function_entry php_pqres_methods[] = {
PHP_ME(pqres, bind, ai_pqres_bind, ZEND_ACC_PUBLIC)
PHP_ME(pqres, fetchBound, ai_pqres_fetch_bound, ZEND_ACC_PUBLIC)
@@ -891,6 +910,7 @@ static zend_function_entry php_pqres_methods[] = {
PHP_ME(pqres, fetchAll, ai_pqres_fetch_all, ZEND_ACC_PUBLIC)
PHP_ME(pqres, count, ai_pqres_count, ZEND_ACC_PUBLIC)
PHP_ME(pqres, map, ai_pqres_map, ZEND_ACC_PUBLIC)
+ PHP_ME(pqres, desc, ai_pqres_desc, ZEND_ACC_PUBLIC)
{0}
};
diff --git a/src/php_pqstm.c b/src/php_pqstm.c
index a0ae249..6be580c 100644
--- a/src/php_pqstm.c
+++ b/src/php_pqstm.c
@@ -113,7 +113,7 @@ static void php_pqstm_object_read_connection(zval *object, void *o, zval *return
ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct, 0, 0, 3)
ZEND_ARG_OBJ_INFO(0, Connection, pq\\Connection, 0)
- ZEND_ARG_INFO(0, type)
+ ZEND_ARG_INFO(0, name)
ZEND_ARG_INFO(0, query)
ZEND_ARG_ARRAY_INFO(0, types, 1)
ZEND_ARG_INFO(0, async)
@@ -293,14 +293,16 @@ static PHP_METHOD(pqstm, desc) {
}
}
-ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc_async, 0, 0, 0)
+ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc_async, 0, 0, 1)
+ ZEND_ARG_INFO(0, callable)
ZEND_END_ARG_INFO();
static PHP_METHOD(pqstm, descAsync) {
zend_error_handling zeh;
+ php_pq_callback_t resolver = {{0}};
STATUS rv;
zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
- rv = zend_parse_parameters_none();
+ rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f", &resolver.fci, &resolver.fcc);
zend_restore_error_handling(&zeh TSRMLS_CC);
if (SUCCESS == rv) {
@@ -311,6 +313,11 @@ static PHP_METHOD(pqstm, descAsync) {
} else if (!PQsendDescribePrepared(obj->intern->conn->intern->conn, obj->intern->name)) {
throw_exce(EX_IO TSRMLS_CC, "Failed to describe statement: %s", PHP_PQerrorMessage(obj->intern->conn->intern->conn));
} else {
+ php_pq_callback_dtor(&obj->intern->conn->intern->onevent);
+ if (resolver.fci.size > 0) {
+ obj->intern->conn->intern->onevent = resolver;
+ php_pq_callback_addref(&obj->intern->conn->intern->onevent);
+ }
obj->intern->conn->intern->poller = PQconsumeInput;
php_pqconn_notify_listeners(obj->intern->conn TSRMLS_CC);
}
diff --git a/tests/async007.phpt b/tests/async007.phpt
new file mode 100644
index 0000000..c2a59f6
--- /dev/null
+++ b/tests/async007.phpt
@@ -0,0 +1,41 @@
+--TEST--
+async statement
+--SKIPIF--
+
+--FILE--
+busy) {
+ $r = array($c->socket);
+ $w = $e = null;
+ if (stream_select($r, $w, $e, null)) {
+ $c->poll();
+ }
+ }
+ } while ($c->getResult());
+}
+
+$c = new pq\Connection(PQ_DSN);
+$t = new pq\Types($c);
+$s = new pq\Statement($c, "test1", "SELECT NOW() - \$1", null, true);
+complete($s->connection);
+
+$s->execAsync(array("2012-12-12 12:12:12"));
+complete($s->connection);
+
+$s->descAsync(function($r) use ($t) {
+ list($typeOid) = $r->desc();
+ printf("%s\n", $t[$typeOid]->typname);
+});
+complete($s->connection);
+
+?>
+DONE
+--EXPECT--
+Test
+timestamptz
+DONE
diff --git a/tests/stm_desc002.phpt b/tests/stm_desc002.phpt
new file mode 100644
index 0000000..32ab8b2
--- /dev/null
+++ b/tests/stm_desc002.phpt
@@ -0,0 +1,22 @@
+--TEST--
+desc statement
+--SKIPIF--
+
+--FILE--
+exec(array("2012-12-12 12:12:12"));
+$d = $s->desc();
+
+printf("%s\n", (new pq\Types($c))[$d[0]]->typname);
+
+?>
+DONE
+--EXPECT--
+Test
+timestamptz
+DONE