]> granicus.if.org Git - php/commitdiff
Patch for correct handling of DATETIME values.
authorFrank M. Kromann <fmk@php.net>
Tue, 23 Oct 2001 16:34:52 +0000 (16:34 +0000)
committerFrank M. Kromann <fmk@php.net>
Tue, 23 Oct 2001 16:34:52 +0000 (16:34 +0000)
The patch is implemented with a parameter in php.ini controling if
datetime values are converted with the new or the old method.
Thanks to Michael Bretterklieber <mbretter@jawa.at>

ext/mssql/php_mssql.c
ext/mssql/php_mssql.h

index 4157d0fde7ed183d31a30fe2c4424af72a862dc3..cf4c655f406db7f92e4d3b305f3ff490506fc3d8 100644 (file)
@@ -42,8 +42,8 @@
 
 static int le_result, le_link, le_plink, le_statement;
 
-static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type);
-static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type);
+static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC);
+static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC);
 
 static void _mssql_bind_hash_dtor(void *data);
 static unsigned char a3_arg_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
@@ -134,6 +134,7 @@ PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY_EX("mssql.textsize",                          "-1",   PHP_INI_ALL,    OnUpdateInt,    textsize,                                       zend_mssql_globals,             mssql_globals,  display_text_size)
        STD_PHP_INI_ENTRY_EX("mssql.textlimit",                         "-1",   PHP_INI_ALL,    OnUpdateInt,    textlimit,                                      zend_mssql_globals,             mssql_globals,  display_text_size)
        STD_PHP_INI_ENTRY_EX("mssql.batchsize",                         "0",    PHP_INI_ALL,    OnUpdateInt,    batchsize,                                      zend_mssql_globals,             mssql_globals,  display_link_numbers)
+       STD_PHP_INI_BOOLEAN("mssql.datetimeconvert",            "1",    PHP_INI_ALL,    OnUpdateBool,   datetimeconvert,                        zend_mssql_globals,             mssql_globals)
 PHP_INI_END()
 
 /* error handler */
@@ -736,7 +737,7 @@ PHP_FUNCTION(mssql_select_db)
 
 /* }}} */
 
-static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type)
+static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type  TSRMLS_DC)
 {
        if (dbdatlen(mssql_ptr->link,offset) == 0) {
                ZVAL_NULL(result);
@@ -793,13 +794,28 @@ static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int off
                default: {
                        if (dbwillconvert(column_type,SQLCHAR)) {
                                char *res_buf;
+                               DBDATEREC dateinfo;     
                                int res_length = dbdatlen(mssql_ptr->link,offset);
-                               if (column_type == SQLDATETIM4) res_length += 14;
-                               if (column_type == SQLDATETIME) res_length += 10;
+
+                       
+                               if ((column_type != SQLDATETIME) || MS_SQL_G(datetimeconvert)) {
+
+                                       if (column_type == SQLDATETIM4) res_length += 14;
+                                       if (column_type == SQLDATETIME) res_length += 10;
+                       
+                                       res_buf = (unsigned char *) emalloc(res_length + 1);
+                                       res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);
+
+                               } else {
+
+                                       dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));
                        
-                               res_buf = (char *) emalloc(res_length + 1);
-                               res_length = dbconvert(NULL,column_type,dbdata(mssql_ptr->link,offset), res_length,SQLCHAR,res_buf,-1);
+                                       res_length = 20;
+                                       res_buf = (unsigned char *) emalloc(res_length + 1);
 
+                                       sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);
+                               }
+               
                                Z_STRVAL_P(result) = res_buf;
                                Z_STRLEN_P(result) = res_length;
                                Z_TYPE_P(result) = IS_STRING;
@@ -811,7 +827,7 @@ static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int off
        }
 }
 
-static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type)
+static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type  TSRMLS_DC)
 {
        if (dbdatlen(mssql_ptr->link,offset) == 0) {
                ZVAL_NULL(result);
@@ -835,12 +851,26 @@ static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int
        }
        else if  (dbwillconvert(coltype(offset),SQLCHAR)) {
                unsigned char *res_buf;
+               DBDATEREC dateinfo;     
                int res_length = dbdatlen(mssql_ptr->link,offset);
-               if (column_type == SQLDATETIM4) res_length += 14;
-               if (column_type == SQLDATETIME) res_length += 10;
-               
-               res_buf = (unsigned char *) emalloc(res_length + 1);
-               res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);
+
+               if ((column_type != SQLDATETIME) || MS_SQL_G(datetimeconvert)) {
+
+                       if (column_type == SQLDATETIM4) res_length += 14;
+                       if (column_type == SQLDATETIME) res_length += 10;
+                       
+                       res_buf = (unsigned char *) emalloc(res_length + 1);
+                       res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);
+
+               } else {
+
+                       dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));
+                       
+                       res_length = 20;
+                       res_buf = (unsigned char *) emalloc(res_length + 1);
+
+                       sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);
+               }
 
                Z_STRVAL_P(result) = res_buf;
                Z_STRLEN_P(result) = res_length;
@@ -913,7 +943,7 @@ static int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int r
                result->data[i] = (zval *) emalloc(sizeof(zval)*result->num_fields);
                for (j=0; j<result->num_fields; j++) {
                        INIT_ZVAL(result->data[i][j]);
-                       MS_SQL_G(get_column_content(mssql_ptr, j+1, &result->data[i][j], column_types[j]));
+                       MS_SQL_G(get_column_content(mssql_ptr, j+1, &result->data[i][j], column_types[j] TSRMLS_CC));
                }
                if (i<result->batchsize || result->batchsize==0) {
                        i++;
index 2d7d90d9153366ceb2a474faedb16e2495baf79f..b892d05a83e83516573a646acc611491f817dead 100644 (file)
@@ -114,8 +114,9 @@ ZEND_BEGIN_MODULE_GLOBALS(mssql)
        long min_error_severity, min_message_severity;
        long cfg_min_error_severity, cfg_min_message_severity;
        long compatability_mode, connect_timeout, timeout;
-       void (*get_column_content)(mssql_link *mssql_ptr,int offset,pval *result,int column_type);
+       void (*get_column_content)(mssql_link *mssql_ptr,int offset,pval *result,int column_type  TSRMLS_DC);
        long textsize, textlimit, batchsize;
+       long datetimeconvert;
        HashTable *resource_list, *resource_plist;
 ZEND_END_MODULE_GLOBALS(mssql)