abies           Tue Sep  2 15:30:22 2003 EDT

  Modified files:              
    /php-src/ext/interbase      interbase.c 
  Log:
  Make ibase_{param|field}_info() return typenames that actually mean something
  
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.166 php-src/ext/interbase/interbase.c:1.167
--- php-src/ext/interbase/interbase.c:1.166     Tue Sep  2 09:17:56 2003
+++ php-src/ext/interbase/interbase.c   Tue Sep  2 15:30:20 2003
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.166 2003/09/02 13:17:56 abies Exp $ */
+/* $Id: interbase.c,v 1.167 2003/09/02 19:30:20 abies Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -706,7 +706,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.166 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.167 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "Yes");
 #endif
@@ -2985,7 +2985,7 @@
 /* }}} */
 #endif
 
-/* {{{ proto int ibase_num_fields(resource {query|result})
+/* {{{ proto int ibase_num_fields(resource query|result)
    Get the number of fields in result */
 PHP_FUNCTION(ibase_num_fields)
 {
@@ -3021,14 +3021,78 @@
 }
 /* }}} */
 
-/* {{{ proto array ibase_field_info(resource result, int field_number)
+/* {{{ static char * _php_ibase_field_type() */
+static char * _php_ibase_field_type(XSQLVAR *var)
+{
+       char buf[32], *s;
+       int precision;
+       
+       switch (var->sqltype & ~1) {
+               case SQL_TEXT:      s = "CHAR"; break;
+               case SQL_VARYING:   s = "VARCHAR"; break;
+               case SQL_SHORT:
+                       if (var->sqlscale < 0) {
+                               precision = 4;
+                       } else {
+                               s = "SMALLINT"; 
+                       }
+                       break;
+               case SQL_LONG:
+                       if (var->sqlscale < 0) {
+                               precision = 9;
+                       } else {
+                               s = "INTEGER"; 
+                       }
+                       break;
+               case SQL_FLOAT:     s = "FLOAT"; break;
+               case SQL_DOUBLE:    
+               case SQL_D_FLOAT:   s = "DOUBLE PRECISION"; break;
+#ifdef SQL_INT64
+               case SQL_INT64:     
+                       if (var->sqlscale < 0) {
+                               precision = 18;
+                       } else {
+                               s = "BIGINT"; 
+                       }
+                       break;
+#endif
+#ifdef SQL_TIMESTAMP
+               case SQL_TIMESTAMP:     s = "TIMESTAMP"; break;
+               case SQL_TYPE_DATE:     s = "DATE"; break;
+               case SQL_TYPE_TIME:     s = "TIME"; break;
+#else
+               case SQL_DATE:      s = "DATE"; break;
+#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);
+                       s = buf;
+                       break;
+       }
+       if (var->sqlscale < 0) {
+               sprintf(buf, "NUMERIC(%d,%d)", precision, -var->sqlscale);
+               s = buf;
+       }
+       
+       return estrdup(s);
+}
+/* }}} */
+
+/* {{{ proto array ibase_field_info(resource query|result, int field_number)
    Get information about a field */
 PHP_FUNCTION(ibase_field_info)
 {
        zval **result_arg, **field_arg;
-       ibase_result *ib_result;
-       char buf[30], *s;
-       int len;
+       char buf[8], *s;
+       int len, type;
+       XSQLDA *sqlda;
        XSQLVAR *var;
 
        RESET_ERRMSG;
@@ -3037,22 +3101,34 @@
                WRONG_PARAM_COUNT;
        }
 
