abies           Sat Aug 16 11:30:25 2003 EDT

  Modified files:              
    /php-src/ext/interbase      interbase.c 
  Log:
  Fixed bug #24224
  Some general cleaning up
  Some preliminary changes for extensions to array functions
  
  
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.145 php-src/ext/interbase/interbase.c:1.146
--- php-src/ext/interbase/interbase.c:1.145     Fri Aug 15 21:58:29 2003
+++ php-src/ext/interbase/interbase.c   Sat Aug 16 11:30:22 2003
@@ -18,64 +18,28 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.145 2003/08/16 01:58:29 abies Exp $ */
-
-/*
-       Changes:
-               2003-08-05: Ard Biesheuvel <[EMAIL PROTECTED]>
-                       - Significant changes to layout of internal data structures
-                         in order to accomodate and carry out the following changes:
-                         * Removal of arbitrary 'transactions-per-link' limit,
-                         * Transactions over multiple databases.
-                       - Leak fixes in ibase_query() and ibase_execute() by replacing
-                         emalloc() with do_alloca()
-                       - Changes to ibase_query() to enable the use of CREATE 
DATABASE ...
-                       - Added ibase_drop_db()
-                       - Added ibase_commit_ret() and ibase_rollback_ret()
-                       - Added ibase_name_result()
-               2001-05-31: Jeremy Bettis <[EMAIL PROTECTED]>
-                       - If a blob handle was expected and something else was
-                         received create a blob and add the value to it.
-                       - If the incoming argument to a bind parameter is NULL
-                         then store a NULL in the database.
-                       - More verbose date errors.
-               1999-09-21:     Ivo Panacek <[EMAIL PROTECTED]>
-                       - added COMPILE_DL section
-                       - more verbose php_info_ibase function
-                         mostly stolen from pgsql.c for now
-               1999-10-05:     Ivo Panacek <[EMAIL PROTECTED]>
-                       - safe rinit/rfinish: check for NULL so
-                         rfinish could be called repeatedly
-                         emalloc & co. replaced with malloc & co.
-*/
+/* $Id: interbase.c,v 1.146 2003/08/16 15:30:22 abies Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include "php.h"
+
+#if HAVE_IBASE
+
 #include "php_ini.h"
 #include "ext/standard/php_standard.h"
-#include "php_globals.h"
 #include "php_interbase.h"
 
-#if HAVE_IBASE
-#include <ibase.h>
+#include <time.h>
 
 #ifndef SQLDA_CURRENT_VERSION
 #define SQLDA_CURRENT_VERSION SQLDA_VERSION1
 #endif
 
-#include <time.h>
-#include "ext/standard/fsock.h"
-#include "ext/standard/info.h"
-
-#ifdef SQL_INT64
-#include <math.h>
-#endif
-
 #ifndef SQL_DIALECT_CURRENT
-#define SQL_DIALECT_CURRENT 1
+#define SQL_DIALECT_CURRENT SQL_DIALECT_V5
 #endif
 
 #ifdef ZEND_DEBUG
@@ -239,7 +203,9 @@
        /* vsnprintf NUL terminates the buf and writes at most n-1 chars+NUL */
        vsnprintf(IBG(errmsg), MAX_ERRMSG, msg, ap);
        va_end(ap);
-       
+
+       IBG(sql_code) = -999; /* no SQL error */
+
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", IBG(errmsg));
 }
 /* }}} */
@@ -655,7 +621,9 @@
        le_event = zend_register_list_destructors_ex(_php_ibase_free_event, NULL, 
"interbase event", module_number);
 
        REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_TEXT, CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_FETCH_BLOBS, CONST_PERSISTENT); 
/* deprecated, for BC only */
+       REGISTER_LONG_CONSTANT("IBASE_FETCH_BLOBS", PHP_IBASE_FETCH_BLOBS, 
CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_FETCH_ARRAYS", PHP_IBASE_FETCH_ARRAYS, 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_UNIXTIME", PHP_IBASE_UNIXTIME, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, 
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_DATE", PHP_IBASE_DATE, CONST_PERSISTENT);
@@ -731,7 +699,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.145 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.146 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "Yes");
 #endif
