X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pqconn.c;h=7b1fbd926d49e7e2f32150449d4c2ccfc77f83c5;hp=c4d6c806341de53295bfec4bc1a2578144a732be;hb=a840b29b5fc3f841f39acd1ae47e957d7db29583;hpb=d96d8d4af09d7f32fec302908a5e4ee8d8bee7fb diff --git a/src/php_pqconn.c b/src/php_pqconn.c index c4d6c80..7b1fbd9 100644 --- a/src/php_pqconn.c +++ b/src/php_pqconn.c @@ -301,6 +301,25 @@ static void php_pqconn_object_read_port(zval *object, void *o, zval *return_valu } } +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); + } +} + static void php_pqconn_object_read_options(zval *object, void *o, zval *return_value TSRMLS_DC) { php_pqconn_object_t *obj = o; @@ -458,7 +477,7 @@ static void php_pqconn_object_write_def_auto_conv(zval*object, void *o, zval *va } } - 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); @@ -573,7 +592,7 @@ static inline PGresult *unlisten(PGconn *conn, const char *channel_str, size_t c 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); @@ -758,7 +777,7 @@ static PHP_METHOD(pqconn, unlisten) 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); @@ -1343,24 +1362,6 @@ static PHP_METHOD(pqconn, prepareAsync) { } } -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; @@ -1406,7 +1407,7 @@ static PHP_METHOD(pqconn, declare) { 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); @@ -1471,7 +1472,7 @@ static PHP_METHOD(pqconn, declareAsync) { 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); @@ -1830,20 +1831,25 @@ static PHP_METHOD(pqconn, on) { } } -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); @@ -1851,7 +1857,7 @@ static int apply_set_converter(void *p TSRMLS_DC, int argc, va_list argv, zend_h } 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; @@ -1869,12 +1875,19 @@ static PHP_METHOD(pqconn, setConverter) { 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); } @@ -1882,7 +1895,7 @@ static PHP_METHOD(pqconn, setConverter) { } 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; @@ -1900,12 +1913,19 @@ static PHP_METHOD(pqconn, unsetConverter) { 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); } @@ -1970,7 +1990,7 @@ PHP_MINIT_FUNCTION(pqconn) 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; @@ -2024,6 +2044,10 @@ PHP_MINIT_FUNCTION(pqconn) ph.read = php_pqconn_object_read_port; zend_hash_add(&php_pqconn_object_prophandlers, "port", sizeof("port"), (void *) &ph, sizeof(ph), NULL); + 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); + 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);