X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fphp_pqres.c;h=e9608efc8024b1fe5a6dc4c13f5bde97090a8f82;hb=d3e3e97737cda9dafbb17c9076251c09a92bdf78;hp=849f8bff65f22cbdc3ef2f42e9a511e227c992d1;hpb=5ba3107011d4050d5ae5877dae80e382dc228e6a;p=m6w6%2Fext-pq diff --git a/src/php_pqres.c b/src/php_pqres.c index 849f8bf..e9608ef 100644 --- a/src/php_pqres.c +++ b/src/php_pqres.c @@ -45,7 +45,7 @@ static inline zend_object_iterator *php_pqres_iterator_init_ex(zend_class_entry iter->zi.funcs = &php_pqres_iterator_funcs; ZVAL_COPY_VALUE(&iter->zi.data, object); - zfetch_type = zend_read_property(ce, object, ZEND_STRL("fetchType"), 0, &tmp); + zfetch_type = php_pq_read_property(object, "fetchType", &tmp); iter->fetch_type = zval_get_long(zfetch_type); #if DBG_GC fprintf(stderr, "INIT iter(#%d) %p res(#%d) %p\n", iter->zi.std.handle, iter, Z_OBJ_HANDLE_P(object), PHP_PQ_OBJ(object, NULL)); @@ -134,7 +134,7 @@ zval *php_pqres_typed_zval(php_pqres_t *res, Oid typ, zval *zv) ZVAL_NULL(&rv); ZVAL_LONG(&ztype, typ); - zend_call_method_with_2_params(zconv, NULL, NULL, "convertfromstring", &rv, zv, &ztype); + php_pq_call_method(zconv, "convertfromstring", 2, &rv, zv, &ztype); zval_ptr_dtor(zv); ZVAL_ZVAL(zv, &rv, 0, 0); @@ -378,11 +378,19 @@ static zend_object_iterator_funcs php_pqres_iterator_funcs = { php_pqres_iterator_rewind, /* invalidate current value/key (optional, may be NULL) */ php_pqres_iterator_invalidate +#if PHP_VERSION_ID >= 80000 + , NULL +#endif }; -static ZEND_RESULT_CODE php_pqres_count_elements(zval *object, long *count) +#if PHP_VERSION_ID >= 80000 +# define php_pqres_count_elements php_pqres_count_elements_80 +#else +# define php_pqres_count_elements php_pqres_count_elements_70 +#endif +static ZEND_RESULT_CODE php_pqres_count_elements_80(zend_object *object, long *count) { - php_pqres_object_t *obj = PHP_PQ_OBJ(object, NULL); + php_pqres_object_t *obj = PHP_PQ_OBJ(NULL, object); if (!obj->intern) { return FAILURE; @@ -391,17 +399,23 @@ static ZEND_RESULT_CODE php_pqres_count_elements(zval *object, long *count) return SUCCESS; } } +static ZEND_RESULT_CODE php_pqres_count_elements_70(zval *object, long *count) +{ + return php_pqres_count_elements_80(Z_OBJ_P(object), count); +} ZEND_RESULT_CODE php_pqres_success(PGresult *res) { - zval zexc; + zval zexc, zsqlstate; switch (PQresultStatus(res)) { case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: case PGRES_FATAL_ERROR: ZVAL_OBJ(&zexc, throw_exce(EX_SQL, "%s", PHP_PQresultErrorMessage(res))); - zend_update_property_string(Z_OBJCE(zexc), &zexc, ZEND_STRL("sqlstate"), PQresultErrorField(res, PG_DIAG_SQLSTATE)); + ZVAL_STRING(&zsqlstate, PQresultErrorField(res, PG_DIAG_SQLSTATE)); + php_pq_update_property(&zexc, "sqlstate", &zsqlstate); + zval_ptr_dtor(&zsqlstate); return FAILURE; default: return SUCCESS; @@ -465,21 +479,21 @@ static zend_object *php_pqres_create_object(zend_class_entry *class_type) return &php_pqres_create_object_ex(class_type, NULL)->zo; } -static void php_pqres_object_read_status(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_status(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(PQresultStatus(obj->intern->res)); } -static void php_pqres_object_read_status_message(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_status_message(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_STRING(PQresStatus(PQresultStatus(obj->intern->res))+sizeof("PGRES")); } -static void php_pqres_object_read_error_message(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_error_message(void *o, zval *return_value) { php_pqres_object_t *obj = o; char *error = PHP_PQresultErrorMessage(obj->intern->res); @@ -491,65 +505,83 @@ static void php_pqres_object_read_error_message(zval *object, void *o, zval *ret } } -static void php_pqres_object_read_diag(zval *object, void *o, zval *return_value) -{ - php_pqres_object_t *obj = o; - int i; - struct { - char code; - const char *const name; - } diag[] = { -#ifdef PG_DIAG_SEVERITY - {PG_DIAG_SEVERITY, "severity"}, +#ifndef PG_DIAG_SEVERITY +# define PG_DIAG_SEVERITY 'S' #endif -#ifdef PG_DIAG_SQLSTATE - {PG_DIAG_SQLSTATE, "sqlstate"}, +#ifndef PG_DIAG_SQLSTATE +# define PG_DIAG_SQLSTATE 'C' #endif -#ifdef PG_DIAG_MESSAGE_PRIMARY - {PG_DIAG_MESSAGE_PRIMARY, "message_primary"}, +#ifndef PG_DIAG_MESSAGE_PRIMARY +# define PG_DIAG_MESSAGE_PRIMARY 'M' #endif -#ifdef PG_DIAG_MESSAGE_DETAIL - {PG_DIAG_MESSAGE_DETAIL, "message_detail"}, +#ifndef PG_DIAG_MESSAGE_DETAIL +# define PG_DIAG_MESSAGE_DETAIL 'D' #endif -#ifdef PG_DIAG_MESSAGE_HINT - {PG_DIAG_MESSAGE_HINT, "message_hint"}, +#ifndef PG_DIAG_MESSAGE_HINT +# define PG_DIAG_MESSAGE_HINT 'H' #endif -#ifdef PG_DIAG_STATEMENT_POSITION - {PG_DIAG_STATEMENT_POSITION,"statement_position"}, +#ifndef PG_DIAG_STATEMENT_POSITION +# define PG_DIAG_STATEMENT_POSITION 'P' #endif -#ifdef PG_DIAG_INTERNAL_POSITION - {PG_DIAG_INTERNAL_POSITION, "internal_position"}, +#ifndef PG_DIAG_INTERNAL_POSITION +# define PG_DIAG_INTERNAL_POSITION 'p' #endif -#ifdef PG_DIAG_INTERNAL_QUERY - {PG_DIAG_INTERNAL_QUERY, "internal_query"}, +#ifndef PG_DIAG_INTERNAL_QUERY +# define PG_DIAG_INTERNAL_QUERY 'q' #endif -#ifdef PG_DIAG_CONTEXT - {PG_DIAG_CONTEXT, "context"}, +#ifndef PG_DIAG_CONTEXT +# define PG_DIAG_CONTEXT 'W' #endif -#ifdef PG_DIAG_SCHEMA_NAME - {PG_DIAG_SCHEMA_NAME, "schema_name"}, +#ifndef PG_DIAG_SCHEMA_NAME +# define PG_DIAG_SCHEMA_NAME 's' #endif -#ifdef PG_DIAG_TABLE_NAME - {PG_DIAG_TABLE_NAME, "table_name"}, +#ifndef PG_DIAG_TABLE_NAME +# define PG_DIAG_TABLE_NAME 't' #endif -#ifdef PG_DIAG_COLUMN_NAME - {PG_DIAG_COLUMN_NAME, "column_name"}, +#ifndef PG_DIAG_COLUMN_NAME +# define PG_DIAG_COLUMN_NAME 'c' #endif -#ifdef PG_DIAG_DATATYPE_NAME - {PG_DIAG_DATATYPE_NAME, "datatype_name"}, +#ifndef PG_DIAG_DATATYPE_NAME +# define PG_DIAG_DATATYPE_NAME 'd' #endif -#ifdef PG_DIAG_CONSTRAINT_NAME - {PG_DIAG_CONSTRAINT_NAME, "constraint_name"}, +#ifndef PG_DIAG_CONSTRAINT_NAME +# define PG_DIAG_CONSTRAINT_NAME 'n' #endif -#ifdef PG_DIAG_SOURCE_FILE - {PG_DIAG_SOURCE_FILE, "source_file"}, +#ifndef PG_DIAG_SOURCE_FILE +# define PG_DIAG_SOURCE_FILE 'F' #endif -#ifdef PG_DIAG_SOURCE_LINE - {PG_DIAG_SOURCE_LINE, "source_line"}, +#ifndef PG_DIAG_SOURCE_LINE +# define PG_DIAG_SOURCE_LINE 'L' #endif -#ifdef PG_DIAG_SOURCE_FUNCTION - {PG_DIAG_SOURCE_FUNCTION, "source_function"}, +#ifndef PG_DIAG_SOURCE_FUNCTION +# define PG_DIAG_SOURCE_FUNCTION 'R' #endif + +static void php_pqres_object_read_diag(void *o, zval *return_value) +{ + php_pqres_object_t *obj = o; + int i; + struct { + char code; + const char *const name; + } diag[] = { + {PG_DIAG_SEVERITY, "severity"}, + {PG_DIAG_SQLSTATE, "sqlstate"}, + {PG_DIAG_MESSAGE_PRIMARY, "message_primary"}, + {PG_DIAG_MESSAGE_DETAIL, "message_detail"}, + {PG_DIAG_MESSAGE_HINT, "message_hint"}, + {PG_DIAG_STATEMENT_POSITION,"statement_position"}, + {PG_DIAG_INTERNAL_POSITION, "internal_position"}, + {PG_DIAG_INTERNAL_QUERY, "internal_query"}, + {PG_DIAG_CONTEXT, "context"}, + {PG_DIAG_SCHEMA_NAME, "schema_name"}, + {PG_DIAG_TABLE_NAME, "table_name"}, + {PG_DIAG_COLUMN_NAME, "column_name"}, + {PG_DIAG_DATATYPE_NAME, "datatype_name"}, + {PG_DIAG_CONSTRAINT_NAME, "constraint_name"}, + {PG_DIAG_SOURCE_FILE, "source_file"}, + {PG_DIAG_SOURCE_LINE, "source_line"}, + {PG_DIAG_SOURCE_FUNCTION, "source_function"}, }; array_init_size(return_value, 32); @@ -564,52 +596,55 @@ static void php_pqres_object_read_diag(zval *object, void *o, zval *return_value } } -static void php_pqres_object_read_num_rows(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_num_rows(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(PQntuples(obj->intern->res)); } -static void php_pqres_object_read_num_cols(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_num_cols(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(PQnfields(obj->intern->res)); } -static void php_pqres_object_read_affected_rows(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_affected_rows(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(atoi(PQcmdTuples(obj->intern->res))); } -static void php_pqres_object_read_fetch_type(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_fetch_type(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(php_pqres_fetch_type(obj->intern)); } -static void php_pqres_object_write_fetch_type(zval *object, void *o, zval *value) +static void php_pqres_object_write_fetch_type(void *o, zval *value) { php_pqres_object_t *obj = o; if (!obj->intern->iter) { - php_pqres_internal_iterator_init(object); + zval object; + + ZVAL_OBJ(&object, &obj->zo); + php_pqres_internal_iterator_init(&object); } obj->intern->iter->fetch_type = zval_get_long(value); } -static void php_pqres_object_read_auto_conv(zval *object, void *o, zval *return_value) +static void php_pqres_object_read_auto_conv(void *o, zval *return_value) { php_pqres_object_t *obj = o; RETVAL_LONG(obj->intern->auto_convert); } -static void php_pqres_object_write_auto_conv(zval *object, void *o, zval *value) +static void php_pqres_object_write_auto_conv(void *o, zval *value) { php_pqres_object_t *obj = o; @@ -1122,7 +1157,7 @@ static PHP_METHOD(pqres, count) { if (SUCCESS == rv) { long count; - if (SUCCESS != php_pqres_count_elements(getThis(), &count)) { + if (SUCCESS != php_pqres_count_elements_70(getThis(), &count)) { throw_exce(EX_UNINITIALIZED, "pq\\Result not initialized"); } else { RETVAL_LONG(count); @@ -1156,6 +1191,28 @@ static PHP_METHOD(pqres, desc) { } } +ZEND_BEGIN_ARG_INFO_EX(ai_pqres_getIterator, 0, 0, 0) +ZEND_END_ARG_INFO(); +static PHP_METHOD(pqres, getIterator) +{ + zend_error_handling zeh; + ZEND_RESULT_CODE rv; + + zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh); + rv = zend_parse_parameters_none(); + zend_restore_error_handling(&zeh); + + if (SUCCESS == rv) { + php_pqres_object_t *obj = PHP_PQ_OBJ(getThis(), NULL); + + if (!obj->intern) { + throw_exce(EX_UNINITIALIZED, "pq\\Result not initialized"); + } else { + zend_create_internal_iterator_zval(return_value, getThis()); + } + } +} + 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) @@ -1166,6 +1223,7 @@ static zend_function_entry php_pqres_methods[] = { 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) + PHP_ME(pqres, getIterator, ai_pqres_getIterator, ZEND_ACC_PUBLIC) {0} }; @@ -1184,7 +1242,7 @@ PHP_MINIT_FUNCTION(pqres) php_pqres_class_entry = zend_register_internal_class_ex(&ce, NULL); php_pqres_class_entry->create_object = php_pqres_create_object; php_pqres_class_entry->get_iterator = php_pqres_iterator_init; - zend_class_implements(php_pqres_class_entry, 2, zend_ce_traversable, spl_ce_Countable); + zend_class_implements(php_pqres_class_entry, 2, zend_ce_aggregate, spl_ce_Countable); memcpy(&php_pqres_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); php_pqres_object_handlers.offset = XtOffsetOf(php_pqres_object_t, zo);