]> granicus.if.org Git - php/commitdiff
Fix various bugs in interbase
authorXinchen Hui <laruence@gmail.com>
Fri, 8 Jan 2016 03:19:32 +0000 (11:19 +0800)
committerAnatol Belski <ab@php.net>
Mon, 11 Jan 2016 07:32:47 +0000 (08:32 +0100)
Also read: https://marc.info/?l=php-internals&m=145077389117375&w=2

ext/interbase/ibase_blobs.c
ext/interbase/ibase_events.c
ext/interbase/ibase_query.c
ext/interbase/ibase_service.c
ext/interbase/interbase.c
ext/interbase/php_ibase_includes.h
ext/interbase/tests/bug46543.phpt
ext/interbase/tests/ibase_close_001.phpt
ext/interbase/tests/ibase_trans_001.phpt

index 630b7330e974392cd7f5a4aee844bd93c92b44c7..917210a219b8e24c14beaee5fb5b0f6e3efc99d3 100644 (file)
@@ -36,7 +36,7 @@ static void _php_ibase_free_blob(zend_resource *rsrc) /* {{{ */
 {
        ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr;
 
-       if (ib_blob->bl_handle != NULL) { /* blob open*/
+       if (ib_blob->bl_handle != 0) { /* blob open*/
                if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
                        _php_ibase_module_error("You can lose data. Close any blob after reading from or "
                                "writing to it. Use ibase_blob_close() before calling ibase_close()");
@@ -216,7 +216,7 @@ PHP_FUNCTION(ibase_blob_create)
        PHP_IBASE_LINK_TRANS(link, ib_link, trans);
 
        ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
-       ib_blob->bl_handle = NULL;
+       ib_blob->bl_handle = 0;
        ib_blob->type = BLOB_INPUT;
 
        if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle, &ib_blob->bl_qd)) {
@@ -261,7 +261,7 @@ PHP_FUNCTION(ibase_blob_open)
        PHP_IBASE_LINK_TRANS(link, ib_link, trans);
 
        ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
-       ib_blob->bl_handle = NULL;
+       ib_blob->bl_handle = 0;
        ib_blob->type = BLOB_OUTPUT;
 
        do {
@@ -361,7 +361,7 @@ static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{
                                RETURN_FALSE;
                        }
                }
-               ib_blob->bl_handle = NULL;
+               ib_blob->bl_handle = 0;
 
                RETVAL_NEW_STR(_php_ibase_quad_to_string(ib_blob->bl_qd));
        } else { /* discard created blob */
@@ -369,7 +369,7 @@ static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{
                        _php_ibase_error();
                        RETURN_FALSE;
                }
-               ib_blob->bl_handle = NULL;
+               ib_blob->bl_handle = 0;
                RETVAL_TRUE;
        }
        zend_list_delete(Z_RES_P(blob_arg));
@@ -401,7 +401,7 @@ PHP_FUNCTION(ibase_blob_info)
        zval *link = NULL;
        ibase_db_link *ib_link;
        ibase_trans *trans = NULL;
-       ibase_blob ib_blob = { NULL, BLOB_INPUT };
+       ibase_blob ib_blob = { 0, BLOB_INPUT };
        IBASE_BLOBINFO bl_info;
 
        RESET_ERRMSG;
@@ -477,7 +477,7 @@ PHP_FUNCTION(ibase_blob_echo)
        zval *link = NULL;
        ibase_db_link *ib_link;
        ibase_trans *trans = NULL;
-       ibase_blob ib_blob_id = { NULL, BLOB_OUTPUT  };
+       ibase_blob ib_blob_id = { 0, BLOB_OUTPUT  };
        char bl_data[IBASE_BLOB_SEG];
        unsigned short seg_len;
 
@@ -538,7 +538,7 @@ PHP_FUNCTION(ibase_blob_import)
        zval *link = NULL, *file;
        int size;
        unsigned short b;
-       ibase_blob ib_blob = { NULL, 0 };
+       ibase_blob ib_blob = { 0, 0 };
        ibase_db_link *ib_link;
        ibase_trans *trans = NULL;
        char bl_data[IBASE_BLOB_SEG];
index bac2450d8199812ee593989b01603280f4b14bb2..27844fc73aef7ee83ab4b9a104667c54a43856c8 100644 (file)
@@ -45,7 +45,8 @@ void _php_ibase_free_event(ibase_event *event) /* {{{ */
        if (event->link != NULL) {
                ibase_event **node;
 
-               if (event->link->handle != NULL &&
+               zend_list_delete(event->link_res);
+               if (event->link->handle != 0 &&
                                isc_cancel_events(IB_STATUS, &event->link->handle, &event->event_id)) {
                        _php_ibase_error();
                }
@@ -62,7 +63,9 @@ void _php_ibase_free_event(ibase_event *event) /* {{{ */
                _php_ibase_event_free(event->event_buffer,event->result_buffer);
 
                for (i = 0; i < event->event_count; ++i) {
-                       efree(event->events[i]);
+                       if (event->events[i]) {
+                               efree(event->events[i]);
+                       }
                }
                efree(event->events);
        }
@@ -150,7 +153,7 @@ PHP_FUNCTION(ibase_wait_event)
                if (ZEND_NUM_ARGS() > 15) {
                        WRONG_PARAM_COUNT;
                }
-               if ((ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) {
+               if ((ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) {
                        RETURN_FALSE;
                }
        }
@@ -190,8 +193,6 @@ PHP_FUNCTION(ibase_wait_event)
 static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
        unsigned short buffer_size, char *result_buf)
 {
-       zval *res;
-
        /* this function is called asynchronously by the Interbase client library. */
        TSRMLS_FETCH_FROM_CTX(event->thread_ctx);
 
@@ -211,15 +212,14 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */
                        /* copy the updated results into the result buffer */
                        memcpy(event->result_buffer, result_buf, buffer_size);
 
-                       res = zend_hash_index_find(&EG(regular_list), event->link_res_id);
-                       ZVAL_RES(&args[1], Z_RES_P(res));
+                       ZVAL_RES(&args[1], event->link_res);
 
                        /* find out which event occurred */
                        isc_event_counts(occurred_event, buffer_size, event->event_buffer, event->result_buffer);
                        for (i = 0; i < event->event_count; ++i) {
                                if (occurred_event[i]) {
                                        ZVAL_STRING(&args[0], event->events[i]);
-                                       efree(event->events[i]);
+                                       //efree(event->events[i]);
                                        break;
                                }
                        }
@@ -262,7 +262,8 @@ PHP_FUNCTION(ibase_set_event_handler)
        ibase_db_link *ib_link;
        ibase_event *event;
        unsigned short i = 1, buffer_size;
-       int link_res_id, num_args;
+       int num_args;
+       zend_resource *link_res;
 
        RESET_ERRMSG;
 
@@ -291,8 +292,7 @@ PHP_FUNCTION(ibase_set_event_handler)
                        RETURN_FALSE;
                }
 
-               convert_to_long_ex(&args[0]);
-               link_res_id = Z_LVAL(args[0]);
+               link_res = Z_RES(args[0]);
 
        } else {
                /* callback, event_1 [, ... event_15]
@@ -304,10 +304,10 @@ PHP_FUNCTION(ibase_set_event_handler)
 
                cb_arg = &args[0];
 
-               if ((ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) {
+               if ((ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) {
                        RETURN_FALSE;
                }
-               link_res_id = IBG(default_link);
+               link_res = IBG(default_link);
        }
 
        /* get the callback */
@@ -321,17 +321,22 @@ PHP_FUNCTION(ibase_set_event_handler)
        /* allocate the event resource */
        event = (ibase_event *) safe_emalloc(sizeof(ibase_event), 1, 0);
        TSRMLS_SET_CTX(event->thread_ctx);
-       event->link_res_id = link_res_id;
+       event->link_res = link_res;
+       GC_REFCOUNT(link_res)++;
        event->link = ib_link;
        event->event_count = 0;
        event->state = NEW;
-       event->events = (char **) safe_emalloc(sizeof(char *),ZEND_NUM_ARGS()-i,0);
+       event->events = (char **) safe_emalloc(sizeof(char *), 15, 0);
 
        ZVAL_DUP(&event->callback, cb_arg);
 
-       for (; i < ZEND_NUM_ARGS(); ++i) {
-               convert_to_string_ex(&args[i]);
-               event->events[event->event_count++] = estrdup(Z_STRVAL(args[i]));
+       for (; i < 15; ++i) {
+               if (i < ZEND_NUM_ARGS()) {
+                       convert_to_string_ex(&args[i]);
+                       event->events[event->event_count++] = estrdup(Z_STRVAL(args[i]));
+               } else {
+                       event->events[i] = NULL;
+               }
        }
 
        /* fills the required data structure with information about the events */
index eaf06ed86c50392ab12d7d97440eb697f9486bb0..124a6cd266b939827c6eb958465b0056d9158804 100644 (file)
@@ -59,7 +59,7 @@ typedef struct _ib_query {
        ibase_db_link *link;
        ibase_trans *trans;
        ibase_result *result;
-       int result_res_id;
+       zend_resource *result_res;
        isc_stmt_handle stmt;
        XSQLDA *in_sqlda, *out_sqlda;
        ibase_array *in_array, *out_array;
@@ -67,7 +67,7 @@ typedef struct _ib_query {
        unsigned short dialect;
        char statement_type;
        char *query;
-       long trans_res_id;
+       zend_resource *trans_res;
 } ibase_query;
 
 typedef struct {
@@ -313,7 +313,7 @@ static int _php_ibase_alloc_array(ibase_array **ib_arrayp, XSQLDA *sqlda, /* {{{
 
 /* allocate and prepare query */
 static int _php_ibase_alloc_query(ibase_query *ib_query, ibase_db_link *link, /* {{{ */
-       ibase_trans *trans, char *query, unsigned short dialect, int trans_res_id)
+       ibase_trans *trans, char *query, unsigned short dialect, zend_resource *trans_res)
 {
        static char info_type[] = {isc_info_sql_stmt_type};
        char result[8];
@@ -326,14 +326,14 @@ static int _php_ibase_alloc_query(ibase_query *ib_query, ibase_db_link *link, /*
 
        ib_query->link = link;
        ib_query->trans = trans;
-       ib_query->result_res_id = 0;
+       ib_query->result_res = NULL;
        ib_query->result = NULL;
-       ib_query->stmt = NULL;
+       ib_query->stmt = 0;
        ib_query->in_array = NULL;
        ib_query->out_array = NULL;
        ib_query->dialect = dialect;
        ib_query->query = estrdup(query);
-       ib_query->trans_res_id = trans_res_id;
+       ib_query->trans_res = trans_res;
        ib_query->out_sqlda = NULL;
        ib_query->in_sqlda = NULL;
 
@@ -530,8 +530,12 @@ static int _php_ibase_bind_array(zval *val, char *buf, unsigned long buf_size, /
                        struct tm t = { 0, 0, 0, 0, 0, 0 };
 
                        switch (array->el_type) {
+#ifndef HAVE_STRFTIME
                                unsigned short n;
+#endif
+#if (SIZEOF_LONG < 8)
                                ISC_INT64 l;
+#endif
 
                                case SQL_SHORT:
                                        convert_to_long(val);
@@ -737,7 +741,7 @@ static int _php_ibase_bind(XSQLDA *sqlda, zval *b_vars, BIND_BUF *buf, /* {{{ */
                                if (Z_STRLEN_P(b_var) != BLOB_ID_LEN ||
                                        !_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &buf[i].val.qval)) {
 
-                                       ibase_blob ib_blob = { NULL, BLOB_INPUT };
+                                       ibase_blob ib_blob = { 0, BLOB_INPUT };
 
                                        if (isc_create_blob(IB_STATUS, &ib_query->link->handle,
                                                        &ib_query->trans->handle, &ib_blob.bl_handle, &ib_blob.bl_qd)) {
@@ -883,7 +887,7 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul
                case isc_info_sql_stmt_start_trans:
 
                        /* a SET TRANSACTION statement should be executed with a NULL trans handle */
-                       tr = NULL;
+                       tr = 0;
 
                        if (isc_dsql_execute_immediate(IB_STATUS, &ib_query->link->handle, &tr, 0,
                                        ib_query->query, ib_query->dialect, NULL)) {
@@ -923,11 +927,11 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul
                                goto _php_ibase_exec_error;
                        }
 
-                       if (ib_query->trans->handle == NULL && ib_query->trans_res_id != 0) {
+                       if (ib_query->trans->handle == 0 && ib_query->trans_res != NULL) {
                                /* transaction was released by the query and was a registered resource,
                                   so we have to release it */
-                               zval *res = zend_hash_index_find(&EG(regular_list), ib_query->trans_res_id);
-                               zend_list_delete(Z_RES_P(res));
+                               zend_list_delete(ib_query->trans_res);
+                               ib_query->trans_res = NULL;
                        }
 
                        RETVAL_TRUE;
@@ -1063,7 +1067,7 @@ PHP_FUNCTION(ibase_query)
        char *query;
        size_t query_len;
        int bind_i, bind_num;
-       long trans_res_id = 0;
+       zend_resource *trans_res = NULL;
        ibase_db_link *ib_link = NULL;
        ibase_trans *trans = NULL;
        ibase_query ib_query = { NULL, NULL, 0, 0 };
@@ -1083,7 +1087,7 @@ PHP_FUNCTION(ibase_query)
                                ib_link = (ibase_db_link*)zend_fetch_resource2_ex(zlink, LE_LINK, le_link, le_plink);
                                trans = (ibase_trans*)zend_fetch_resource_ex(ztrans, LE_TRANS,  le_trans);
 
-                               trans_res_id = Z_RES_P(ztrans)->handle;
+                               trans_res = Z_RES_P(ztrans);
                                bind_i = 3;
                                break;
                    }
@@ -1093,7 +1097,7 @@ PHP_FUNCTION(ibase_query)
                                _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zlink, &ib_link, &trans);
 
                                if (trans != NULL) {
-                                       trans_res_id = Z_RES_P(zlink)->handle;
+                                       trans_res = Z_RES_P(zlink);
                                }
                                bind_i = 2;
                                break;
@@ -1102,8 +1106,8 @@ PHP_FUNCTION(ibase_query)
                        /* the statement is 'CREATE DATABASE ...' if the link argument is IBASE_CREATE */
                        if (SUCCESS == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(),
                                         "ls", &l, &query, &query_len) && l == PHP_IBASE_CREATE) {
-                               isc_db_handle db = NULL;
-                               isc_tr_handle trans = NULL;
+                               isc_db_handle db = 0;
+                               isc_tr_handle trans = 0;
 
                                if (PG(sql_safe_mode)) {
                                        _php_ibase_module_error("CREATE DATABASE is not allowed in SQL safe mode"
@@ -1133,8 +1137,8 @@ PHP_FUNCTION(ibase_query)
 
                                        RETVAL_RES(zend_register_resource(ib_link, le_link));
                                        Z_TRY_ADDREF_P(return_value);
-                                       IBG(default_link) = Z_RES_P(return_value)->handle;
-                                       ++IBG(num_links);
+                                       Z_TRY_ADDREF_P(return_value);
+                                       IBG(default_link) = Z_RES_P(return_value);
                                }
                                return;
                        }
@@ -1142,8 +1146,7 @@ PHP_FUNCTION(ibase_query)
                case 0:
                        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() ? 1 : 0, "s", &query,
                                        &query_len)) {
-                               ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK,
-                               le_link, le_plink);
+                               ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink);
 
                                bind_i = 1;
                                break;
@@ -1153,8 +1156,7 @@ PHP_FUNCTION(ibase_query)
 
        /* open default transaction */
        if (ib_link == NULL || FAILURE == _php_ibase_def_trans(ib_link, &trans)
-                       || FAILURE == _php_ibase_alloc_query(&ib_query, ib_link, trans, query, ib_link->dialect,
-                               trans_res_id)) {
+                       || FAILURE == _php_ibase_alloc_query(&ib_query, ib_link, trans, query, ib_link->dialect, trans_res)) {
                return;
        }
 
@@ -1184,7 +1186,7 @@ PHP_FUNCTION(ibase_query)
 
                        /* EXECUTE PROCEDURE returns only one row => statement can be released immediately */
                        if (ib_query.statement_type != isc_info_sql_stmt_exec_procedure) {
-                               ib_query.stmt = NULL; /* keep stmt when free query */
+                               ib_query.stmt = 0; /* keep stmt when free query */
                        }
                        RETVAL_RES(zend_register_resource(result, le_result));
                        Z_TRY_ADDREF_P(return_value);
@@ -1211,7 +1213,7 @@ PHP_FUNCTION(ibase_affected_rows)
        }
 
        if (!arg) {
-               ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink);
+               ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink);
                if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) {
                        RETURN_FALSE;
                }
@@ -1549,7 +1551,7 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type)
                                                char bl_info[20];
                                                unsigned short i;
 
-                                               blob_handle.bl_handle = NULL;
+                                               blob_handle.bl_handle = 0;
                                                blob_handle.bl_qd = *(ISC_QUAD *) var->sqldata;
 
                                                if (isc_open_blob(IB_STATUS, &ib_result->link->handle, &ib_result->trans->handle,
@@ -1599,7 +1601,6 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type)
                                                }
 
                                        } else { /* blob id only */
-                                               char *s;
                                                ISC_QUAD bl_qd = *(ISC_QUAD *) var->sqldata;
                                                ZVAL_NEW_STR(&result, _php_ibase_quad_to_string(bl_qd));
                                        }
