]> granicus.if.org Git - php/commitdiff
Fixed all (?) remaining issues with InterBase 6 datatypes, especially
authorJouni Ahto <jah@php.net>
Fri, 12 May 2000 03:02:14 +0000 (03:02 +0000)
committerJouni Ahto <jah@php.net>
Fri, 12 May 2000 03:02:14 +0000 (03:02 +0000)
with timestamp, date and time.
Incombatible change: renamed constant IBASE_TIMESTAMP to IBASE_UNIXTIME.
Incompatible change: renamed configuration directive ibase.timeformat
to ibase.timestampformat.
Added constants IBASE_TIMESTAMP, IBASE_DATE, IBASE_TIME.
Added configuration directives ibase.dateformat and ibase.timeformat.
ibase_timefmt() now takes an optional second argument specifying which
format to change, default is IBASE_TIMESTAMP (for even a little backwards
compatibility).

ext/interbase/config.m4
ext/interbase/interbase.c
ext/interbase/php_interbase.h

index c3a266d6519e593e7a8a917b4eb590d79c54ca98..c2acb383b6812099547e7df76417ecd117908ea5 100644 (file)
@@ -15,6 +15,7 @@ if test "$PHP_INTERBASE" != "no"; then
   AC_ADD_LIBRARY_WITH_PATH(gds, $IBASE_LIBDIR, INTERBASE_SHARED_LIBADD)
   AC_ADD_INCLUDE($IBASE_INCDIR)
   AC_DEFINE(HAVE_IBASE,1,[ ])
+dnl  AC_CHECK_LIB(c, strptime, [AC_DEFINE(HAVE_STRPTIME,1,[])])
   PHP_EXTENSION(interbase, $ext_shared)
   PHP_SUBST(INTERBASE_SHARED_LIBADD)
 fi
index c3f6527da5ad2f52945aec667a9c01f7c5a0e61e..a884e6f52dc41a970eafc6227003c25893a05ef5 100644 (file)
@@ -150,17 +150,6 @@ PHP_IBASE_API php_ibase_globals ibase_globals;
        }}
        
        
-/* get query  */
-/*
-#define GET_QUERY(query_id, ib_query) { \
-       int type; \
-       ib_query = (ibase_query *) zend_list_find(query_id, &type); \
-       if (type!=IBG(le_query)) { \
-               _php_ibase_module_error("%d is not query index",query_id); \
-               RETURN_FALSE; \
-       }}
-*/
-
 #define RESET_ERRMSG { IBG(errmsg)[0] = '\0';}
 
 #define TEST_ERRMSG ( IBG(errmsg)[0] != '\0')
@@ -173,6 +162,9 @@ typedef struct {
                short sval;
                float fval;
                ISC_QUAD qval;
+               ISC_TIMESTAMP tsval;
+               ISC_DATE dtval;
+               ISC_TIME tmval;
        } val;
        short sqlind;
 } BIND_BUF;
