X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pqres.c;h=2b77dba500137583978108ce6e44a10867cfc303;hp=a1e1d0022eb63d2393f6c6ad6dcfc6cd8bc2f6a7;hb=b7620687147565388f76031efc820e773232fa34;hpb=9f5cecf26bd70a92ed013f31afec59e272623ac1 diff --git a/src/php_pqres.c b/src/php_pqres.c index a1e1d00..2b77dba 100644 --- a/src/php_pqres.c +++ b/src/php_pqres.c @@ -441,6 +441,10 @@ static STATUS column_nn(php_pqres_object_t *obj, zval *zcol, php_pqres_col_t *co char *name = NULL; switch (Z_TYPE_P(zcol)) { + case IS_LONG: + index = Z_LVAL_P(zcol); + break; + default: convert_to_string(zcol); /* no break */ @@ -450,10 +454,6 @@ static STATUS column_nn(php_pqres_object_t *obj, zval *zcol, php_pqres_col_t *co name = Z_STRVAL_P(zcol); } break; - - case IS_LONG: - index = Z_LVAL_P(zcol); - break; } if (name) { @@ -614,16 +614,17 @@ static zval **column_at(zval *row, int col TSRMLS_DC) return data; } -ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col, 0, 0, 0) - ZEND_ARG_INFO(0, col_num) +ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col, 0, 0, 2) + ZEND_ARG_INFO(0, col) + ZEND_ARG_INFO(1, ref) ZEND_END_ARG_INFO(); static PHP_METHOD(pqres, fetchCol) { zend_error_handling zeh; - long fetch_col = 0; + zval *zcol, *zref; STATUS rv; zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC); - rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &fetch_col); + rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref); zend_restore_error_handling(&zeh TSRMLS_CC); if (SUCCESS == rv) { @@ -636,11 +637,23 @@ static PHP_METHOD(pqres, fetchCol) { zend_replace_error_handling(EH_THROW, exce(EX_RUNTIME), &zeh TSRMLS_CC); php_pqres_iteration(getThis(), obj, obj->intern->iter ? obj->intern->iter->fetch_type : 0, &row TSRMLS_CC); - if (row) { - zval **col = column_at(*row, fetch_col TSRMLS_CC); + if (!row) { + RETVAL_FALSE; + } else { + php_pqres_col_t col; - if (col) { - RETVAL_ZVAL(*col, 1, 0); + if (SUCCESS != column_nn(obj, zcol, &col TSRMLS_CC)) { + RETVAL_FALSE; + } else { + zval **zres = column_at(*row, col.num TSRMLS_CC); + + if (!zres) { + RETVAL_FALSE; + } else { + zval_dtor(zref); + ZVAL_ZVAL(zref, *zres, 1, 1); + RETVAL_TRUE; + } } } zend_restore_error_handling(&zeh TSRMLS_CC); @@ -879,7 +892,9 @@ PHP_MINIT_FUNCTION(pqres) php_pqres_object_handlers.write_property = php_pq_object_write_prop; php_pqres_object_handlers.clone_obj = NULL; php_pqres_object_handlers.get_property_ptr_ptr = NULL; + php_pqres_object_handlers.get_gc = NULL; php_pqres_object_handlers.get_debug_info = php_pq_object_debug_info; + php_pqres_object_handlers.get_properties = php_pq_object_properties; php_pqres_object_handlers.count_elements = php_pqres_count_elements; zend_hash_init(&php_pqres_object_prophandlers, 6, NULL, NULL, 1);