@@ -1732,7 +1733,8 @@ PHP_FUNCTION(ibase_prepare)
        zval *link_arg, *trans_arg;
        ibase_db_link *ib_link;
        ibase_trans *trans = NULL;
-       size_t query_len, trans_res_id = 0;
+       size_t query_len;
+       zend_resource *trans_res = NULL;
        ibase_query *ib_query;
        char *query;
 
@@ -1742,7 +1744,7 @@ PHP_FUNCTION(ibase_prepare)
                if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &query, &query_len) == FAILURE) {
                        return;
                }
-               ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink);
+               ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink);
        } else if (ZEND_NUM_ARGS() == 2) {
                if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &link_arg, &query, &query_len) == FAILURE) {
                        return;
@@ -1750,7 +1752,7 @@ PHP_FUNCTION(ibase_prepare)
                _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans);
 
                if (trans != NULL) {
-                       trans_res_id = Z_RES_P(link_arg)->handle;
+                       trans_res = Z_RES_P(link_arg);
                }
        } else {
                if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs", &link_arg, &trans_arg, &query, &query_len) == FAILURE) {
@@ -1758,7 +1760,7 @@ PHP_FUNCTION(ibase_prepare)
                }
                ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink);
                trans = (ibase_trans *)zend_fetch_resource_ex(trans_arg, LE_TRANS, le_trans);