@@ -1274,11 +1242,11 @@
        }
        
        /* allocate arrays... */
-       if (_php_ibase_alloc_array(&IB_QUERY->in_array, &IB_QUERY->in_array_cnt, 
IB_QUERY->in_sqlda, link, trans TSRMLS_CC) == FAILURE) {
+       if (_php_ibase_alloc_array(&IB_QUERY->in_array, &IB_QUERY->in_array_cnt, 
IB_QUERY->in_sqlda, link->handle, trans->handle TSRMLS_CC) == FAILURE) {
                goto _php_ibase_alloc_query_error; /* error report already done */
        }
        
-       if (_php_ibase_alloc_array(&IB_QUERY->out_array, &IB_QUERY->out_array_cnt, 
IB_QUERY->out_sqlda, link, trans TSRMLS_CC) == FAILURE) {
+       if (_php_ibase_alloc_array(&IB_QUERY->out_array, &IB_QUERY->out_array_cnt, 
IB_QUERY->out_sqlda, link->handle, trans->handle TSRMLS_CC) == FAILURE) {
                goto _php_ibase_alloc_query_error;
        }
 
@@ -1497,16 +1465,10 @@
                                                        return FAILURE;
                                                }
                                                ib_blob_id = ib_blob;
-                                               var->sqldata = (void ISC_FAR *) 
&ib_blob_id->bl_qd;
-/*
-                                               _php_ibase_module_error("Invalid blob 
id string");
-                                               return FAILURE;
-*/
                                        } else {
                                                ib_blob_id = (ibase_blob_handle *) 
Z_STRVAL_P(b_var);
-                                       
-                                               var->sqldata = (void ISC_FAR *) 
&ib_blob_id->bl_qd;
                                        }
+                                       var->sqldata = (void ISC_FAR *) 
&ib_blob_id->bl_qd;
                                }
                        break;
                        case SQL_ARRAY:
@@ -2599,7 +2561,7 @@
                                        _php_ibase_var_zval(tmp, var->sqldata, 
var->sqltype, var->sqllen, var->sqlscale, flag TSRMLS_CC);
                                        break;
                                case SQL_BLOB:
