[PATCH] bug 12655: datetime format in mssql extension

From: Date: Tue, 16 Apr 2002 21:29:40 +0000
Subject: [PATCH] bug 12655: datetime format in mssql extension
Groups: php.dev 
Request: Send a blank email to php-dev+get-82864@lists.php.net to get a copy of this message
The 4.1.2 (and before) mssql entension returns datetime fields as a locale specific format eg: Oct 30 2001 7:44PM, which doesn't allow access to the seconds or milliseconds field of datetime. I patched my copy of mssql to have a php.ini entry mssql.longdatetime which tells mssql to return datetime in the long format: eg: 2001-10-30 19:44:54.206. 99% of the changes are in php_mssql.c with php_mssql.h just needing a variable added to it. Diff of php4.1.2 php_mssql.c => my patch ver 45,46c45,46 < 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,long longdatetime); > static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type,long longdatetime); 136a137 > STD_PHP_INI_BOOLEAN("mssql.longdatetime", "0", PHP_INI_ALL, OnUpdateBool, longdatetime, zend_mssql_globals, mssql_globals) 739c740 < 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,long longdatetime) 795,801c796,823 < char *res_buf; < int res_length = dbdatlen(mssql_ptr->link,offset); < if (column_type == SQLDATETIM4) res_length += 14; < if (column_type == SQLDATETIME) res_length += 10; < < res_buf = (char *) emalloc(res_length + 1); < res_length = dbconvert(NULL,column_type,dbdata(mssql_ptr->link,offset), res_length,SQLCHAR,res_buf,-1); --- > char *res_buf; > int res_length; > > if (column_type == SQLDATETIME && longdatetime ) { > /* if it is the long date time format and user wants the extended date/time (with seconds and millis)*/ > /* then output: 2001-03-15 23:06:36.000 */ > DBDATEREC dr; > > if (dbdatecrack(mssql_ptr->link,&dr,(DBDATETIME *)dbdata(mssql_ptr->link,offset)) != SUCCEED) { > php_error(E_ERROR,"MS SQL: column %d unable to convert datetime field", offset); > ZVAL_FALSE(result); > /* no further processing */ > return; > } > > res_length = 23; > res_buf = (char *) emalloc(res_length+1); > sprintf(res_buf,"%4d-%02d-%02d %02d:%02d:%02d.%03d", > dr.year,dr.month,dr.day,dr.hour,dr.minute,dr.second,dr.millisecond); > > } else { > res_length = dbdatlen(mssql_ptr->link,offset); > if (column_type == SQLDATETIM4) res_length += 14; > if (column_type == SQLDATETIME) res_length += 10; > > res_buf = (char *) emalloc(res_length + 1); > res_length = dbconvert(NULL,column_type,dbdata(mssql_ptr->link,offset), res_length,SQLCHAR,res_buf,-1); > } 814c836 < 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, long unused) 858a881,885 > /* Ugh.. It would be cleaner to fetch the longdatetime in */ > /* get_column_content_with_type, but doing the thread-safe lookup */ > /* for every row that has a datetime field seems bad also. So get it */ > /* here and pass the value in */ > long longdatetime = MS_SQL_G(longdatetime); 916c943 < 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],longdatetime));

« previous php.dev (#82864) next »