-               trans_res_id = Z_RES_P(trans_arg)->handle;
+               trans_res = Z_RES_P(trans_arg);
        }
 
        if (FAILURE == _php_ibase_def_trans(ib_link, &trans)) {
@@ -1767,7 +1769,7 @@ PHP_FUNCTION(ibase_prepare)
 
        ib_query = (ibase_query *) emalloc(sizeof(ibase_query));
 
-       if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, trans_res_id)) {
+       if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, trans_res)) {
                efree(ib_query);
                RETURN_FALSE;
        }
@@ -1808,21 +1810,16 @@ PHP_FUNCTION(ibase_execute)
                }
 
                /* Have we used this cursor before and it's still open (exec proc has no cursor) ? */
-               if (ib_query->result_res_id != 0
+               if (ib_query->result_res != NULL
                                && ib_query->statement_type != isc_info_sql_stmt_exec_procedure) {
-                       zval *res;
-
                        IBDEBUG("Implicitly closing a cursor");
 
                        if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_close)) {
                                _php_ibase_error();
                                break;
                        }
-                       /* invalidate previous results returned by this query (not necessary for exec proc) */
-                       res = zend_hash_index_find(&EG(regular_list), ib_query->result_res_id);
-                       if (res) {
-                               zend_list_delete(Z_RES_P(res));
-                       }
+                       zend_list_delete(ib_query->result_res);
+                       ib_query->result_res = NULL;
                }
 
                if (FAILURE == _php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &result, ib_query,
@@ -1831,7 +1828,7 @@ PHP_FUNCTION(ibase_execute)
                }
 
                /* free the query if trans handle was released */
