MAKE_STD_ZVAL(zv);
if (SUCCESS == zend_hash_index_find(&res->converters, typ, (void *) &zconv)) {
- zval *tmp = NULL;
+ zval *ztype, *tmp = NULL;
+ MAKE_STD_ZVAL(ztype);
+ ZVAL_LONG(ztype, typ);
ZVAL_STRINGL(zv, val, len, 1);
- zend_call_method_with_1_params(zconv, NULL, NULL, "convertfromstring", &tmp, zv);
+ zend_call_method_with_2_params(zconv, NULL, NULL, "convertfromstring", &tmp, zv, ztype);
+ zval_ptr_dtor(&ztype);
if (tmp) {
zval_ptr_dtor(&zv);
ZEND_END_ARG_INFO();
static PHP_METHOD(pqres, bind) {
zval *zcol, *zref;
+ zend_error_handling zeh;
+ STATUS rv;
+
+ zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
+ rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref);
+ zend_restore_error_handling(&zeh TSRMLS_CC);
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref)) {
+ if (SUCCESS == rv) {
php_pqres_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
if (!obj->intern) {
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) {
- RETVAL_FALSE;
- } else {
+ if (row) {
php_pqres_col_t col;
if (SUCCESS != column_nn(obj, zcol, &col TSRMLS_CC)) {
php_pqres_col_t col;
zend_replace_error_handling(EH_THROW, exce(EX_RUNTIME), &zeh TSRMLS_CC);
-
if (SUCCESS == column_nn(obj, zcol, &col TSRMLS_CC)) {
int r, rows = PQntuples(obj->intern->res);
add_next_index_zval(return_value, php_pqres_get_col(obj->intern, r, col.num TSRMLS_CC));
}
}
-
zend_restore_error_handling(&zeh TSRMLS_CC);
}
}
}
-static int apply_to_col(void *p TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
+struct apply_to_col_arg {
+ php_pqres_object_t *obj;
+ php_pqres_col_t *cols;
+ STATUS status;
+};
+
+static int apply_to_col(void *p, void *a TSRMLS_DC)
{
zval **c = p;
- php_pqres_object_t *obj = va_arg(argv, php_pqres_object_t *);
- php_pqres_col_t *col, **cols = va_arg(argv, php_pqres_col_t **);
- STATUS *rv = va_arg(argv, STATUS *);
+ struct apply_to_col_arg *arg = a;
- col = *cols;
-
- if (SUCCESS != column_nn(obj, *c, col TSRMLS_CC)) {
- *rv = FAILURE;
+ if (SUCCESS != column_nn(arg->obj, *c, arg->cols TSRMLS_CC)) {
+ arg->status = FAILURE;
return ZEND_HASH_APPLY_STOP;
} else {
- *rv = SUCCESS;
- ++*cols;
+ arg->status = SUCCESS;
+ ++arg->cols;
return ZEND_HASH_APPLY_KEEP;
}
}
static php_pqres_col_t *php_pqres_convert_to_cols(php_pqres_object_t *obj, HashTable *ht TSRMLS_DC)
{
- php_pqres_col_t *tmp, *cols = ecalloc(zend_hash_num_elements(ht), sizeof(*cols));
- STATUS rv = SUCCESS;
+ struct apply_to_col_arg arg = {NULL};
+ php_pqres_col_t *tmp;
- tmp = cols;
- zend_hash_apply_with_arguments(ht TSRMLS_CC, apply_to_col, 2, obj, &tmp, &rv);
+ arg.obj = obj;
+ arg.cols = ecalloc(zend_hash_num_elements(ht), sizeof(*tmp));
+ tmp = arg.cols;
+ zend_hash_apply_with_argument(ht, apply_to_col, &arg TSRMLS_CC);
- if (SUCCESS == rv) {
- return cols;
+ if (SUCCESS == arg.status) {
+ return tmp;
} else {
- efree(cols);
+ efree(tmp);
return NULL;
}
}
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);
+ zend_hash_init(&php_pqres_object_prophandlers, 8, NULL, NULL, 1);
zend_declare_property_null(php_pqres_class_entry, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC);
ph.read = php_pqres_object_read_status;
zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_SCALAR"), PHP_PQRES_CONV_SCALAR TSRMLS_CC);
zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_ARRAY"), PHP_PQRES_CONV_ARRAY TSRMLS_CC);
zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_DATETIME"), PHP_PQRES_CONV_DATETIME TSRMLS_CC);
+ zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_JSON"), PHP_PQRES_CONV_JSON TSRMLS_CC);
zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_ALL"), PHP_PQRES_CONV_ALL TSRMLS_CC);
return SUCCESS;