-       ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, "InterBase 
result", le_result);
+       zend_list_find(Z_LVAL_PP(result_arg), &type);
+       
+       if (type == le_query) {
+               ibase_query *ib_query;
 
-       if (ib_result->out_sqlda == NULL) {
+               ZEND_FETCH_RESOURCE(ib_query, ibase_query *, result_arg, -1, 
"InterBase query", le_query);
+               sqlda = ib_query->out_sqlda;
+       } else {
+               ibase_result *ib_result;
+               
+               ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, 
"InterBase result", le_result);
+               sqlda = ib_result->out_sqlda;
+       }                                       
+
+       if (sqlda == NULL) {
                _php_ibase_module_error("Trying to get field info from a non-select 
query" TSRMLS_CC);
                RETURN_FALSE;
        }
 
        convert_to_long_ex(field_arg);
 
-       if (Z_LVAL_PP(field_arg) < 0 || Z_LVAL_PP(field_arg) >= 
ib_result->out_sqlda->sqld) {
+       if (Z_LVAL_PP(field_arg) < 0 || Z_LVAL_PP(field_arg) >= sqlda->sqld) {
                RETURN_FALSE;
        }
        
        array_init(return_value);
 
-       var = ib_result->out_sqlda->sqlvar + Z_LVAL_PP(field_arg);
+       var = sqlda->sqlvar + Z_LVAL_PP(field_arg);
 
        add_index_stringl(return_value, 0, var->sqlname, var->sqlname_length, 1);
        add_assoc_stringl(return_value, "name", var->sqlname, var->sqlname_length, 1);
@@ -3067,42 +3143,10 @@
        add_index_stringl(return_value, 3, buf, len, 1);
        add_assoc_stringl(return_value, "length", buf, len, 1);
 
-       switch (var->sqltype & ~1) {
-               case SQL_TEXT:      s = "TEXT"; break;
-               case SQL_VARYING:   s = "VARYING"; break;
-               case SQL_SHORT:     s = "SHORT"; break;
-               case SQL_LONG:      s = "LONG"; break;
-               case SQL_FLOAT:     s = "FLOAT"; break;
-               case SQL_DOUBLE:    s = "DOUBLE"; break;
-               case SQL_D_FLOAT:   s = "D_FLOAT"; break;
-#ifdef SQL_INT64
-               case SQL_INT64:     s = "INT64"; break;
-#endif
-#ifdef SQL_TIMESTAMP
-               case SQL_TIMESTAMP:     s = "TIMESTAMP"; break;
-               case SQL_TYPE_DATE:     s = "DATE"; break;
-               case SQL_TYPE_TIME:     s = "TIME"; break;
-#else
-               case SQL_DATE:      s = "DATE"; break;
-#endif
-               case SQL_BLOB:      s = "BLOB"; 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);
-               s = buf;
-               break;
-       }
-       add_index_stringl(return_value, 4, s, strlen(s), 1);
-       add_assoc_stringl(return_value, "type", s, strlen(s), 1);
+       s = _php_ibase_field_type(var);
+       add_index_string(return_value, 4, s, 1);
+       add_assoc_string(return_value, "type", s, 1);
+       efree(s);
 }
 /* }}} */
 
@@ -3135,7 +3179,7 @@
 {
        zval **result_arg, **field_arg;
        ibase_query *ib_query;
-       char buf[30], *s;
+       char buf[8], *s;
        int len;
        XSQLVAR *var;
 
@@ -3165,38 +3209,10 @@
        add_index_stringl(return_value, 0, buf, len, 1);
        add_assoc_stringl(return_value, "length", buf, len, 1);
 
-       switch (var->sqltype & ~1) {
-               case SQL_TEXT:      s = "TEXT"; break;
-               case SQL_VARYING:   s = "VARYING"; break;
-               case SQL_SHORT:     s = "SHORT"; break;
-               case SQL_LONG:      s = "LONG"; break;
-               case SQL_FLOAT:     s = "FLOAT"; break;
-               case SQL_DOUBLE:    s = "DOUBLE"; break;
-               case SQL_D_FLOAT:   s = "D_FLOAT"; break;
-#ifdef SQL_INT64
-               case SQL_INT64:     s = "INT64"; break;
-#endif
-#ifdef SQL_TIMESTAMP
-               case SQL_TIMESTAMP:     s = "TIMESTAMP"; break;
-               case SQL_TYPE_DATE:     s = "DATE"; break;
-               case SQL_TYPE_TIME:     s = "TIME"; break;
-#else
-               case SQL_DATE:      s = "DATE"; break;
-#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);
-               s = buf;
-               break;
-       }
-       add_index_stringl(return_value, 1, s, strlen(s), 1);
-       add_assoc_stringl(return_value, "type", s, strlen(s), 1);
+       s = _php_ibase_field_type(var);
+       add_index_string(return_value, 1, s, 1);
+       add_assoc_string(return_value, "type", s, 1);
+       efree(s);
 }
 /* }}} */
 

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

Reply via email to