-               if (ib_query->trans->handle == NULL) {
+               if (ib_query->trans->handle == 0) {
                        zend_list_delete(Z_RES_P(query));
                }
 
@@ -1840,11 +1837,11 @@ PHP_FUNCTION(ibase_execute)
 
                        result->type = EXECUTE_RESULT;
                        if (ib_query->statement_type == isc_info_sql_stmt_exec_procedure) {
-                               result->stmt = NULL;
+                               result->stmt = 0;
                        }
 
                        ret = zend_list_insert(result, le_result);
-                       ib_query->result_res_id = Z_RES_HANDLE_P(ret);
+                       ib_query->result_res = Z_RES_P(ret);
                        ZVAL_COPY_VALUE(return_value, ret);
                        Z_TRY_ADDREF_P(return_value);
                        Z_TRY_ADDREF_P(return_value);
@@ -1867,6 +1864,10 @@ PHP_FUNCTION(ibase_free_query)
        }
 
        ib_query = (ibase_query *)zend_fetch_resource_ex(query_arg, LE_QUERY, le_query);
+       if (!ib_query) {
+               RETURN_FALSE;
+       }
+
        zend_list_close(Z_RES_P(query_arg));
        RETURN_TRUE;
 }
index c1b1268cd007fc7c01838639af7d40ac7538a6d1..cd43724f00a29b3811a235904ad78a58420a4507 100644 (file)
@@ -210,7 +210,7 @@ PHP_FUNCTION(ibase_service_attach)
        size_t hlen, ulen, plen, spb_len;
        ibase_service *svm;
        char buf[128], *host, *user, *pass, *loc;
