}
if (0 > PQsetClientEncoding(obj->intern->conn, Z_STRVAL_P(zenc))) {
- zend_error(E_NOTICE, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc));
+ php_error(E_NOTICE, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc));
}
if (zenc != value) {
}
}
+#if HAVE_PQCONNINFO
+static void php_pqconn_object_read_params(zval *object, void *o, zval *return_value TSRMLS_DC)
+{
+ php_pqconn_object_t *obj = o;
+ PQconninfoOption *ptr, *params = PQconninfo(obj->intern->conn);
+
+ array_init(return_value);
+
+ if (params) {
+ for (ptr = params; ptr->keyword; ++ptr) {
+ if (ptr->val) {
+ add_assoc_string(return_value, ptr->keyword, ptr->val, 1);
+ } else {
+ add_assoc_null(return_value, ptr->keyword);
+ }
+ }
+ PQconninfoFree(params);
+ }
+}
+#endif
+
static void php_pqconn_object_read_options(zval *object, void *o, zval *return_value TSRMLS_DC)
{
php_pqconn_object_t *obj = o;
}
}
- obj->intern->default_auto_convert = Z_LVAL_P(zac) & 0xff;
+ obj->intern->default_auto_convert = Z_LVAL_P(zac) & PHP_PQRES_CONV_ALL;
if (zac != value) {
zval_ptr_dtor(&zac);
static int apply_unlisten(void *p TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
{
php_pqconn_object_t *obj = va_arg(argv, php_pqconn_object_t *);
- PGresult *res = unlisten(obj->intern->conn, key->arKey, key->nKeyLength - 1);
+ PGresult *res = unlisten(obj->intern->conn, key->arKey, key->nKeyLength - 1 TSRMLS_CC);
if (res) {
PHP_PQclear(res);
if (!obj->intern) {
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else if (SUCCESS == zend_hash_del(&obj->intern->listeners, channel_str, channel_len + 1)) {
- PGresult *res = unlisten(obj->intern->conn, channel_str, channel_len);
+ PGresult *res = unlisten(obj->intern->conn, channel_str, channel_len TSRMLS_CC);
if (res) {
php_pqres_success(res TSRMLS_CC);
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else if (!PQsendQuery(obj->intern->conn, query_str)) {
throw_exce(EX_IO TSRMLS_CC, "Failed to execute query (%s)", PHP_PQerrorMessage(obj->intern->conn));
+#if HAVE_PQSETSINGLEROWMODE
} else if (obj->intern->unbuffered && !PQsetSingleRowMode(obj->intern->conn)) {
throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to enable unbuffered mode (%s)", PHP_PQerrorMessage(obj->intern->conn));
+#endif
} else {
php_pq_callback_recurse(&obj->intern->onevent, &resolver TSRMLS_CC);
obj->intern->poller = PQconsumeInput;
if (!rc) {
throw_exce(EX_IO TSRMLS_CC, "Failed to execute query (%s)", PHP_PQerrorMessage(obj->intern->conn));
+#if HAVE_PQSETSINGLEROWMODE
} else if (obj->intern->unbuffered && !PQsetSingleRowMode(obj->intern->conn)) {
throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to enable unbuffered mode (%s)", PHP_PQerrorMessage(obj->intern->conn));
+#endif
} else {
php_pq_callback_recurse(&obj->intern->onevent, &resolver TSRMLS_CC);
obj->intern->poller = PQconsumeInput;
if (!PQsendPrepare(obj->intern->conn, name, query, params->type.count, params->type.oids)) {
rv = FAILURE;
throw_exce(EX_IO TSRMLS_CC, "Failed to prepare statement (%s)", PHP_PQerrorMessage(obj->intern->conn));
- } else if (obj->intern->unbuffered && !PQsetSingleRowMode(obj->intern->conn)) {
- rv = FAILURE;
- throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to enable unbuffered mode (%s)", PHP_PQerrorMessage(obj->intern->conn));
} else {
rv = SUCCESS;
obj->intern->poller = PQconsumeInput;
}
}
-static inline char *declare_str(const char *name_str, size_t name_len, unsigned flags, const char *query_str, size_t query_len)
-{
- size_t decl_len = name_len + query_len + sizeof("DECLARE BINARY INSENSITIVE NO SCROLL CURSOR WITHOUT HOLD FOR ");
- char *decl_str;
-
- decl_str = emalloc(decl_len);
- decl_len = slprintf(decl_str, decl_len, "DECLARE %s %s %s %s CURSOR %s FOR %s",
- name_str,
- (flags & PHP_PQ_DECLARE_BINARY) ? "BINARY" : "",
- (flags & PHP_PQ_DECLARE_INSENSITIVE) ? "INSENSITIVE" : "",
- (flags & PHP_PQ_DECLARE_NO_SCROLL) ? "NO SCROLL" :
- (flags & PHP_PQ_DECLARE_SCROLL) ? "SCROLL" : "",
- (flags & PHP_PQ_DECLARE_WITH_HOLD) ? "WITH HOLD" : "",
- query_str
- );
- return decl_str;
-}
-
STATUS php_pqconn_declare(zval *object, php_pqconn_object_t *obj, const char *decl TSRMLS_DC)
{
PGresult *res;
if (!obj->intern) {
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else {
- char *decl = declare_str(name_str, name_len, flags, query_str, query_len);
+ char *decl = php_pqcur_declare_str(name_str, name_len, flags, query_str, query_len);
if (SUCCESS != php_pqconn_declare(getThis(), obj, decl TSRMLS_CC)) {
efree(decl);
if (!PQsendQuery(obj->intern->conn, decl)) {
rv = FAILURE;
throw_exce(EX_IO TSRMLS_CC, "Failed to declare cursor (%s)", PHP_PQerrorMessage(obj->intern->conn));
- } else if (obj->intern->unbuffered && !PQsetSingleRowMode(obj->intern->conn)) {
- rv = FAILURE;
- throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to enable unbuffered mode (%s)", PHP_PQerrorMessage(obj->intern->conn));
} else {
rv = SUCCESS;
obj->intern->poller = PQconsumeInput;
if (!obj->intern) {
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else {
- char *decl = declare_str(name_str, name_len, flags, query_str, query_len);
+ char *decl = php_pqcur_declare_str(name_str, name_len, flags, query_str, query_len);
if (SUCCESS != php_pqconn_declare_async(getThis(), obj, decl TSRMLS_CC)) {
efree(decl);
} else {
PGresult *res;
smart_str cmd = {0};
- const char *il = isolation_level(&isolation);
+ const char *il = php_pq_isolation_level(&isolation);
smart_str_appends(&cmd, "START TRANSACTION ISOLATION LEVEL ");
smart_str_appends(&cmd, il);
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else {
smart_str cmd = {0};
- const char *il = isolation_level(&isolation);
+ const char *il = php_pq_isolation_level(&isolation);
smart_str_appends(&cmd, "START TRANSACTION ISOLATION LEVEL ");
smart_str_appends(&cmd, il);
}
}
-static int apply_set_converter(void *p TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
+struct apply_set_converter_arg {
+ HashTable *ht;
+ zval **zconv;
+ unsigned add:1;
+};
+
+static int apply_set_converter(void *p, void *a TSRMLS_DC)
{
- zval *tmp, **zoid = p, **zcnv = va_arg(argv, zval **);
- HashTable *converters = va_arg(argv, HashTable *);
- int add = va_arg(argv, int);
+ zval *tmp, **zoid = p;
+ struct apply_set_converter_arg *arg = a;
tmp = *zoid;
Z_ADDREF_P(tmp);
convert_to_long_ex(&tmp);
- if (add) {
- Z_ADDREF_PP(zcnv);
- zend_hash_index_update(converters, Z_LVAL_P(tmp), zcnv, sizeof(zval *), NULL);
+ if (arg->add) {
+ Z_ADDREF_PP(arg->zconv);
+ zend_hash_index_update(arg->ht, Z_LVAL_P(tmp), arg->zconv, sizeof(zval *), NULL);
} else {
- zend_hash_index_del(converters, Z_LVAL_P(tmp));
+ zend_hash_index_del(arg->ht, Z_LVAL_P(tmp));
}
zval_ptr_dtor(&tmp);
}
ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_set_converter, 0, 0, 1)
- ZEND_ARG_OBJ_INFO(0, converter, pq\\ConverterInterface, 0)
+ ZEND_ARG_OBJ_INFO(0, converter, pq\\Converter, 0)
ZEND_END_ARG_INFO();
static PHP_METHOD(pqconn, setConverter) {
STATUS rv;
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else {
zval *tmp, *zoids = NULL;
+ struct apply_set_converter_arg arg = {NULL};
zend_call_method_with_0_params(&zcnv, NULL, NULL, "converttypes", &zoids);
tmp = zoids;
Z_ADDREF_P(tmp);
convert_to_array_ex(&tmp);
- zend_hash_apply_with_arguments(Z_ARRVAL_P(tmp) TSRMLS_CC, apply_set_converter, 3, &zcnv, &obj->intern->converters, 1);
+
+ arg.ht = &obj->intern->converters;
+ arg.zconv = &zcnv;
+ arg.add = 1;
+
+ zend_hash_apply_with_argument(Z_ARRVAL_P(tmp), apply_set_converter, &arg TSRMLS_CC);
+
zval_ptr_dtor(&tmp);
zval_ptr_dtor(&zoids);
}
}
ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unset_converter, 0, 0, 1)
- ZEND_ARG_OBJ_INFO(0, converter, pq\\ConverterInterface, 0)
+ ZEND_ARG_OBJ_INFO(0, converter, pq\\Converter, 0)
ZEND_END_ARG_INFO();
static PHP_METHOD(pqconn, unsetConverter) {
STATUS rv;
throw_exce(EX_UNINITIALIZED TSRMLS_CC, "pq\\Connection not initialized");
} else {
zval *tmp, *zoids = NULL;
+ struct apply_set_converter_arg arg = {NULL};
zend_call_method_with_0_params(&zcnv, NULL, NULL, "converttypes", &zoids);
tmp = zoids;
Z_ADDREF_P(tmp);
convert_to_array_ex(&tmp);
- zend_hash_apply_with_arguments(Z_ARRVAL_P(tmp) TSRMLS_CC, apply_set_converter, 3, &zcnv, &obj->intern->converters, 0);
+
+ arg.ht = &obj->intern->converters;
+ arg.zconv = &zcnv;
+ arg.add = 0;
+
+ zend_hash_apply_with_argument(Z_ARRVAL_P(tmp), apply_set_converter, &arg TSRMLS_CC);
+
zval_ptr_dtor(&tmp);
zval_ptr_dtor(&zoids);
}
php_pqconn_object_handlers.get_properties = php_pq_object_properties;
php_pqconn_object_handlers.get_debug_info = php_pq_object_debug_info;
- zend_hash_init(&php_pqconn_object_prophandlers, 14, NULL, NULL, 1);
+ zend_hash_init(&php_pqconn_object_prophandlers, 20, NULL, NULL, 1);
zend_declare_property_long(php_pqconn_class_entry, ZEND_STRL("status"), CONNECTION_BAD, ZEND_ACC_PUBLIC TSRMLS_CC);
ph.read = php_pqconn_object_read_status;
ph.read = php_pqconn_object_read_port;
zend_hash_add(&php_pqconn_object_prophandlers, "port", sizeof("port"), (void *) &ph, sizeof(ph), NULL);
+#if HAVE_PQCONNINFO
+ zend_declare_property_null(php_pqconn_class_entry, ZEND_STRL("params"), ZEND_ACC_PUBLIC TSRMLS_CC);
+ ph.read = php_pqconn_object_read_params;
+ zend_hash_add(&php_pqconn_object_prophandlers, "params", sizeof("params"), (void *) &ph, sizeof(ph), NULL);
+#endif
+
zend_declare_property_null(php_pqconn_class_entry, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC);
ph.read = php_pqconn_object_read_options;
zend_hash_add(&php_pqconn_object_prophandlers, "options", sizeof("options"), (void *) &ph, sizeof(ph), NULL);