-                                       if (flag & PHP_IBASE_TEXT) { /* text ? */
+                                       if (flag & PHP_IBASE_FETCH_BLOBS) { /* fetch 
blob contents into hash */
                                                int stat;
                                                isc_blob_handle bl_handle = NULL;
                                                ISC_LONG max_len = 0, cur_len = 0;
@@ -2678,25 +2640,31 @@
                                        }
                                        break;
                                case SQL_ARRAY: {
-                                       ISC_QUAD ar_qd = *(ISC_QUAD ISC_FAR *) 
var->sqldata;
-                                       ibase_array *ib_array = 
&ib_result->out_array[arr_cnt];
-                                       void *ar_data;
-                                       char *tmp_ptr;
-                                       
-                                       ar_data = emalloc(ib_array->ar_size);
-                                       
-                                       if (isc_array_get_slice(IB_STATUS, 
&ib_result->link, &ib_result->trans, &ar_qd, &ib_array->ar_desc, ar_data, 
&ib_array->ar_size)) {
-                                               _php_ibase_error(TSRMLS_C);
-                                               efree(ar_data);
-                                               RETURN_FALSE;
-                                       }
-                                       
-                                       tmp_ptr = ar_data; /* avoid changes in 
_arr_zval */
-                                       if (_php_ibase_arr_zval(tmp, &tmp_ptr, 
ib_array, 0, flag TSRMLS_CC) == FAILURE) {
+                                       /* TODO array can be *huge* so only fetch it 
if asked to */
+                                       /* if (flag & PHP_IBASE_FETCH_ARRAYS) { */
+                                               ISC_QUAD ar_qd = *(ISC_QUAD ISC_FAR *) 
var->sqldata;
+                                               ibase_array *ib_array = 
&ib_result->out_array[arr_cnt];
+                                               void *ar_data;
+                                               char *tmp_ptr;
+                                               
+                                               ar_data = emalloc(ib_array->ar_size);
+                                               
+                                               if (isc_array_get_slice(IB_STATUS, 
&ib_result->link, &ib_result->trans, &ar_qd, &ib_array->ar_desc, ar_data, 
&ib_array->ar_size)) {
+                                                       _php_ibase_error(TSRMLS_C);
+                                                       efree(ar_data);
+                                                       RETURN_FALSE;
+                                               }
+                                               
+                                               tmp_ptr = ar_data; /* avoid changes in 
_arr_zval */
+                                               if (_php_ibase_arr_zval(tmp, &tmp_ptr, 
ib_array, 0, flag TSRMLS_CC) == FAILURE) {
+                                                       efree(ar_data);
+                                                       RETURN_FALSE;
+                                               }
                                                efree(ar_data);
-                                               RETURN_FALSE;
-                                       }
-                                       efree(ar_data);
+                                       /*
+                                       } else {
+                                               
+                                       }*/
                                }
                                break;
                                default:
@@ -3116,7 +3084,15 @@
                case SQL_DATE:      s = "DATE"; break;
 #endif
                case SQL_BLOB:      s = "BLOB"; break;
-               case SQL_ARRAY:     s = "ARRAY"; break;
+               case SQL_ARRAY: {
+                               
+                               /* TODO provide more detailed information about the 
field type, field size
+                                  and array dimensions */
+                       
+                               s = "ARRAY"; 
+                               break;
+                       }                       
+
                case SQL_QUAD:      s = "QUAD"; break;
        default:
                sprintf(buf, "unknown (%d)", var->sqltype & ~1);
@@ -3208,6 +3184,10 @@
 #endif
                case SQL_BLOB:      s = "BLOB"; break;
                case SQL_ARRAY:     s = "ARRAY"; break;
+
+                               /* TODO provide more detailed information about the 
field type, field size
+                                  and array dimensions */
+                       
                case SQL_QUAD:      s = "QUAD"; break;
        default:
                sprintf(buf, "unknown (%d)", var->sqltype & ~1);
@@ -3395,7 +3375,8 @@
        zval **blob_arg, **len_arg;
        int stat;
        char *bl_data;
-       unsigned short max_len = 0, cur_len, seg_len;
+       unsigned short seg_len;
+       unsigned long max_len, cur_len;
        ibase_blob_handle *ib_blob;
 
        RESET_ERRMSG;
@@ -3405,7 +3386,7 @@
        }
 
        convert_to_long_ex(len_arg);
-       max_len = (unsigned short) Z_LVAL_PP(len_arg);
+       max_len = Z_LVAL_PP(len_arg);
 
        if (_php_ibase_get_blob_handle(blob_arg, &ib_blob TSRMLS_CC) != SUCCESS) {
                RETURN_FALSE;
@@ -3416,7 +3397,9 @@
                bl_data = emalloc(max_len + 1);
 
                for (cur_len = stat = 0; stat == 0;) {
-                       stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, 
&seg_len, (unsigned short) (max_len-cur_len), &bl_data[cur_len]);
+                       unsigned short next_chunk_size = (max_len-cur_len) > USHRT_MAX 
? USHRT_MAX : (max_len-cur_len);
+
+                       stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, 
&seg_len, next_chunk_size, &bl_data[cur_len]);
                        cur_len += seg_len;
                        if (cur_len > max_len) { /* never!*/
                                efree(bl_data);
@@ -4049,14 +4032,15 @@
        }
 
        /* get a working link */
-       if (Z_TYPE_PP(args[0]) == IS_RESOURCE) {
+       if (Z_TYPE_PP(args[0]) != IS_STRING) {
 
-               ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1, "InterBase 
link", le_link, le_plink);
+               cb_arg = args[1];
                i = 2;
 
+               ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1, "InterBase 
link", le_link, le_plink);
+
                convert_to_long_ex(args[0]);
                link_res_id = Z_LVAL_PP(args[0]);
-               cb_arg = args[1];
 
        } else {
 
@@ -4065,9 +4049,10 @@
                        WRONG_PARAM_COUNT;
                }
 
+               cb_arg = args[0];
+
                ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, 
IBG(default_link), "InterBase link", le_link, le_plink);
                link_res_id = IBG(default_link);
-               cb_arg = args[0];
        }                               
                
        /* get the callback */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to