@@ -220,12 +212,6 @@ typedef struct {
 
 /* }}} */
 
-/*
-#define IBASE_GLOBAL(a) a
-#define IBASE_TLS_VARS
-ibase_module php_ibase_module;
-*/
-
 /* error handling ---------------------------- */
 
 /* {{{ proto string ibase_errmsg(void) 
@@ -429,15 +415,17 @@ PHP_INI_BEGIN()
         STD_PHP_INI_ENTRY_EX("ibase.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, php_ibase_globals, ibase_globals, display_link_numbers)
         STD_PHP_INI_ENTRY("ibase.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, php_ibase_globals, ibase_globals)
         STD_PHP_INI_ENTRY("ibase.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, php_ibase_globals, ibase_globals)
+        STD_PHP_INI_ENTRY("ibase.timestampformat", "%m/%d/%Y %H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timestampformat, php_ibase_globals, ibase_globals)
+        STD_PHP_INI_ENTRY("ibase.dateformat", "%m/%d/%Y", PHP_INI_ALL, OnUpdateString, cfg_dateformat, php_ibase_globals, ibase_globals)
+        STD_PHP_INI_ENTRY("ibase.timeformat", "%H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timeformat, php_ibase_globals, ibase_globals)
 PHP_INI_END()
 
 PHP_MINIT_FUNCTION(ibase)
 {
        IBLS_FETCH();
 
-       if (cfg_get_string("ibase.timeformat", &IBG(timeformat)) == FAILURE) {
-               IBG(cfg_timeformat) = "%m/%d/%Y %H:%M:%S";
-       }
+       IBG(timestampformat) = NULL;
+       IBG(dateformat) = NULL;
        IBG(timeformat) = NULL;
        IBG(errmsg) = NULL;
 
@@ -453,11 +441,14 @@ PHP_MINIT_FUNCTION(ibase)
 
        REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_TEXT, CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_UNIXTIME", PHP_IBASE_UNIXTIME, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_READ", PHP_IBASE_READ, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_COMMITTED", PHP_IBASE_COMMITTED, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_CONSISTENCY", PHP_IBASE_CONSISTENCY, CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("IBASE_NOWAIT", PHP_IBASE_NOWAIT, CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_DATE", PHP_IBASE_DATE, CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("IBASE_TIME", PHP_IBASE_TIME, CONST_PERSISTENT);
        
        return SUCCESS;
 }
@@ -470,6 +461,14 @@ PHP_RINIT_FUNCTION(ibase)
        IBG(default_link)= -1;
        IBG(num_links) = IBG(num_persistent);
 
+       if (IBG(timestampformat))
+        DL_FREE(IBG(timestampformat));
+       IBG(timestampformat) = DL_STRDUP(IBG(cfg_timestampformat));
+
+       if (IBG(dateformat))
+        DL_FREE(IBG(dateformat));
+       IBG(dateformat) = DL_STRDUP(IBG(cfg_dateformat));
+
        if (IBG(timeformat))
         DL_FREE(IBG(timeformat));
        IBG(timeformat) = DL_STRDUP(IBG(cfg_timeformat));
@@ -493,6 +492,14 @@ PHP_RSHUTDOWN_FUNCTION(ibase)
 {
     IBLS_FETCH();
 
+       if (IBG(timestampformat))
+           DL_FREE(IBG(timestampformat));
+       IBG(timestampformat) = NULL;
+
+       if (IBG(dateformat))
+           DL_FREE(IBG(dateformat));
+       IBG(dateformat) = NULL;
+
        if (IBG(timeformat))
            DL_FREE(IBG(timeformat));
        IBG(timeformat) = NULL;
@@ -534,6 +541,8 @@ PHP_MINFO_FUNCTION(ibase)
        tmp[31]=0;
        php_info_print_table_row(2, "Total Links", tmp );
 
+       php_info_print_table_row(2, "Timestamp Format", IBG(timestampformat) );
+       php_info_print_table_row(2, "Date Format", IBG(dateformat) );
        php_info_print_table_row(2, "Time Format", IBG(timeformat) );
 
        php_info_print_table_end();
@@ -1129,40 +1138,50 @@ static int _php_ibase_bind(XSQLDA *sqlda, pval **b_vars, BIND_BUF *buf)
                                var->sqllen      = b_var->value.str.len;
                                var->sqltype = SQL_TEXT;
                                break;
-                               /* FIX THESE
+#ifndef SQL_TIMESTAMP
+                       case SQL_DATE:
+#else
                        case SQL_TIMESTAMP:
                        case SQL_TYPE_DATE:
                        case SQL_TYPE_TIME:
+#ifndef HAVE_STRPTIME
+                               /*
+                                 Once again, InterBase's internal parsing routines
+                                 seems to bea good solution... Might change this on
+                                 platforms that have strptime()? Code is there and works,
+                                 but the functions existence is not yet tested...
+                                 ask Sascha?
                                */
-                       case SQL_DATE:
+                               convert_to_string(b_var);
+                               var->sqldata = (void ISC_FAR *)b_var->value.str.val;
+                               var->sqllen      = b_var->value.str.len;
+                               var->sqltype = SQL_TEXT;
+#else
                                {
                                        struct tm t;
-                                       
-                                       t.tm_year = t.tm_mon = t.tm_mday = t.tm_hour =
-                                               t.tm_min = t.tm_sec = 0;
-                                       
+
                                        convert_to_string(b_var);
-                                       
-#if HAVE_STRPTIME /*FIXME: HAVE_STRPTIME ?*/
-                                       
-                                       strptime(b_var->value.str.val, IBG(timeformat), &t);
-#else
-                                       {
-                                               int n = sscanf(b_var->value.str.val,"%d%*[/]%d%*[/]%d %d%*[:]%d%*[:]%d",
-                                                                          &t.tm_mon, &t.tm_mday, &t.tm_year,  &t.tm_hour, &t.tm_min, &t.tm_sec);
-                                               if (n != 3 && n != 6) {
-                                                       _php_ibase_module_error("invalid date/time format");
-                                                       return FAILURE;
-                                               }
-                                       
-                                               t.tm_year -= 1900;
-                                               t.tm_mon--;
+                                       switch (var->sqltype & ~1) {
+                                               case SQL_TIMESTAMP:
+                                                       strptime(b_var->value.str.val, IBG(timestampformat), &t);
+                                                       isc_encode_timestamp(&t, &buf[i].val.tsval);
+                                                       var->sqldata = (void ISC_FAR *)(&buf[i].val.tsval);
+                                                       break;
+                                               case SQL_TYPE_DATE:
+                                                       strptime(b_var->value.str.val, IBG(dateformat), &t);
+                                                       isc_encode_sql_date(&t, &buf[i].val.dtval);
+                                                       var->sqldata = (void ISC_FAR *)(&buf[i].val.dtval);
+                                                       break;
+                                               case SQL_TYPE_TIME:
+                                                       strptime(b_var->value.str.val, IBG(timeformat), &t);
+                                                       isc_encode_sql_time(&t, &buf[i].val.tmval);
+                                                       var->sqldata = (void ISC_FAR *)(&buf[i].val.tmval);
+                                                       break;
                                        }
-#endif
-                                       isc_encode_date(&t, &buf[i].val.qval);
-                                       var->sqldata = (void ISC_FAR *)(&buf[i].val.qval);
                                }
+#endif
                                break;
+#endif
                        case SQL_BLOB:
                                {
                                        ibase_blob_handle *ib_blob_id;
@@ -1588,7 +1607,6 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
 {
        char string_data[255];
        
-
        switch(type & ~1) {
                case SQL_VARYING:
                        len = ((IBASE_VCHAR *) data)->var_len;
@@ -1663,19 +1681,25 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
 #endif
                {
                        struct tm t;
+                       char *format = NULL;
                        long timestamp = -1;
-#ifndef SQL_TIMESTAMP_
+
+#ifndef SQL_TIMESTAMP
                        isc_decode_date((ISC_QUAD *) data, &t);
+                       format = IBG(timestampformat);
 #else
                        switch (type & ~1) {
                                case SQL_TIMESTAMP:
                                        isc_decode_timestamp((ISC_TIMESTAMP *) data, &t);
+                                       format = IBG(timestampformat);
                                        break;
                                case SQL_TYPE_DATE:
                                        isc_decode_sql_date((ISC_DATE *) data, &t);
+                                       format = IBG(dateformat);
                                        break;
                                case SQL_TYPE_TIME:
                                        isc_decode_sql_time((ISC_TIME *) data, &t);
+                                       format = IBG(timeformat);
                                        break;
                        }
 #endif
@@ -1688,14 +1712,15 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca
 #if HAVE_TM_ZONE
                        t.tm_zone = tzname[0];
 #endif
-                       if (flag & PHP_IBASE_TIMESTAMP) {
+                       if (flag & PHP_IBASE_UNIXTIME) {
                                val->type = IS_LONG;
                                val->value.lval = timestamp;
                        } else {
                                val->type = IS_STRING;
 #if HAVE_STRFTIME
-                               val->value.str.len = strftime(string_data, sizeof(string_data), IBG(timeformat), &t);
+                               val->value.str.len = strftime(string_data, sizeof(string_data), format, &t);
 #else
+                               /* FIXME */
                                if (!t.tm_hour && !t.tm_min && !t.tm_sec)
                                        val->value.str.len = sprintf(string_data, "%02d/%02d/%4d", t.tm_mon+1, t.tm_mday, t.tm_year+1900);
                                else
@@ -1839,7 +1864,13 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type)
 #ifdef SQL_INT64
                                case SQL_INT64:
 #endif
+#ifndef SQL_TIMESTAMP
                                case SQL_DATE:
+#else
+                               case SQL_TIMESTAMP:
+                               case SQL_TYPE_DATE:
+                               case SQL_TYPE_TIME:
+#endif
                                        _php_ibase_var_pval(tmp, var->sqldata, var->sqltype, var->sqllen, var->sqlscale, flag);
                                        break;
                                case SQL_BLOB:
@@ -2142,25 +2173,56 @@ PHP_FUNCTION(ibase_free_query)
 
 
 /* {{{ proto int ibase_timefmt(string format)
-   Sets the format of datetime columns returned from queries. Still nonfunctional */
+   Sets the format of timestamp, date and time columns returned from queries */
 PHP_FUNCTION(ibase_timefmt)
 {
-       pval *fmt;
+#if HAVE_STRFTIME
+       pval ***args;
+       char *fmt = NULL;
+       int type = PHP_IBASE_TIMESTAMP;
        IBLS_FETCH();
        
+       RESET_ERRMSG; /* ??? */
 
-       RESET_ERRMSG;
 
-#if HAVE_STRFTIME
-       if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &fmt)==FAILURE) {
+       if (ARG_COUNT(ht) < 1 || ARG_COUNT(ht) > 2){
                WRONG_PARAM_COUNT;
        }
-    convert_to_string(fmt);
-    
-       if (IBG(timeformat))
-         DL_FREE(IBG(timeformat));
-    IBG(timeformat) = DL_STRDUP(fmt->value.str.val);
+       
+       args = (pval ***) emalloc(sizeof(pval **)*ARG_COUNT(ht));
+       if (zend_get_parameters_array_ex(ARG_COUNT(ht), args) == FAILURE) {
+               efree(args);
+               RETURN_FALSE;
+       }
+
+       switch (ARG_COUNT(ht)) {
+               case 2:
+                       convert_to_long_ex(args[1]);
+                       type = (*args[1])->value.lval;
+               case 1:
+                       convert_to_string_ex(args[0]);
+                       fmt = (*args[0])->value.str.val;
+       }
+
+       switch (type) {
+               case PHP_IBASE_TIMESTAMP:
+                       if (IBG(timestampformat))
+                               DL_FREE(IBG(timestampformat));
+                       IBG(timestampformat) = DL_STRDUP(fmt);
+                       break;
+               case PHP_IBASE_DATE:
+                       if (IBG(dateformat))
+                               DL_FREE(IBG(dateformat));
+                       IBG(dateformat) = DL_STRDUP(fmt);
+                       break;
+               case PHP_IBASE_TIME:
+                       if (IBG(timeformat))
+                               DL_FREE(IBG(timeformat));
+                       IBG(timeformat) = DL_STRDUP(fmt);
+                       break;
+       }
     
+       efree(args);
        RETURN_TRUE;
 #else
        _php_ibase_module_error("ibase_timefmt not supported on this platform");
@@ -2266,17 +2328,26 @@ PHP_FUNCTION(ibase_field_info)
        */
 
        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;
-               case SQL_DATE:     s = "DATE"; break;
-               case SQL_BLOB:     s = "BLOB"; break;
-               case SQL_ARRAY:    s = "ARRAY"; break;
-               case SQL_QUAD:     s = "QUAD"; break;
+               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;
+               case SQL_QUAD:      s = "QUAD"; break;
        default:
                sprintf(buf,"unknown (%d)", var->sqltype & ~1);
                s = buf;
index adbfa45b0ff161746303a85aa1305029410c8700..00fb62d25117368cb83180e7fe7ac2fcde5bc1c4 100644 (file)
@@ -89,6 +89,10 @@ typedef struct {
        long allow_persistent;
        int le_blob, le_link, le_plink, le_result, le_query;
        char *default_user, *default_password;
+       char *timestampformat;
+       char *cfg_timestampformat;
+       char *dateformat;
+       char *cfg_dateformat;
        char *timeformat;
        char *cfg_timeformat;
        char *errmsg;
@@ -143,11 +147,14 @@ typedef struct _php_ibase_varchar {
 enum php_interbase_option {
        PHP_IBASE_DEFAULT = 0,
        PHP_IBASE_TEXT = 1,
-       PHP_IBASE_TIMESTAMP = 2,
+       PHP_IBASE_UNIXTIME = 2,
        PHP_IBASE_READ = 4,
        PHP_IBASE_COMMITTED = 8,
        PHP_IBASE_CONSISTENCY = 16,
-       PHP_IBASE_NOWAIT = 32
+       PHP_IBASE_NOWAIT = 32,
+       PHP_IBASE_TIMESTAMP = 64,
+       PHP_IBASE_DATE = 128,
+       PHP_IBASE_TIME = 256
 };
 
 #ifdef ZTS