daniela         Mon Jun  2 08:37:16 2003 EDT

  Modified files:              
    /php4/ext/interbase interbase.c 
    /php4/ext/interbase/tests   003.phpt 
  Log:
  Fixed numeric/decimal +/-(x,y) +/-(x,0)
  for all platforms 
  
  
Index: php4/ext/interbase/interbase.c
diff -u php4/ext/interbase/interbase.c:1.105 php4/ext/interbase/interbase.c:1.106
--- php4/ext/interbase/interbase.c:1.105        Wed May 14 04:22:54 2003
+++ php4/ext/interbase/interbase.c      Mon Jun  2 08:37:16 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.105 2003/05/14 08:22:54 daniela Exp $ */
+/* $Id: interbase.c,v 1.106 2003/06/02 12:37:16 daniela Exp $ */
 
 
 /* TODO: Arrays, roles?
@@ -622,7 +622,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.105 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.106 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "yes");
 #endif
@@ -1781,25 +1781,36 @@
                        Z_STRLEN_P(val) = len;
                        break;
                case SQL_LONG:
+               case SQL_SHORT:
                        if (scale) {
-                               int j, f = 1;
-                               float n = (float) *(long *) (data);
-                               
+                               short j;
+                               long n, f = 1;
+                               if ( (type & ~1) == SQL_SHORT) {
+                                       n = (long) *(short *) (data);
+                               }else { 
+                                       n = (long) *(long *) (data);
+                               }
                                for (j = 0; j < -scale; j++) {
                                        f *= 10;
                                }
+                               if (n  >= 0){
+                                       Z_STRLEN_P(val) = sprintf (string_data, 
"%ld.%0*ld", n / f, -scale,  n % f );
+                               }else if ((n/f) != 0 ){
+                                       Z_STRLEN_P(val) = sprintf (string_data, 
"%ld.%0*ld", n / f, -scale,  -(n % f) );
+                               }else{
+                                       Z_STRLEN_P(val) = sprintf (string_data, 
"%s.%0*ld","-0", -scale, -(n % f) );
+                               }
                                Z_TYPE_P(val) = IS_STRING;
-                               Z_STRLEN_P(val) = sprintf(string_data, "%.*f", -scale, 
n / f);
                                Z_STRVAL_P(val) = estrdup(string_data);
                        } else {
                                Z_TYPE_P(val) = IS_LONG;
-                               Z_LVAL_P(val) = *(long *) (data);
+                               if ( (type & ~1) == SQL_SHORT) {
+                                       Z_LVAL_P(val) = *(short *) (data);
+                               }else{
+                                       Z_LVAL_P(val) = *(long *) (data);
+                               }
                        }
                        break;
-               case SQL_SHORT:
-                       Z_TYPE_P(val) = IS_LONG;
-                       Z_LVAL_P(val) = *(short *) (data);
-                       break;
                case SQL_FLOAT:
                        Z_TYPE_P(val) = IS_DOUBLE;
                        Z_DVAL_P(val) = *(float *) (data);
@@ -1817,16 +1828,23 @@
 #ifdef SQL_INT64
                case SQL_INT64:
                        Z_TYPE_P(val) = IS_STRING;
-
-                       if (scale) {
-                               int j, f = 1;
-                               double number = (double) ((ISC_INT64) (*((ISC_INT64 *) 
data)));
-                               char dt[20];
+                       if (scale < 0 ){
+                               short j = 0;
+                               ISC_INT64 n, f = 1;
+                               n = (ISC_INT64) *(ISC_INT64 *) data;
                                for (j = 0; j < -scale; j++) {
                                        f *= 10;
                                }
-                               sprintf(dt, "%%0.%df", -scale);
-                               Z_STRLEN_P(val) = sprintf (string_data, dt, number / 
f);
+                               if ( n >= 0){
+                               Z_STRLEN_P(val) = sprintf (string_data, "%" 
ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d",
+                                                                                      
 (ISC_INT64) n / f, -scale, (ISC_INT64) n % f );
+                               }else if ((n/f) != 0 ){
+                               Z_STRLEN_P(val) = sprintf (string_data, "%" 
ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d",
+                                                                                      
 (ISC_INT64) n / f, -scale, (ISC_INT64) -(n % f) );
+                               }else{
+                               Z_STRLEN_P(val) = sprintf (string_data, "%s.%0*" 
ISC_INT64_FORMAT "d",
+                                                                                      
 "-0", -scale, (ISC_INT64) -(n % f) );
+                               }
                        } else {
                                Z_STRLEN_P(val) =sprintf (string_data, "%.0" 
ISC_INT64_FORMAT "d",
                                                                                       
     (ISC_INT64) *(ISC_INT64 *) data);
Index: php4/ext/interbase/tests/003.phpt
diff -u php4/ext/interbase/tests/003.phpt:1.3 php4/ext/interbase/tests/003.phpt:1.4
--- php4/ext/interbase/tests/003.phpt:1.3       Fri Apr 25 11:43:28 2003
+++ php4/ext/interbase/tests/003.phpt   Mon Jun  2 08:37:16 2003
@@ -8,7 +8,6 @@
 <?php
 
     require("interbase.inc");
-    
     ibase_connect($test_base);
     
     ibase_query(
@@ -16,11 +15,15 @@
             iter               integer,
             v_char             char(1000),
             v_date      timestamp,
-            v_decimal   decimal(12,3),
+                       v_decimal4_2            decimal(4,2),
+                       v_decimal4_0            decimal(4,0),
+                       v_decimal7_2            decimal(7,2),
+                       v_decimal7_0            decimal(7,0),
+                       v_numeric15_15          numeric(15,15),
+                       v_numeric15_0   numeric(15,0),
             v_double   double precision,
             v_float     float,
                v_integer   integer,
-               v_numeric   numeric(4,2),
             v_smallint  smallint,
             v_varchar   varchar(10000)
             )");
@@ -33,18 +36,21 @@
        /* prepare data  */
        $v_char = rand_str(1000);
        $v_date = rand_datetime();
