abies           Wed Sep  3 21:26:36 2003 EDT

  Modified files:              
    /php-src/ext/interbase      interbase.c 
  Log:
  No scaling for double type
  Added missing array types
  Precompute scale factors
  
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.170 php-src/ext/interbase/interbase.c:1.171
--- php-src/ext/interbase/interbase.c:1.170     Wed Sep  3 11:15:30 2003
+++ php-src/ext/interbase/interbase.c   Wed Sep  3 21:26:36 2003
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.170 2003/09/03 15:15:30 abies Exp $ */
+/* $Id: interbase.c,v 1.171 2003/09/04 01:26:36 abies Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -54,8 +54,10 @@
 
 #ifdef PHP_WIN32
 #define LL_MASK "I64"
+#define LL_LIT(lit) lit ## I64
 #else
 #define LL_MASK "ll"
+#define LL_LIT(lit) lit ## ll
 #endif
 
 #define QUERY_RESULT   1
@@ -706,7 +708,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.170 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.171 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "Yes");
 #endif
@@ -1130,7 +1132,7 @@
                                                break;
                                        case blr_long:
                                                IB_ARRAY[ar_cnt].el_type = SQL_LONG;
-                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(long);
+                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_LONG);
                                                break;
                                        case blr_float:
                                                IB_ARRAY[ar_cnt].el_type = SQL_FLOAT;
@@ -1140,18 +1142,44 @@
                                                IB_ARRAY[ar_cnt].el_type = SQL_DOUBLE;
                                                IB_ARRAY[ar_cnt].el_size = 
sizeof(double);
                                                break;
+#ifdef blr_int64
+                                       case blr_int64:
+                                               IB_ARRAY[ar_cnt].el_type = SQL_INT64;
+                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_INT64);
+                                               break;
+#endif
+#ifndef blr_timestamp
                                        case blr_date:
                                                IB_ARRAY[ar_cnt].el_type = SQL_DATE;
                                                IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_QUAD);
                                                break;
+#else
+                                       case blr_timestamp:
+                                               IB_ARRAY[ar_cnt].el_type = 
SQL_TIMESTAMP;
+                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_TIMESTAMP);
+                                               break;
+                                       case blr_sql_date:
+                                               IB_ARRAY[ar_cnt].el_type = 
SQL_TYPE_DATE;
+                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_DATE);
+                                               break;
+                                       case blr_sql_time:
+                                               IB_ARRAY[ar_cnt].el_type = 
SQL_TYPE_TIME;
+                                               IB_ARRAY[ar_cnt].el_size = 
sizeof(ISC_TIME);
+                                               break;
+#endif                                         
                                        case blr_varying:
                                        case blr_varying2:      /* changed to SQL_TEXT 
? */
                                                /* sql_type = SQL_VARYING; Why? FIXME: 
??? */
                                                IB_ARRAY[ar_cnt].el_type = SQL_TEXT;
                                                IB_ARRAY[ar_cnt].el_size = 
ar_desc->array_desc_length + sizeof(short);
                                                break;
+                                       case blr_quad:
+                                       case blr_blob_id:
+                                       case blr_cstring:
+                                       case blr_cstring2:
+                                               /* FIXME */
                                        default:
-                                               _php_ibase_module_error("Unexpected 
array type %d in relation '%s' column '%s'" TSRMLS_CC, ar_desc->array_desc_dtype, 
var->relname, var->sqlname);
+                                               _php_ibase_module_error("Unsupported 
array type %d in relation '%s' column '%s'" TSRMLS_CC, ar_desc->array_desc_dtype, 
var->relname, var->sqlname);
                                                efree(IB_ARRAY);
                                                IB_ARRAY = NULL;
                                                return FAILURE;
@@ -1478,7 +1506,7 @@
                                var->sqldata = emalloc(sizeof(short));
                                break;
                        case SQL_LONG:
-                               var->sqldata = emalloc(sizeof(long));
+                               var->sqldata = emalloc(sizeof(ISC_LONG));
                                break;
                        case SQL_FLOAT:
                                var->sqldata = emalloc(sizeof(float));
