r18273 - gnucash/trunk/src/backend - Fix bug 592719 - postgres backend aborts with date problems on transactions
Phil Longstaff
plongstaff at code.gnucash.org
Sat Aug 22 20:54:24 EDT 2009
Author: plongstaff
Date: 2009-08-22 20:54:23 -0400 (Sat, 22 Aug 2009)
New Revision: 18273
Trac: http://svn.gnucash.org/trac/changeset/18273
Modified:
gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
gnucash/trunk/src/backend/sql/gnc-backend-sql.c
Log:
Fix bug 592719 - postgres backend aborts with date problems on transactions
Store invalid dates as NULL in the database, and when loading a NULL, that date doesn't need
to be set.
Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2009-08-22 21:10:42 UTC (rev 18272)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c 2009-08-23 00:54:23 UTC (rev 18273)
@@ -1011,6 +1011,8 @@
GncDbiSqlRow* dbi_row = (GncDbiSqlRow*)row;
gushort type;
GValue* value;
+ time_t time;
+ struct tm tm_struct;
type = dbi_result_get_field_type( dbi_row->result, col_name );
value = g_new0( GValue, 1 );
@@ -1029,8 +1031,21 @@
(void)g_value_init( value, G_TYPE_STRING );
g_value_take_string( value, dbi_result_get_string_copy( dbi_row->result, col_name ) );
break;
+ case DBI_TYPE_DATETIME:
+ if( dbi_result_field_is_null( dbi_row->result, col_name ) ) {
+ return NULL;
+ } else {
+ time = dbi_result_get_datetime( dbi_row->result, col_name );
+ (void)gmtime_r( &time, &tm_struct );
+ (void)g_value_init( value, G_TYPE_STRING );
+ g_value_take_string( value,
+ g_strdup_printf( "%d%02d%02d%02d%02d%02d",
+ 1900+tm_struct.tm_year, tm_struct.tm_mon+1, tm_struct.tm_mday,
+ tm_struct.tm_hour, tm_struct.tm_min, tm_struct.tm_sec ) );
+ }
+ break;
default:
- PERR( "Unknown DBI_TYPE: %d\n", type );
+ PERR( "Field %s: unknown DBI_TYPE: %d\n", col_name, type );
g_free( value );
return NULL;
}
Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2009-08-22 21:10:42 UTC (rev 18272)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.c 2009-08-23 00:54:23 UTC (rev 18273)
@@ -1687,11 +1687,7 @@
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
- if( val == NULL ) {
- date = g_date_new_dmy( (GDateDay)1, 1, 1970 );
- (*setter)( pObject, date );
- g_date_free( date );
- } else {
+ if( val != NULL ) {
if( G_VALUE_HOLDS_STRING( val ) ) {
// Format of date is YYYYMMDD
const gchar* s = g_value_get_string( val );
@@ -1706,7 +1702,8 @@
strncpy( buf, &s[4], 2 );
buf[2] = '\0';
month = (guint)atoi( buf );
- day = (GDateDay)atoi( &s[6] );
+ strncpy( buf, &s[6], 2 );
+ day = (GDateDay)atoi( buf );
if( year != 0 || month != 0 || day != (GDateDay)0 ) {
date = g_date_new_dmy( day, month, year );
@@ -1753,11 +1750,13 @@
g_assert( value != NULL );
getter = gnc_sql_get_getter( obj_name, table_row );
if( getter != NULL ) {
+ (void)g_value_init( value, G_TYPE_STRING );
date = (GDate*)(*getter)( pObject, NULL );
- buf = g_strdup_printf( "%04d%02d%02d",
+ if( g_date_valid( date ) ) {
+ buf = g_strdup_printf( "%04d%02d%02d",
g_date_get_year( date ), g_date_get_month( date ), g_date_get_day( date ) );
- (void)g_value_init( value, G_TYPE_STRING );
- g_value_take_string( value, buf );
+ g_value_take_string( value, buf );
+ }
}
(*pList) = g_slist_append( (*pList), value );
More information about the gnucash-changes
mailing list