-       isc_svc_handle handle = NULL;
+       isc_svc_handle handle = 0;
 
        RESET_ERRMSG;
 
index 1eece4c00002c3b27da3ae39a348bb3ad89e9f7e..76c29daeb889c72edd9c5a91864883bd2477aee4 100644 (file)
@@ -41,7 +41,7 @@
 #define COMMIT                 1
 #define RETAIN                 2
 
-#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
+#define CHECK_LINK(link) { if (link==NULL) { php_error_docref(NULL, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
 
 ZEND_DECLARE_MODULE_GLOBALS(ibase)
 static PHP_GINIT_FUNCTION(ibase);
@@ -580,9 +580,9 @@ static void _php_ibase_commit_link(ibase_db_link *link) /* {{{ */
 
        for (l = link->tr_list; l != NULL; ++i) {
                ibase_tr_list *p = l;
-               if (p->trans != NULL) {
+               if (p->trans != 0) {
                        if (i == 0) {
-                               if (p->trans->handle != NULL) {
+                               if (p->trans->handle != 0) {
                                        IBDEBUG("Committing default transaction...");
                                        if (isc_commit_transaction(IB_STATUS, &p->trans->handle)) {
                                                _php_ibase_error();
@@ -590,7 +590,7 @@ static void _php_ibase_commit_link(ibase_db_link *link) /* {{{ */
                                }
                                efree(p->trans); /* default transaction is not a registered resource: clean up */
                        } else {
-                               if (p->trans->handle != NULL) {
+                               if (p->trans->handle != 0) {
                                        /* non-default trans might have been rolled back by other call of this dtor */
                                        IBDEBUG("Rolling back other transactions...");
                                        if (isc_rollback_transaction(IB_STATUS, &p->trans->handle)) {
@@ -632,7 +632,7 @@ static void _php_ibase_close_link(zend_resource *rsrc) /* {{{ */
        ibase_db_link *link = (ibase_db_link *) rsrc->ptr;
 
        _php_ibase_commit_link(link);
-       if (link->handle != NULL) {
+       if (link->handle != 0) {
                IBDEBUG("Closing normal link...");
                isc_detach_database(IB_STATUS, &link->handle);
        }
@@ -647,7 +647,7 @@ static void _php_ibase_close_plink(zend_resource *rsrc) /* {{{ */
 
        _php_ibase_commit_link(link);
        IBDEBUG("Closing permanent link...");
-       if (link->handle != NULL) {
+       if (link->handle != 0) {
                isc_detach_database(IB_STATUS, &link->handle);
        }
        IBG(num_persistent)--;
@@ -662,7 +662,7 @@ static void _php_ibase_free_trans(zend_resource *rsrc) /* {{{ */
        unsigned short i;
 
        IBDEBUG("Cleaning up transaction resource...");
-       if (trans->handle != NULL) {
+       if (trans->handle != 0) {
                IBDEBUG("Rolling back unhandled transaction...");
                if (isc_rollback_transaction(IB_STATUS, &trans->handle)) {
                        _php_ibase_error();
@@ -719,7 +719,7 @@ static PHP_GINIT_FUNCTION(ibase)
 {
        ibase_globals->num_persistent = ibase_globals->num_links = 0;
        ibase_globals->sql_code = *ibase_globals->errmsg = 0;
-       ibase_globals->default_link = -1;
+       ibase_globals->default_link = NULL;
 }
 
 PHP_MINIT_FUNCTION(ibase)
@@ -774,7 +774,7 @@ PHP_MSHUTDOWN_FUNCTION(ibase)
        zend_module_entry *ibase_entry;
        if ((ibase_entry = zend_hash_str_find_ptr(&module_registry, ibase_module_entry.name,
                        strlen(ibase_module_entry.name))) != NULL) {
-               ibase_entry->handle = NULL;
+               ibase_entry->handle = 0;
        }
 #endif
        UNREGISTER_INI_ENTRIES();
@@ -784,7 +784,7 @@ PHP_MSHUTDOWN_FUNCTION(ibase)
 PHP_RSHUTDOWN_FUNCTION(ibase)
 {
        IBG(num_links) = IBG(num_persistent);
-       IBG(default_link)= -1;
+       IBG(default_link)= NULL;
 
        RESET_ERRMSG;
 
@@ -842,7 +842,7 @@ static char const dpb_args[] = {
        0, isc_dpb_user_name, isc_dpb_password, isc_dpb_lc_ctype, isc_dpb_sql_role_name, 0
 };
 
-int _php_ibase_attach_db(char **args, int *len, long *largs, isc_db_handle *db)
+int _php_ibase_attach_db(char **args, int *len, long *largs, isc_db_handle *db) /* {{{ */
 {
        short i, dpb_len, buf_len = 257-2;  /* version byte at the front, and a null at the end */
        char dpb_buffer[257] = { isc_dpb_version1, 0 }, *dpb;
@@ -882,7 +882,7 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /*
        long largs[] = { 0, 0, 0 };
        PHP_MD5_CTX hash_context;
        zend_resource new_index_ptr, *le;
-       isc_db_handle db_handle = NULL;
+       isc_db_handle db_handle = 0;
        ibase_db_link *ib_link;
 
        RESET_ERRMSG;
@@ -932,15 +932,12 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /*
 
                xlink = (zend_resource*) le->ptr;
                if ((!persistent && xlink->type == le_link) || xlink->type == le_plink) {
-                       if (IBG(default_link) > 0) {
-                               zval *link = zend_hash_index_find(&EG(regular_list), IBG(default_link));
-                               if (link) {
-                                       zend_list_delete(Z_RES_P(link));
-                               }
+                       if (IBG(default_link)) {
+                               zend_list_close(IBG(default_link));
                        }
                        xlink->gc.refcount++;
                        xlink->gc.refcount++;
-                       IBG(default_link) = xlink->handle;
+                       IBG(default_link) = xlink;
                        RETVAL_RES(xlink);
                } else {
                        zend_hash_str_del(&EG(regular_list), hash, sizeof(hash)-1);
@@ -1017,13 +1014,10 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /*
                        (void *) &new_index_ptr, sizeof(zend_resource)) == NULL) {
                RETURN_FALSE;
        }
-       if (IBG(default_link) > 0) {
-               zval *link = zend_hash_index_find(&EG(regular_list), IBG(default_link));
-               if (link) {
-                       zend_list_delete(Z_RES_P(link));
-               }
+       if (IBG(default_link)) {
+               zend_list_delete(IBG(default_link));
        }
-       IBG(default_link) = Z_RES_P(return_value)->handle;
+       IBG(default_link) = Z_RES_P(return_value);
        Z_TRY_ADDREF_P(return_value);
        Z_TRY_ADDREF_P(return_value);
 }
@@ -1050,8 +1044,7 @@ PHP_FUNCTION(ibase_pconnect)
 PHP_FUNCTION(ibase_close)
 {
        zval *link_arg = NULL;
-       ibase_db_link *ib_link;
-       int link_id;
+       zend_resource *link_res;
 
        RESET_ERRMSG;
 
@@ -1060,23 +1053,18 @@ PHP_FUNCTION(ibase_close)
        }
 
        if (ZEND_NUM_ARGS() == 0) {
-               link_id = IBG(default_link);
-               CHECK_LINK(link_id);
-               IBG(default_link) = -1;
+               link_res = IBG(default_link);
+               CHECK_LINK(link_res);
+               IBG(default_link) = NULL;
        } else {
-               link_id = Z_RES_P(link_arg)->handle;
+               link_res = Z_RES_P(link_arg);
        }
 
-       ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink);
-       if (!link_arg) {
-               link_arg = zend_hash_index_find(&EG(regular_list), link_id);
-               zend_list_delete(Z_RES_P(link_arg));
-    }
        /* we have at least 3 additional references to this resource ??? */
-       if (GC_REFCOUNT(Z_RES_P(link_arg)) < 4) {
-               zend_list_close(Z_RES_P(link_arg));
+       if (GC_REFCOUNT(link_res) < 4) {
+               zend_list_close(link_res);
        } else {
-               zend_list_delete(Z_RES_P(link_arg));
+               zend_list_delete(link_res);
        }
        RETURN_TRUE;
 }
@@ -1089,7 +1077,7 @@ PHP_FUNCTION(ibase_drop_db)
        zval *link_arg = NULL;
        ibase_db_link *ib_link;
        ibase_tr_list *l;
-       int link_id;
+       zend_resource *link_res;
 
        RESET_ERRMSG;
 
@@ -1098,14 +1086,18 @@ PHP_FUNCTION(ibase_drop_db)
        }
 
        if (ZEND_NUM_ARGS() == 0) {
-               link_id = IBG(default_link);
-               CHECK_LINK(link_id);
-               IBG(default_link) = -1;
+               link_res = IBG(default_link);
+               CHECK_LINK(link_res);
+               IBG(default_link) = NULL;
        } else {
-               link_id = Z_RES_P(link_arg)->handle;
+               link_res = Z_RES_P(link_arg);
        }
 
-       ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink);
+       ib_link = (ibase_db_link *)zend_fetch_resource2(link_res, LE_LINK, le_link, le_plink);
+
+       if (!ib_link) {
+               RETURN_FALSE;
+       }
 
        if (isc_drop_database(IB_STATUS, &ib_link->handle)) {
                _php_ibase_error();
@@ -1114,14 +1106,11 @@ PHP_FUNCTION(ibase_drop_db)
 
        /* isc_drop_database() doesn't invalidate the transaction handles */
        for (l = ib_link->tr_list; l != NULL; l = l->next) {
-               if (l->trans != NULL) l->trans->handle = NULL;
+               if (l->trans != NULL) l->trans->handle = 0;
        }
 
-       if (!link_arg) {
-               link_arg = zend_hash_index_find(&EG(regular_list), link_id);
-               zend_list_delete(Z_RES_P(link_arg));
-    }
-       zend_list_delete(Z_RES_P(link_arg));
+       zend_list_delete(link_res);
+
        RETURN_TRUE;
 }
 /* }}} */
@@ -1138,7 +1127,7 @@ PHP_FUNCTION(ibase_trans)
        char last_tpb[TPB_MAX_SIZE];
        ibase_db_link **ib_link = NULL;
        ibase_trans *ib_trans;
-       isc_tr_handle tr_handle = NULL;
+       isc_tr_handle tr_handle = 0;
        ISC_STATUS result;
 
        RESET_ERRMSG;
@@ -1236,7 +1225,7 @@ PHP_FUNCTION(ibase_trans)
 
        if (link_cnt == 0) {
                link_cnt = 1;
-               if ((ib_link[0] = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink)) == NULL) {
+               if ((ib_link[0] = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink)) == NULL) {
                        efree(ib_link);
                        RETURN_FALSE;
                }
@@ -1297,13 +1286,13 @@ int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans) /* {{{ */
 
                if (tr == NULL) {
                        tr = (ibase_trans *) emalloc(sizeof(ibase_trans));
-                       tr->handle = NULL;
+                       tr->handle = 0;
                        tr->link_cnt = 1;
                        tr->affected_rows = 0;
                        tr->db_link[0] = ib_link;
                        ib_link->tr_list->trans = tr;
                }
-               if (tr->handle == NULL) {
+               if (tr->handle == 0) {
                        if (isc_start_transaction(IB_STATUS, &tr->handle, 1, &ib_link->handle, 0, NULL)) {
                                _php_ibase_error();
                                return FAILURE;
@@ -1330,7 +1319,7 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) /* {{
        }
 
        if (ZEND_NUM_ARGS() == 0) {
-               ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink);
+               ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink);
                if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) {
                        /* this link doesn't have a default transaction */
                        _php_ibase_module_error("Default link has no default transaction");
index b7fb0a340fa44c02dfac17bd17a6568fa3fdde8e..fbbf7e34ce4d5102c95b6804990ccbaa7149234a 100644 (file)
@@ -60,7 +60,7 @@ extern int le_link, le_plink, le_trans;
 
 ZEND_BEGIN_MODULE_GLOBALS(ibase)
        ISC_STATUS status[20];
-       long default_link;
+       zend_resource *default_link;
        long num_links, num_persistent;
        char errmsg[MAX_ERRMSG];
        long sql_code;
@@ -95,7 +95,7 @@ typedef struct {
 
 typedef struct event {
        ibase_db_link *link;
-       long link_res_id;
+       zend_resource* link_res;
        ISC_LONG event_id;
        unsigned short event_count;
        char **events;
@@ -155,13 +155,15 @@ void _php_ibase_module_error(char *, ...)
 
 /* determine if a resource is a link or transaction handle */
 #define PHP_IBASE_LINK_TRANS(zv, lh, th)                                                                                                       \
-       do { if (!zv) {                                                                                                                                                 \
-                       lh = (ibase_db_link *)zend_fetch_resource2(IBG(default_link),                           \
-                               "InterBase link", le_link, le_plink); }                                                                         \
-               else                                                                                                                                                            \
-                       _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zv, &lh, &th);              \
-               if (SUCCESS != _php_ibase_def_trans(lh, &th)) { RETURN_FALSE; }                 \
-       } while (0)
+               do {                                                                                \
+                       if (!zv) {                                                                      \
+                               lh = (ibase_db_link *)zend_fetch_resource2(                                 \
+                                               IBG(default_link), "InterBase link", le_link, le_plink);            \
+                       } else {                                                                        \
+                               _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zv, &lh, &th);  \
+                       }                                                                               \
+                       if (SUCCESS != _php_ibase_def_trans(lh, &th)) { RETURN_FALSE; }                 \
+               } while (0)
 
 int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans);
 void _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval *link_id,
index 59e088c3d0440d6e966a33db7522db10443e635d..88f38a6bd16e6c603068b0a033135a1d3ed1cbf7 100644 (file)
@@ -19,10 +19,10 @@ ibase_trans(1, 2, $x, $x, 3);
 
 ?>
 --EXPECTF--
-Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d
+Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d
 
-Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d
+Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d
 
-Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d
+Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d
 
-Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d
+Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d
index f74d109109f5a0e39b015931395c30d9c0425ad4..cb91e8a75a41f3eb6633d85e33e9239ea100d4f7 100644 (file)
@@ -17,9 +17,7 @@ var_dump(ibase_close('foo'));
 --EXPECTF--
 bool(true)
 bool(true)
-
-Warning: ibase_close(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d
-bool(false)
+bool(true)
 
 Warning: ibase_close() expects parameter 1 to be resource,%string given in %s on line %d
 NULL
index d8b7c81a1bae8b6d557b913b128b92138f65e869..cceb60e9a1df10e4add9af1154384251ce5f4f57 100644 (file)
@@ -18,6 +18,4 @@ var_dump(ibase_close($x));
 resource(%d) of type (Firebird/InterBase transaction)
 resource(%d) of type (Firebird/InterBase transaction)
 bool(true)
-
-Warning: ibase_close(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d
-bool(false)
+bool(true)