@@ -2262,15 +2290,23 @@
 /* {{{ _php_ibase_var_zval() */
 static int _php_ibase_var_zval(zval *val, void *data, int type, int len, int scale, 
int flag TSRMLS_DC)
 {
-       char string_data[255];
-       
+#ifdef SQL_INT64
+       static ISC_INT64 const scales[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 
100000000, 1000000000, 
+               1000000000, 
LL_LIT(10000000000),LL_LIT(100000000000),LL_LIT(10000000000000),LL_LIT(100000000000000),
+               
LL_LIT(1000000000000000),LL_LIT(1000000000000000),LL_LIT(1000000000000000000) };
+#else 
+       static long const scales[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 
100000000, 1000000000, 1000000000 };
+#endif         
+
        switch (type & ~1) {
-               unsigned short j;
+               unsigned short l;
+               long n;
+               char string_data[255];
 
                case SQL_VARYING:
                        len = ((IBVARY *) data)->vary_length;
                        data = ((IBVARY *) data)->vary_string;
-                       /* fallout */
+                       /* no break */
                case SQL_TEXT:
                        if (PG(magic_quotes_runtime)) {
                                Z_STRVAL_P(val) = php_addslashes(data, len, 
&Z_STRLEN_P(val), 0 TSRMLS_CC);
@@ -2279,81 +2315,62 @@
                                ZVAL_STRINGL(val,(char *) data,len,1);
                        }
                        break;
-               case SQL_LONG:
                case SQL_SHORT:
-                       if (scale < 0) {
-                               long n, f = 1;
-
-                               if ( (type & ~1) == SQL_SHORT) {
-                                       n = *(short *) (data);
-                               } else {        
-                                       n = *(long *) (data);
-                               }
-                               for (j = 0; j < -scale; j++) {
-                                       f *= 10;
-                               }
-                               if (n  >= 0 || n < -f) {
-                                       j = sprintf(string_data, "%ld.%0*ld", n / f, 
-scale,  labs(n % f) );
+                       n = *(short *) data;
+                       goto _sql_long;
+               case SQL_LONG:
+                       n = *(long *) data; 
+               _sql_long:
+                       if (scale == 0) {
+                               ZVAL_LONG(val,n);
+                       } else {
+                               long f = scales[-scale];
+                               
+                               if (n >= 0) {
+                                       l = sprintf(string_data, "%ld.%0*ld", n / f, 
-scale,  n % f);
+                               } else if (n < -f) {
+                                       l = sprintf(string_data, "%ld.%0*ld", n / f, 
-scale,  -n % f);
                                } else {
-                                       j = sprintf(string_data, "%s.%0*ld","-0", 
-scale, -n % f);
+                                       l = sprintf(string_data, "-0.%0*ld", -scale, 
-n % f);
                                }
-                               ZVAL_STRINGL(val,string_data,j,1);
-                       } else if ( (type & ~1) == SQL_SHORT) {
-                               ZVAL_LONG(val, *(short *) data);
-                       } else {
-                               ZVAL_LONG(val, *(long *) data);
+                               ZVAL_STRINGL(val,string_data,l,1);
                        }
                        break;
                case SQL_FLOAT:
                        ZVAL_DOUBLE(val, *(float *) data);
                        break;
                case SQL_DOUBLE:
-                       if (scale < 0) {
-                               j = sprintf(string_data, "%.*f", -scale, *(double *) 
data);
-                               ZVAL_STRINGL(val, string_data, j, 1);
-                       } else {
-                               ZVAL_DOUBLE(val, *(double *) data);
-                       }
+                       ZVAL_DOUBLE(val, *(double *) data);
                        break;
 #ifdef SQL_INT64
                case SQL_INT64:
-                       if (scale < 0) {
-                               ISC_INT64 n = *(ISC_INT64 *) data, f = 1;
+                       if (scale == 0) {
+                               l = sprintf(string_data, "%.0" LL_MASK "d", 
*(ISC_INT64 *) data);
+                       } else {
+                               ISC_INT64 n = *(ISC_INT64 *) data, f = scales[-scale];
 
-                               for (j = 0; j < -scale; j++) {
-                                       f *= 10;
-                               }
                                if (n >= 0) {
-                                       j = sprintf(string_data, "%" LL_MASK "d.%0*" 
LL_MASK "d", n / f, -scale, n % f);
+                                       l = sprintf(string_data, "%" LL_MASK "d.%0*" 
LL_MASK "d", n / f, -scale, n % f);
                                } else if (n < -f) {
-                                       j = sprintf(string_data, "%" LL_MASK "d.%0*" 
LL_MASK "d", n / f, -scale, -n % f);                               
+                                       l = sprintf(string_data, "%" LL_MASK "d.%0*" 
LL_MASK "d", n / f, -scale, -n % f);                               
                                } else {
-                                       j = sprintf(string_data, "-0.%0*" LL_MASK "d", 
-scale, -n % f);
+                                       l = sprintf(string_data, "-0.%0*" LL_MASK "d", 
-scale, -n % f);
                                }
-                       } else {
-                               j = sprintf(string_data, "%.0" LL_MASK "d", 
*(ISC_INT64 *) data);
                        }
-                       ZVAL_STRINGL(val,string_data,j,1);
+                       ZVAL_STRINGL(val,string_data,l,1);
                        break;
 #endif
-#ifndef SQL_TIMESTAMP
-               case SQL_DATE:
-#else
-               case SQL_TIMESTAMP:
-               case SQL_TYPE_DATE:
-               case SQL_TYPE_TIME:
-#endif
+               default: /* == any date/time type */
                {
                        struct tm t;
                        char *format = NULL;
-                       long timestamp = -1;
 
 #ifndef SQL_TIMESTAMP
                        isc_decode_date((ISC_QUAD *) data, &t);
                        format = IBG(timestampformat);
 #else
                        switch (type & ~1) {
-                               case SQL_TIMESTAMP:
+                               default: /* == case SQL_TIMESTAMP: */
                                        isc_decode_timestamp((ISC_TIMESTAMP *) data, 
&t);
                                        format = IBG(timestampformat);
                                        break;
@@ -2372,29 +2389,33 @@
                           always sets tm_isdst to 0, sometimes incorrectly (InterBase 
6 bug?)
                        */
                        t.tm_isdst = -1;
-                       timestamp = mktime(&t);
 #if HAVE_TM_ZONE
                        t.tm_zone = tzname[0];
 #endif
                        if (flag & PHP_IBASE_UNIXTIME) {
-                               ZVAL_LONG(val, timestamp);
+                               ZVAL_LONG(val, mktime(&t));
                        } else {
 #if HAVE_STRFTIME
-                               j = strftime(string_data, sizeof(string_data), format, 
&t);
+                               l = strftime(string_data, sizeof(string_data), format, 
&t);
 #else
-                               /* FIXME (will not work for time values) */
-                               if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
-                                       j = sprintf(string_data, "%02d/%02d/%4d", 
t.tm_mon + 1, t.tm_mday, t.tm_year + 1900);
-                               } else {
-                                       j = sprintf(string_data, "%02d/%02d/%4d 
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour, t.tm_min, 
t.tm_sec);
+                               switch (type & ~1) {
+                                       default:
+                                               l = sprintf(string_data, 
"%02d/%02d/%4d %02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour, 
t.tm_min, t.tm_sec);
+                                               break;
+#ifdef SQL_TIMESTAMP
+                                       case SQL_TYPE_DATE:
+                                               l = sprintf(string_data, 
"%02d/%02d/%4d", t.tm_mon + 1, t.tm_mday, t.tm_year + 1900);
+                                               break;
+                                       case SQL_TYPE_TIME:
+                                               l = sprintf(string_data, 
"%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
+                                               break;
+#endif
                                }
 #endif
-                               ZVAL_STRINGL(val,string_data,j,1);
+                               ZVAL_STRINGL(val,string_data,l,1);
                                break;
                        }
                }
-               default:
-                       return FAILURE;
        } /* switch (type) */
        return SUCCESS;
 }
@@ -3124,8 +3145,7 @@
 
        s = _php_ibase_field_type(var);
        add_index_string(return_value, 4, s, 1);
-       add_assoc_string(return_value, "type", s, 1);
-       efree(s);
+       add_assoc_string(return_value, "type", s, 0);
 }
 /* }}} */
 
@@ -3190,8 +3210,7 @@
 
        s = _php_ibase_field_type(var);
        add_index_string(return_value, 1, s, 1);
-       add_assoc_string(return_value, "type", s, 1);
-       efree(s);
+       add_assoc_string(return_value, "type", s, 0);
 }
 /* }}} */
 

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

Reply via email to