abies           Wed May  5 18:18:35 2004 EDT

  Modified files:              
    /php-src/ext/interbase      ibase_query.c 
  Log:
  Fixed unregistered bug: array count is incorrect when binding array ids
  Fixed unregistered bug: empty numeric/datetime param argument is coerced to
        a string that cannot be handled by the IB API layer
  
  
http://cvs.php.net/diff.php/php-src/ext/interbase/ibase_query.c?r1=1.2&r2=1.3&ty=u
Index: php-src/ext/interbase/ibase_query.c
diff -u php-src/ext/interbase/ibase_query.c:1.2 php-src/ext/interbase/ibase_query.c:1.3
--- php-src/ext/interbase/ibase_query.c:1.2     Tue May  4 08:42:54 2004
+++ php-src/ext/interbase/ibase_query.c Wed May  5 18:18:35 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: ibase_query.c,v 1.2 2004/05/04 12:42:54 abies Exp $ */
+/* $Id: ibase_query.c,v 1.3 2004/05/05 22:18:35 abies Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -615,14 +615,7 @@
 
                var->sqlind = &buf[i].sqlind;
 
-               if (Z_TYPE_P(b_var) == IS_NULL) {
-                       if ((var->sqltype & 1) != 1) {
-                               _php_ibase_module_error("Parameter %d must have a 
value" TSRMLS_CC, i+1);
-                               rv = FAILURE;
-                       }
-                       buf[i].sqlind = -1;
-                       if ((var->sqltype & ~1) == SQL_ARRAY) ++array_cnt;
-               } else {
+               if (Z_TYPE_P(b_var) != IS_NULL) {
                        buf[i].sqlind = 0;
 
                        if (var->sqlscale < 0) {
@@ -630,7 +623,7 @@
                                  DECIMAL or NUMERIC field are stored internally as 
scaled integers.
                                  Coerce it to string and let InterBase's internal 
routines handle it.
                                */
-                               var->sqltype = SQL_TEXT;
+                               goto php_ibase_bind_default;
                        }
 
                        var->sqldata = (void*)&buf[i];
@@ -775,7 +768,7 @@
                                                }
                                        } else {
                                                /* convert the array data into 
something IB can understand */
-                                               ibase_array *ar = 
&ib_query->in_array[array_cnt++];
+                                               ibase_array *ar = 
&ib_query->in_array[array_cnt];
                                                void *array_data = 
emalloc(ar->ar_size);
                                                ISC_QUAD array_id = { 0, 0 };
 
@@ -797,15 +790,32 @@
                                                buf[i].val.qval = array_id;
                                                efree(array_data);
                                        }                               
+                                       ++array_cnt;
                                        break;
-                               default:
 php_ibase_bind_default:
+                                       /* empty strings should be coerced to NULL for 
non-text types */
+                                       if (Z_TYPE_P(b_var) == IS_STRING && 
Z_STRLEN_P(b_var) == 0) {
+                                               ZVAL_NULL(b_var);
+                                               break;
+                                       }
+
+                               default:
                                        convert_to_string(b_var);
                                        var->sqldata = Z_STRVAL_P(b_var);
                                        var->sqllen      = Z_STRLEN_P(b_var);
                                        var->sqltype = SQL_TEXT;
                        } /* switch */
                } /* if */
+
+               if (Z_TYPE_P(b_var) == IS_NULL) {
+                       if (! (var->sqltype & 1)) {
+                               _php_ibase_module_error("Parameter %d must have a 
value" TSRMLS_CC, i+1);
+                               rv = FAILURE;
+                       }
+                       buf[i].sqlind = -1;
+
+                       if (var->sqltype & SQL_ARRAY) ++array_cnt;
+               }
        } /* for */
        return rv;
 }

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

Reply via email to