X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fphp_pqres.c;h=3427b383414ab39d7d430adb0174850aac00229e;hb=cc619cb8b6a15e1ea14bedf713cbcd645a0ee7ca;hp=76518f2b73b1e9c5aa6ae34f7552c339806114ad;hpb=d607a4e70c0684d4b144203dfce40d7d69db6f3f;p=m6w6%2Fext-pq diff --git a/src/php_pqres.c b/src/php_pqres.c index 76518f2..3427b38 100644 --- a/src/php_pqres.c +++ b/src/php_pqres.c @@ -36,16 +36,14 @@ static zend_object_handlers php_pqres_object_handlers; static HashTable php_pqres_object_prophandlers; static zend_object_iterator_funcs php_pqres_iterator_funcs; -static zend_object_iterator *php_pqres_iterator_init(zend_class_entry *ce, zval *object, int by_ref) +static inline zend_object_iterator *php_pqres_iterator_init_ex(zend_class_entry *ce, zval *object, int by_ref) { php_pqres_iterator_t *iter; zval tmp, *zfetch_type; iter = ecalloc(1, sizeof(*iter)); iter->zi.funcs = &php_pqres_iterator_funcs; - ZVAL_COPY(&iter->zi.data, object); - - zend_iterator_init(&iter->zi); + ZVAL_COPY_VALUE(&iter->zi.data, object); zfetch_type = zend_read_property(ce, object, ZEND_STRL("fetchType"), 0, &tmp); iter->fetch_type = zval_get_long(zfetch_type); @@ -55,30 +53,50 @@ static zend_object_iterator *php_pqres_iterator_init(zend_class_entry *ce, zval return (zend_object_iterator *) iter; } +static zend_object_iterator *php_pqres_iterator_init(zend_class_entry *ce, zval *object, int by_ref) +{ + zend_object_iterator *iter = php_pqres_iterator_init_ex(ce, object, by_ref); + + zend_iterator_init(iter); + Z_ADDREF_P(object); + + return iter; +} static void php_pqres_internal_iterator_init(zval *zobj) { php_pqres_object_t *obj = PHP_PQ_OBJ(zobj, NULL); - obj->intern->iter = (php_pqres_iterator_t *) php_pqres_iterator_init(Z_OBJCE_P(zobj), zobj, 0); - /* prevent cyclic dep */ - Z_DELREF_P(zobj); + obj->intern->iter = (php_pqres_iterator_t *) php_pqres_iterator_init_ex(Z_OBJCE_P(zobj), zobj, 0); obj->intern->iter->zi.funcs->rewind((zend_object_iterator *) obj->intern->iter); } -static void php_pqres_iterator_dtor(zend_object_iterator *i) +static inline void php_pqres_iterator_dtor_ex(zend_object_iterator *i) { php_pqres_iterator_t *iter = (php_pqres_iterator_t *) i; #if DBG_GC - fprintf(stderr, "FREE iter(#%d) %p\n", iter->zi.std.handle, iter); + fprintf(stderr, "FREE iter(#%d) rc=%d %p\n", iter->zi.std.handle, GC_REFCOUNT(&iter->zi.std), iter); #endif if (!Z_ISUNDEF(iter->current_val)) { zval_ptr_dtor(&iter->current_val); ZVAL_UNDEF(&iter->current_val); } +} + +static void php_pqres_iterator_dtor(zend_object_iterator *i) +{ + php_pqres_iterator_dtor_ex(i); zval_ptr_dtor(&i->data); - zend_iterator_dtor(i); +} + +static void php_pqres_internal_iterator_dtor(php_pqres_object_t *obj) +{ + if (obj->intern && obj->intern->iter) { + php_pqres_iterator_dtor_ex((zend_object_iterator *) obj->intern->iter); + efree(obj->intern->iter); + obj->intern->iter = NULL; + } } static ZEND_RESULT_CODE php_pqres_iterator_valid(zend_object_iterator *i) @@ -175,14 +193,14 @@ zval *php_pqres_typed_zval(php_pqres_t *res, Oid typ, zval *zv) } php_pqdt_from_string(zv, NULL, str->val, str->len, "Y-m-d", NULL); break; - +#ifdef PHP_PQ_OID_ABSTIME case PHP_PQ_OID_ABSTIME: if (!(res->auto_convert & PHP_PQRES_CONV_DATETIME)) { goto noconversion; } php_pqdt_from_string(zv, NULL, str->val, str->len, "Y-m-d H:i:s", NULL); break; - +#endif case PHP_PQ_OID_TIMESTAMP: if (!(res->auto_convert & PHP_PQRES_CONV_DATETIME)) { goto noconversion; @@ -198,9 +216,9 @@ zval *php_pqres_typed_zval(php_pqres_t *res, Oid typ, zval *zv) break; #if PHP_PQ_HAVE_PHP_JSON_H && defined(PHP_PQ_OID_JSON) -# ifdef PHP_PQ_OID_JSONB +# ifdef PHP_PQ_OID_JSONB case PHP_PQ_OID_JSONB: -# endif +# endif case PHP_PQ_OID_JSON: if (!(res->auto_convert & PHP_PQRES_CONV_JSON)) { goto noconversion; @@ -425,11 +443,7 @@ static void php_pqres_object_free(zend_object *o) obj->intern->res = NULL; } - if (obj->intern->iter) { - ZVAL_NULL(&obj->intern->iter->zi.data); - php_pqres_iterator_dtor((zend_object_iterator *) obj->intern->iter); - obj->intern->iter = NULL; - } + php_pqres_internal_iterator_dtor(obj); zend_hash_destroy(&obj->intern->bound); zend_hash_destroy(&obj->intern->converters); @@ -477,6 +491,58 @@ static void php_pqres_object_read_error_message(zval *object, void *o, zval *ret } } +#ifndef PG_DIAG_SEVERITY +# define PG_DIAG_SEVERITY 'S' +#endif +#ifndef PG_DIAG_SQLSTATE +# define PG_DIAG_SQLSTATE 'C' +#endif +#ifndef PG_DIAG_MESSAGE_PRIMARY +# define PG_DIAG_MESSAGE_PRIMARY 'M' +#endif +#ifndef PG_DIAG_MESSAGE_DETAIL +# define PG_DIAG_MESSAGE_DETAIL 'D' +#endif +#ifndef PG_DIAG_MESSAGE_HINT +# define PG_DIAG_MESSAGE_HINT 'H' +#endif +#ifndef PG_DIAG_STATEMENT_POSITION +# define PG_DIAG_STATEMENT_POSITION 'P' +#endif +#ifndef PG_DIAG_INTERNAL_POSITION +# define PG_DIAG_INTERNAL_POSITION 'p' +#endif +#ifndef PG_DIAG_INTERNAL_QUERY +# define PG_DIAG_INTERNAL_QUERY 'q' +#endif +#ifndef PG_DIAG_CONTEXT +# define PG_DIAG_CONTEXT 'W' +#endif +#ifndef PG_DIAG_SCHEMA_NAME +# define PG_DIAG_SCHEMA_NAME 's' +#endif +#ifndef PG_DIAG_TABLE_NAME +# define PG_DIAG_TABLE_NAME 't' +#endif +#ifndef PG_DIAG_COLUMN_NAME +# define PG_DIAG_COLUMN_NAME 'c' +#endif +#ifndef PG_DIAG_DATATYPE_NAME +# define PG_DIAG_DATATYPE_NAME 'd' +#endif +#ifndef PG_DIAG_CONSTRAINT_NAME +# define PG_DIAG_CONSTRAINT_NAME 'n' +#endif +#ifndef PG_DIAG_SOURCE_FILE +# define PG_DIAG_SOURCE_FILE 'F' +#endif +#ifndef PG_DIAG_SOURCE_LINE +# define PG_DIAG_SOURCE_LINE 'L' +#endif +#ifndef PG_DIAG_SOURCE_FUNCTION +# define PG_DIAG_SOURCE_FUNCTION 'R' +#endif + static void php_pqres_object_read_diag(zval *object, void *o, zval *return_value) { php_pqres_object_t *obj = o; @@ -485,23 +551,23 @@ static void php_pqres_object_read_diag(zval *object, void *o, zval *return_value 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"} + {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); @@ -1144,13 +1210,13 @@ PHP_MINIT_FUNCTION(pqres) php_pqres_object_handlers.read_property = php_pq_object_read_prop; 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_property_ptr_ptr = php_pq_object_get_prop_ptr_null; php_pqres_object_handlers.get_gc = php_pq_object_get_gc; 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, 8, NULL, php_pq_object_prophandler_dtor, 1); + zend_hash_init(&php_pqres_object_prophandlers, 9, NULL, php_pq_object_prophandler_dtor, 1); zend_declare_property_null(php_pqres_class_entry, ZEND_STRL("status"), ZEND_ACC_PUBLIC); ph.read = php_pqres_object_read_status; @@ -1164,15 +1230,11 @@ PHP_MINIT_FUNCTION(pqres) ph.read = php_pqres_object_read_error_message; zend_hash_str_add_mem(&php_pqres_object_prophandlers, "errorMessage", sizeof("errorMessage")-1, (void *) &ph, sizeof(ph)); -<<<<<<< HEAD - zend_declare_property_long(php_pqres_class_entry, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC); -======= - zend_declare_property_null(php_pqres_class_entry, ZEND_STRL("diag"), ZEND_ACC_PUBLIC TSRMLS_CC); + zend_declare_property_null(php_pqres_class_entry, ZEND_STRL("diag"), ZEND_ACC_PUBLIC); ph.read = php_pqres_object_read_diag; - zend_hash_add(&php_pqres_object_prophandlers, "diag", sizeof("diag"), (void *) &ph, sizeof(ph), NULL); + zend_hash_str_add_mem(&php_pqres_object_prophandlers, "diag", sizeof("diag")-1, (void *) &ph, sizeof(ph)); - zend_declare_property_long(php_pqres_class_entry, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC); ->>>>>>> v1.1.x + zend_declare_property_long(php_pqres_class_entry, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC); ph.read = php_pqres_object_read_num_rows; zend_hash_str_add_mem(&php_pqres_object_prophandlers, "numRows", sizeof("numRows")-1, (void *) &ph, sizeof(ph));