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