+ RETVAL_FALSE;
+ }
+ }
+ zend_restore_error_handling(&zeh TSRMLS_CC);
+}
+
+ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async, 0, 0, 2)
+ ZEND_ARG_INFO(0, query)
+ ZEND_ARG_ARRAY_INFO(0, params, 0)
+ ZEND_ARG_ARRAY_INFO(0, types, 1)
+ ZEND_ARG_INFO(0, callable)
+ZEND_END_ARG_INFO();
+static PHP_METHOD(pqconn, execParamsAsync) {
+ zend_error_handling zeh;
+ php_pq_callback_t resolver;
+ char *query_str;
+ int query_len;
+ zval *zparams;
+ zval *ztypes = NULL;
+
+ zend_replace_error_handling(EH_THROW, NULL, &zeh TSRMLS_CC);
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa/|a/!f", &query_str, &query_len, &zparams, &ztypes, &resolver.fci, &resolver.fcc)) {
+ php_pqconn_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if (obj->conn) {
+ int count = 0;
+ Oid *types = NULL;
+ char **params = NULL;
+ HashTable zdtor;
+
+ ZEND_INIT_SYMTABLE(&zdtor);
+ php_pq_params_to_array(Z_ARRVAL_P(zparams), ¶ms, &count, &zdtor TSRMLS_CC);
+
+ if (ztypes) {
+ php_pq_types_to_array(Z_ARRVAL_P(ztypes), &types TSRMLS_CC);
+ }
+
+ php_pq_callback_dtor(&obj->onevent);
+ if (resolver.fci.size > 0) {
+ obj->onevent = resolver;
+ php_pq_callback_addref(&obj->onevent);
+ }
+
+ obj->poller = PQconsumeInput;
+
+ if (PQsendQueryParams(obj->conn, query_str, count, types, (const char *const*) params, NULL, NULL, 0)) {
+ RETVAL_TRUE;
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not execute query: %s", PQerrorMessage(obj->conn));
+ RETVAL_FALSE;
+ }
+
+ zend_hash_destroy(&zdtor);
+ if (types) {
+ efree(types);
+ }
+ if (params) {
+ efree(params);
+ }
+
+ php_pqconn_notify_listeners(getThis(), obj TSRMLS_CC);
+
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection not initialized");
+ RETVAL_FALSE;