X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fphp_pqres.c;h=3b5d6bff0216893b5ff4a6bdd77269e40d193a4c;hb=c48a4a7f5d82452d7d5ceac38e04c7893486f4f9;hp=782589de85f9dae26427b16ebed55781d05972b0;hpb=8f0022e027a5412e5d404ee62a0c0346481748b4;p=m6w6%2Fext-pq diff --git a/src/php_pqres.c b/src/php_pqres.c index 782589d..3b5d6bf 100644 --- a/src/php_pqres.c +++ b/src/php_pqres.c @@ -93,6 +93,7 @@ zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch { zval *data = NULL; int c, cols; + php_pqres_object_t *res_obj = PQresultInstanceData(res, php_pqconn_event); if (data_ptr) { data = *data_ptr; @@ -126,7 +127,22 @@ zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch break; } } else { - zval *zv = php_pq_typed_zval(PQgetvalue(res, row, c), PQgetlength(res, row, c), PQftype(res, c) TSRMLS_CC); + zval *zv, **zconv; + + if (res_obj && (SUCCESS == zend_hash_index_find(&res_obj->intern->converters, PQftype(res, c), (void *) &zconv))) { + zval *tmp = NULL; + + MAKE_STD_ZVAL(zv); + ZVAL_STRINGL(zv, PQgetvalue(res, row, c), PQgetlength(res, row, c), 1); + zend_call_method_with_1_params(zconv, NULL, NULL, "convertfromstring", &tmp, zv); + + if (tmp) { + zval_ptr_dtor(&zv); + zv = tmp; + } + } else { + zv = php_pq_typed_zval(PQgetvalue(res, row, c), PQgetlength(res, row, c), PQftype(res, c) TSRMLS_CC); + } switch (fetch_type) { case PHP_PQRES_FETCH_OBJECT: @@ -248,13 +264,15 @@ STATUS php_pqres_success(PGresult *res TSRMLS_DC) } } -void php_pqres_init_instance_data(PGresult *res, php_pqres_object_t **ptr TSRMLS_DC) +void php_pqres_init_instance_data(PGresult *res, php_pqconn_object_t *conn_obj, php_pqres_object_t **ptr TSRMLS_DC) { php_pqres_object_t *obj; php_pqres_t *r = ecalloc(1, sizeof(*r)); r->res = res; - ZEND_INIT_SYMTABLE(&r->bound); + zend_hash_init(&r->bound, 0, 0, ZVAL_PTR_DTOR, 0); + zend_hash_init(&r->converters, 0, 0, ZVAL_PTR_DTOR, 0); + zend_hash_copy(&r->converters, &conn_obj->intern->converters, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); php_pqres_create_object_ex(php_pqres_class_entry, r, &obj TSRMLS_CC); PQresultSetInstanceData(res, php_pqconn_event, obj); @@ -283,6 +301,7 @@ static void php_pqres_object_free(void *o TSRMLS_DC) } zend_hash_destroy(&obj->intern->bound); + zend_hash_destroy(&obj->intern->converters); efree(obj->intern); obj->intern = NULL; @@ -651,7 +670,7 @@ static PHP_METHOD(pqres, fetchCol) { RETVAL_FALSE; } else { zval_dtor(zref); - ZVAL_ZVAL(zref, *zres, 1, 1); + ZVAL_ZVAL(zref, *zres, 1, 0); RETVAL_TRUE; } } @@ -864,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) @@ -872,9 +910,16 @@ 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} }; +PHP_MSHUTDOWN_FUNCTION(pqres) +{ + zend_hash_destroy(&php_pqres_object_prophandlers); + return SUCCESS; +} + PHP_MINIT_FUNCTION(pqres) { zend_class_entry ce = {0};