-       $v_decimal = rand_number(12,3);
+       $v_decimal4_2 = rand_number(4,2);
+       $v_decimal4_0 = rand_number(4,0);
+       $v_decimal7_2 = rand_number(7,2); 
+       $v_decimal7_0 = rand_number(7,0);
+       $v_numeric15_15 = rand_number(15,15);
+       $v_numeric15_0 = rand_number(15,0);
        $v_double  = rand_number(18);
        $v_float   = rand_number(7);
        $v_integer = rand_number(9,0);
-       $v_numeric = rand_number(4,2);
        $v_smallint = rand_number(5) % 32767;
        $v_varchar = rand_str(10000);
 
        ibase_query(
-       "insert into test3 (iter, 
v_char,v_date,v_decimal,v_double,v_float,v_integer,v_numeric,v_smallint,v_varchar)
-       values ($iter, 
'$v_char','$v_date',$v_decimal,$v_double,$v_float,$v_integer,$v_numeric,$v_smallint,'$v_varchar')");
-       $sel = ibase_query("select * from test3 where iter = $iter");
+       "insert into test3 (iter, v_char,v_date,v_decimal4_2, v_decimal4_0, 
v_decimal7_2, v_decimal7_0,v_numeric15_15, 
v_numeric15_0,v_double,v_float,v_integer,v_smallint,v_varchar)
+       values ($iter, '$v_char','$v_date',$v_decimal4_2, $v_decimal4_0, 
$v_decimal7_2, $v_decimal7_0,$v_numeric15_15, 
$v_numeric15_0,$v_double,$v_float,$v_integer,$v_smallint,'$v_varchar')");
        $sel = ibase_query("select * from test3 where iter = $iter");
        $row = ibase_fetch_object($sel);
        if(substr($row->V_CHAR,0,strlen($v_char)) != $v_char){
@@ -57,11 +63,37 @@
             echo " in:  $v_date\n";
             echo " out: $row->V_DATE\n";
         }
-        if($row->V_DECIMAL != $v_decimal){
-            echo " DECIMAL fail\n";
-            echo " in:  $v_decimal\n";
-            echo " out: $row->V_DECIMAL\n";
+        if($row->V_DECIMAL4_2 != $v_decimal4_2){
+            echo " DECIMAL4_2 fail\n";
+            echo " in:  $v_decimal4_2\n";
+            echo " out: $row->V_DECIMAL4_2\n";
+        }
+        if($row->V_DECIMAL4_0 != $v_decimal4_0){
+            echo " DECIMAL4_0 fail\n";
+            echo " in:  $v_decimal4_0\n";
+            echo " out: $row->V_DECIMAL4_0\n";
+        }
+        if($row->V_DECIMAL7_2 != $v_decimal7_2){
+            echo " DECIMAL7_2 fail\n";
+            echo " in:  $v_decimal7_2\n";
+            echo " out: $row->V_DECIMAL7_2\n";
+        }
+        if($row->V_DECIMAL7_0 != $v_decimal7_0){
+            echo " DECIMAL7_0 fail\n";
+            echo " in:  $v_decimal7_0\n";
+            echo " out: $row->V_DECIMAL7_0\n";
+        }
+        if($row->V_NUMERIC15_15 != $v_numeric15_15){
+            echo " NUMERIC15_15 fail\n";
+            echo " in:  $v_numeric15_15\n";
+            echo " out: $row->V_NUMERIC15_15\n";
+        }
+        if($row->V_NUMERIC15_0 != $v_numeric15_0){
+            echo " NUMERIC15_0 fail\n";
+            echo " in:  $v_numeric15_0\n";
+            echo " out: $row->V_NUMERIC15_0\n";
         }
+        
         if(abs($row->V_DOUBLE - $v_double) > abs($v_double / 1E15)){
             echo " DOUBLE fail\n";
             echo " in:  $v_double\n";
@@ -77,6 +109,18 @@
             echo " in:  $v_integer\n";
             echo " out: $row->V_INTEGER\n";
         }
+        if($row->V_SMALLINT != $v_smallint){
+            echo " SMALLINT fail\n";
+            echo " in:  $v_smallint\n";
+            echo " out: $row->V_SMALLINT\n";
+        }
+        
+                 if(substr($row->V_VARCHAR,0,strlen($v_varchar)) != $v_varchar){
+               echo " VARCHAR fail:\n";
+            echo " in:  $v_varchar\n";
+            echo " out: $row->V_VARCHAR\n";
+        }
+      
         ibase_free_result($sel);
     } /* for($iter) */
 



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

Reply via email to