r16778 - gnucash/branches/gda-dev2/src - 1) Add write backend function so that business objects will be saved

Phil Longstaff plongstaff at cvs.gnucash.org
Tue Jan 1 13:56:14 EST 2008


Author: plongstaff
Date: 2008-01-01 13:56:13 -0500 (Tue, 01 Jan 2008)
New Revision: 16778
Trac: http://svn.gnucash.org/trac/changeset/16778

Modified:
   gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-address-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-bill-term-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-customer-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-employee-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-entry-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-invoice-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-job-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-order-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-owner-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-tax-table-gda.c
   gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-vendor-gda.c
Log:
1) Add write backend function so that business objects will be saved
during a 'save as'
2) Add function parameter checks



Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -504,6 +504,20 @@
 }
 
 static void
+write_cb( const gchar* type, gpointer data_p, gpointer be_data_p )
+{
+    GncGdaDataType_t* pData = data_p;
+    gda_backend* be_data = be_data_p;
+
+    g_return_if_fail( type != NULL && pData != NULL && be_data != NULL );
+    g_return_if_fail( pData->version == GNC_GDA_BACKEND_VERSION );
+
+    if( pData->write != NULL ) {
+        (pData->write)( be_data->be );
+    }
+}
+
+static void
 gnc_gda_sync_all( QofBackend* be, QofBook *book )
 {
     GncGdaBackend *fbe = (GncGdaBackend *) be;
@@ -566,6 +580,7 @@
     save_template_transactions( fbe, book );
     save_schedXactions( fbe, book );
     save_budgets( fbe, book );
+    qof_object_foreach_backend( GNC_GDA_BACKEND, write_cb, &be_data );
 
     LEAVE ("book=%p", book);
 }

Modified: gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h
===================================================================
--- gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/backend/gda/gnc-backend-util-gda.h	2008-01-01 18:56:13 UTC (rev 16778)
@@ -55,6 +55,7 @@
  *
  * commit()			- commit an object to the db
  * initial_load()	- load stuff when new db opened
+ * create_tables()  - create any db tables
  */
 #define GNC_GDA_BACKEND	"gnc:gda:1"
 #define GNC_GDA_BACKEND_VERSION	1
@@ -69,6 +70,7 @@
   gpointer	(*compile_query)( GncGdaBackend* pBackend, QofQuery* pQuery );
   void		(*run_query)( GncGdaBackend* pBackend, gpointer pQuery );
   void		(*free_query)( GncGdaBackend* pBackend, gpointer pQuery );
+  void		(*write)( GncGdaBackend* pBackend );
 } GncGdaDataType_t;
 
 // Type for conversion of db row to object.

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-address-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-address-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-address-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -68,7 +68,7 @@
 static void
 load_address( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     gchar* buf;
@@ -77,9 +77,15 @@
 	const col_cvt_t* subtable;
 	const gchar* s;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
     addr = gncAddressCreate( be->primary_book, NULL );
 	for( subtable = col_table; subtable->col_name != NULL; subtable++ ) {
-    	buf = g_strdup_printf( "%s_%s", table->col_name, subtable->col_name );
+    	buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable->col_name );
     	val = gda_data_model_get_value_at_col_name( pModel, buf, row );
     	g_free( buf );
     	if( gda_value_is_null( val ) ) {
@@ -108,6 +114,12 @@
     AddressGetterFunc getter;
     GncAddress* addr;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( value != NULL );
+
     memset( value, 0, sizeof( GValue ) );
 
 	getter = (AddressGetterFunc)gnc_gda_get_getter( obj_name, table_row );
@@ -128,6 +140,12 @@
 	const col_cvt_t* subtable_row;
 	gchar* buf;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( query != NULL );
+
     memset( &value, 0, sizeof( GValue ) );
     get_gvalue_address( be, obj_name, pObject, table_row, &value );
 
@@ -167,6 +185,12 @@
 	gchar* s;
 	QofAccessFunc getter;
 
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( table_row != NULL, NULL );
+	g_return_val_if_fail( query != NULL, NULL );
+
     memset( &value, 0, sizeof( GValue ) );
     get_gvalue_address( be, obj_name, pObject, table_row, &value );
 
@@ -204,6 +228,11 @@
     gchar* buf;
 	const col_cvt_t* subtable_row;
 
+	g_return_if_fail( server != NULL );
+	g_return_if_fail( cnn != NULL );
+	g_return_if_fail( array_data != NULL );
+	g_return_if_fail( table_row != NULL );
+
     dbms_type = gda_server_provider_get_default_dbms_type( server, cnn,
                                                             G_TYPE_STRING );
 	for( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ ) {

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-bill-term-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-bill-term-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-bill-term-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -75,18 +75,24 @@
 	GncBillTerm* term = GNC_BILLTERM(data);
 	gboolean b = GPOINTER_TO_INT(value);
 
+	g_return_if_fail( term != NULL );
+
 	if( b ) {
 		gncBillTermMakeInvisible( term );
 	}
 }
 
-static GncBillTerm*
+static void
 load_single_billterm( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncBillTerm* pBillTerm;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -99,8 +105,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pBillTerm) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pBillTerm) );
-
-    return pBillTerm;
 }
 
 static void
@@ -108,8 +112,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -122,15 +130,38 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_billterm( be, pModel, r );
+            load_single_billterm( be, pModel, r );
 		}
     }
 }
 
 /* ================================================================= */
 static void
+write_single_billterm( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_BILLTERM(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+    gnc_gda_save_billterm( be, term_p );
+}
+
+static void
+write_billterms( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_BILLTERM, be->primary_book, write_single_billterm, (gpointer)be );
+}
+
+/* ================================================================= */
+static void
 create_billterm_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -138,13 +169,16 @@
 void
 gnc_gda_save_billterm( GncGdaBackend* be, QofInstance* inst )
 {
-    GncBillTerm* v = GNC_BILLTERM(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( !GNC_IS_BILLTERM(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_BILLTERM, v,
+                        GNC_ID_BILLTERM, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -160,14 +194,20 @@
 static void
 load_billterm_guid( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     GUID guid;
     const GUID* pGuid;
 	GncBillTerm* term = NULL;
 
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gda_data_model_get_value_at_col_name( pModel, table_row->col_name, row );
     if( gda_value_is_null( val ) ) {
         pGuid = NULL;
     } else {
@@ -177,8 +217,8 @@
 	if( pGuid != NULL ) {
 		term = gncBillTermLookup( be->primary_book, pGuid );
 	}
-    if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, term, NULL );
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, term, NULL );
     } else {
 		(*setter)( pObject, (const gpointer)term );
     }
@@ -197,7 +237,9 @@
         GNC_ID_BILLTERM,
         gnc_gda_save_billterm,				/* commit */
         load_all_billterms,					/* initial_load */
-        create_billterm_tables				/* create_tables */
+        create_billterm_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_billterms						/* write */
     };
 
     qof_object_register_backend( GNC_ID_BILLTERM, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-customer-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-customer-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-customer-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -71,13 +71,17 @@
 	{ NULL }
 };
 
-static GncCustomer*
+static void
 load_single_customer( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID customer_guid;
 	GncCustomer* pCustomer;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     customer_guid = *guid;
 
@@ -90,8 +94,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pCustomer) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pCustomer) );
-
-    return pCustomer;
 }
 
 static void
@@ -99,8 +101,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -113,7 +119,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_customer( be, pModel, r );
+            load_single_customer( be, pModel, r );
 		}
     }
 }
@@ -122,6 +128,8 @@
 static void
 create_customer_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -129,13 +137,16 @@
 static void
 save_customer( GncGdaBackend* be, QofInstance* inst )
 {
-    GncCustomer* customer = GNC_CUSTOMER(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_CUSTOMER(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_CUSTOMER, customer,
+                        GNC_ID_CUSTOMER, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -148,6 +159,45 @@
 }
 
 /* ================================================================= */
+static gboolean
+customer_should_be_saved( GncCustomer *customer )
+{
+    const char *id;
+
+	g_return_val_if_fail( customer != NULL, FALSE );
+
+    /* Make sure this is a valid customer before we save it -- should have an ID */
+    id = gncCustomerGetID( customer );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+
+static void
+write_single_customer( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_CUSTOMER(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( customer_should_be_saved( GNC_CUSTOMER(term_p) ) ) {
+    	save_customer( be, term_p );
+	}
+}
+
+static void
+write_customers( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_CUSTOMER, be->primary_book, write_single_customer, (gpointer)be );
+}
+
+/* ================================================================= */
 void
 gnc_customer_gda_initialize( void )
 {
@@ -157,7 +207,9 @@
         GNC_ID_CUSTOMER,
         save_customer,						/* commit */
         load_all_customers,					/* initial_load */
-        create_customer_tables				/* create_tables */
+        create_customer_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_customers						/* write */
     };
 
     qof_object_register_backend( GNC_ID_CUSTOMER, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-employee-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-employee-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-employee-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -70,13 +70,17 @@
     { NULL }
 };
 
-static GncEmployee*
+static void
 load_single_employee( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID emp_guid;
 	GncEmployee* pEmployee;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     emp_guid = *guid;
 
@@ -89,8 +93,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pEmployee) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pEmployee) );
-
-    return pEmployee;
 }
 
 static void
@@ -98,9 +100,14 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
-    gnc_commodity_table* pTable = gnc_commodity_table_get_table( pBook );
+    QofBook* pBook;
+    gnc_commodity_table* pTable;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+    pTable = gnc_commodity_table_get_table( pBook );
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -113,7 +120,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_employee( be, pModel, r );
+            load_single_employee( be, pModel, r );
 		}
     }
 }
@@ -122,6 +129,8 @@
 static void
 create_employee_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -132,6 +141,10 @@
     GncEmployee* emp = GNC_EMPLOYEE(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_EMPLOYEE(inst) );
+
     // Ensure the commodity is in the db
     gnc_gda_save_commodity( be, gncEmployeeGetCurrency( emp ) );
 
@@ -151,6 +164,44 @@
 }
 
 /* ================================================================= */
+static gboolean
+employee_should_be_saved( GncEmployee *employee )
+{
+    const char *id;
+
+	g_return_val_if_fail( employee != NULL, FALSE );
+
+    /* make sure this is a valid employee before we save it -- should have an ID */
+    id = gncEmployeeGetID( employee );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+static void
+write_single_employee( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_EMPLOYEE(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( employee_should_be_saved( GNC_EMPLOYEE(term_p) ) ) {
+    	save_employee( be, term_p );
+	}
+}
+
+static void
+write_employees( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_EMPLOYEE, be->primary_book, write_single_employee, (gpointer)be );
+}
+
+/* ================================================================= */
 void
 gnc_employee_gda_initialize( void )
 {
@@ -160,7 +211,9 @@
         GNC_ID_EMPLOYEE,
         save_employee,						/* commit */
         load_all_employees,					/* initial_load */
-        create_employee_tables				/* create_tables */
+        create_employee_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_employees						/* write */
     };
 
     qof_object_register_backend( GNC_ID_EMPLOYEE, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-entry-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-entry-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-entry-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -1,7 +1,7 @@
 /********************************************************************\
- * gnc-entry-xml-v2.c -- entry xml i/o implementation         *
+ * gnc-entry-gda.c -- entry libgda backend                          *
  *                                                                  *
- * Copyright (C) 2002 Derek Atkins <warlord at MIT.EDU>                *
+ * Copyright (C) 2007-2008 Phil Longstaff (plongstaff at rogers.com)   *
  *                                                                  *
  * This program is free software; you can redistribute it and/or    *
  * modify it under the terms of the GNU General Public License as   *
@@ -46,11 +46,6 @@
 
 static QofLogModule log_module = GNC_MOD_BACKEND;
 
-static gpointer get_date( gpointer pObject, const QofParam* param );
-static void set_date( gpointer pObject, gpointer pValue );
-static gpointer get_date_entered( gpointer pObject, const QofParam* param );
-static void set_date_entered( gpointer pObject, gpointer pValue );
-
 #define TABLE_NAME "entries"
 #define MAX_DESCRIPTION_LEN 50
 #define MAX_ACTION_LEN 50
@@ -61,8 +56,8 @@
 static col_cvt_t col_table[] =
 {
 	{ "guid",          CT_GUID,        0,                   COL_NNUL, "guid" },
-	{ "date",          CT_TIMESPEC,    0,                   COL_NNUL, NULL, NULL, get_date, set_date },
-	{ "entered",       CT_TIMESPEC,    0,                   COL_NNUL, NULL, NULL, get_date_entered, set_date_entered },
+	{ "date",          CT_TIMESPEC,    0,                   COL_NNUL, NULL, ENTRY_DATE },
+	{ "entered",       CT_TIMESPEC,    0,                   COL_NNUL, NULL, ENTRY_DATE_ENTERED },
 	{ "description",   CT_STRING,      MAX_DESCRIPTION_LEN, 0,        NULL, ENTRY_DESC },
 	{ "action",        CT_STRING,      MAX_ACTION_LEN,      0,        NULL, ENTRY_ACTION },
 	{ "notes",         CT_STRING,      MAX_NOTES_LEN,       0,        NULL, ENTRY_NOTES },
@@ -89,51 +84,17 @@
 	{ NULL }
 };
 
-static gpointer
-get_date( gpointer pObject, const QofParam* param )
-{
-    const GncEntry* pEntry = GNC_ENTRY(pObject);
-    static Timespec ts;
-
-    ts = gncEntryGetDate( pEntry );
-    return (gpointer)&ts;
-}
-
-static void 
-set_date( gpointer pObject, gpointer pValue )
-{
-    GncEntry* pEntry = GNC_ENTRY(pObject);
-    Timespec* pTS = (Timespec*)pValue;
-
-    gncEntrySetDate( pEntry, *pTS );
-}
-
-static gpointer
-get_date_entered( gpointer pObject, const QofParam* param )
-{
-    const GncEntry* pEntry = GNC_ENTRY(pObject);
-    static Timespec ts;
-
-    ts = gncEntryGetDateEntered( pEntry );
-    return (gpointer)&ts;
-}
-
-static void 
-set_date_entered( gpointer pObject, gpointer pValue )
-{
-    GncEntry* pEntry = GNC_ENTRY(pObject);
-    Timespec* pTS = (Timespec*)pValue;
-
-    gncEntrySetDateEntered( pEntry, *pTS );
-}
-
-static GncEntry*
+static void
 load_single_entry( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncEntry* pEntry;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -146,8 +107,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pEntry) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pEntry) );
-
-    return pEntry;
 }
 
 static void
@@ -155,8 +114,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -169,7 +132,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_entry( be, pModel, r );
+            load_single_entry( be, pModel, r );
 		}
     }
 }
@@ -178,6 +141,8 @@
 static void
 create_entry_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -185,13 +150,16 @@
 static void
 save_entry( GncGdaBackend* be, QofInstance* inst )
 {
-    GncEntry* v = GNC_ENTRY(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_ENTRY(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_ENTRY, v,
+                        GNC_ID_ENTRY, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -204,6 +172,32 @@
 }
 
 /* ================================================================= */
+static void
+write_single_entry( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+	GncEntry* entry = GNC_ENTRY(term_p);
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_ENTRY(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+  	/* Only save if attached */
+  	if( gncEntryGetOrder( entry ) != NULL || gncEntryGetInvoice( entry ) != NULL ||
+			gncEntryGetBill( entry ) != NULL ) {
+    	save_entry( be, term_p );
+	}
+}
+
+static void
+write_entries( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_ENTRY, be->primary_book, write_single_entry, (gpointer)be );
+}
+
+/* ================================================================= */
 void
 gnc_entry_gda_initialize( void )
 {
@@ -213,7 +207,9 @@
         GNC_ID_ENTRY,
         save_entry,							/* commit */
         load_all_entries,					/* initial_load */
-        create_entry_tables					/* create_tables */
+        create_entry_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_entries						/* write */
     };
 
     qof_object_register_backend( GNC_ID_ENTRY, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-invoice-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-invoice-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-invoice-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -74,13 +74,17 @@
 	{ NULL }
 };
 
-static GncInvoice*
+static void
 load_single_invoice( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncInvoice* pInvoice;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -93,8 +97,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pInvoice) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pInvoice) );
-
-    return pInvoice;
 }
 
 static void
@@ -102,8 +104,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -116,7 +122,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_invoice( be, pModel, r );
+            load_single_invoice( be, pModel, r );
 		}
     }
 }
@@ -125,6 +131,8 @@
 static void
 create_invoice_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -132,16 +140,20 @@
 static void
 save_invoice( GncGdaBackend* be, QofInstance* inst )
 {
-    GncInvoice* v = GNC_INVOICE(inst);
     const GUID* guid;
+	GncInvoice* invoice = GNC_INVOICE(inst);
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_INVOICE(inst) );
+
     // Ensure the commodity is in the db
-    gnc_gda_save_commodity( be, gncInvoiceGetCurrency( v ) );
+    gnc_gda_save_commodity( be, gncInvoiceGetCurrency( invoice ) );
 
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_INVOICE, v,
+                        GNC_ID_INVOICE, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -154,17 +166,62 @@
 }
 
 /* ================================================================= */
+static gboolean
+invoice_should_be_saved( GncInvoice *invoice )
+{
+    const char *id;
+
+	g_return_val_if_fail( invoice != NULL, FALSE );
+
+    /* make sure this is a valid invoice before we save it -- should have an ID */
+    id = gncInvoiceGetID( invoice );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+
 static void
+write_single_invoice( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_INVOICE(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( invoice_should_be_saved( GNC_INVOICE(term_p) ) ) {
+    	save_invoice( be, term_p );
+	}
+}
+
+static void
+write_invoices( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_INVOICE, be->primary_book, write_single_invoice, (gpointer)be );
+}
+
+/* ================================================================= */
+static void
 load_invoice_guid( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     GUID guid;
     const GUID* pGuid;
 	GncInvoice* invoice = NULL;
 
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gda_data_model_get_value_at_col_name( pModel, table_row->col_name, row );
     if( gda_value_is_null( val ) ) {
         pGuid = NULL;
     } else {
@@ -174,8 +231,8 @@
 	if( pGuid != NULL ) {
 		invoice = gncInvoiceLookup( be->primary_book, pGuid );
 	}
-    if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, invoice, NULL );
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, invoice, NULL );
     } else {
 		(*setter)( pObject, (const gpointer)invoice );
     }
@@ -194,7 +251,9 @@
         GNC_ID_INVOICE,
         save_invoice,						/* commit */
         load_all_invoices,					/* initial_load */
-        create_invoice_tables				/* create_tables */
+        create_invoice_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_invoices						/* write */
     };
 
     qof_object_register_backend( GNC_ID_INVOICE, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-job-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-job-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-job-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -1,6 +1,8 @@
 /********************************************************************\
  * gnc-job-gda.c -- job gda backend                                 *
  *                                                                  *
+ * Copyright (C) 2007-2008 Phil Longstaff (plongstaff at rogers.com)   *
+ *                                                                  *
  * This program is free software; you can redistribute it and/or    *
  * modify it under the terms of the GNU General Public License as   *
  * published by the Free Software Foundation; either version 2 of   *
@@ -56,13 +58,17 @@
 	{ NULL }
 };
 
-static GncJob*
+static void
 load_single_job( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID job_guid;
 	GncJob* pJob;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     job_guid = *guid;
 
@@ -75,8 +81,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pJob) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pJob) );
-
-    return pJob;
 }
 
 static void
@@ -84,8 +88,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -98,7 +106,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_job( be, pModel, r );
+            load_single_job( be, pModel, r );
 		}
     }
 }
@@ -107,6 +115,8 @@
 static void
 create_job_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -114,13 +124,16 @@
 static void
 save_job( GncGdaBackend* be, QofInstance* inst )
 {
-    GncJob* job = GNC_JOB(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_JOB(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_JOB, job,
+                        GNC_ID_JOB, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -133,6 +146,45 @@
 }
 
 /* ================================================================= */
+static gboolean
+job_should_be_saved( GncJob *job )
+{
+    const char *id;
+
+	g_return_val_if_fail( job != NULL, FALSE );
+
+    /* make sure this is a valid job before we save it -- should have an ID */
+    id = gncJobGetID( job );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+
+static void
+write_single_job( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_JOB(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( job_should_be_saved( GNC_JOB(term_p) ) ) {
+    	save_job( be, term_p );
+	}
+}
+
+static void
+write_jobs( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_JOB, be->primary_book, write_single_job, (gpointer)be );
+}
+
+/* ================================================================= */
 void
 gnc_job_gda_initialize( void )
 {
@@ -142,7 +194,9 @@
         GNC_ID_JOB,
         save_job,						/* commit */
         load_all_jobs,					/* initial_load */
-        create_job_tables				/* create_tables */
+        create_job_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_jobs						/* write */
     };
 
     qof_object_register_backend( GNC_ID_JOB, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-order-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-order-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-order-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -59,13 +59,17 @@
 	{ NULL },
 };
 
-static GncOrder*
+static void
 load_single_order( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncOrder* pOrder;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -78,8 +82,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pOrder) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pOrder) );
-
-    return pOrder;
 }
 
 static void
@@ -87,8 +89,12 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
+    QofBook* pBook;
 
+	g_return_if_fail( be != NULL );
+
+    pBook = be->primary_book;
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -101,7 +107,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_order( be, pModel, r );
+            load_single_order( be, pModel, r );
 		}
     }
 }
@@ -110,6 +116,8 @@
 static void
 create_order_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -117,13 +125,16 @@
 static void
 save_order( GncGdaBackend* be, QofInstance* inst )
 {
-    GncOrder* v = GNC_ORDER(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_ORDER(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TABLE_NAME,
-                        GNC_ID_ORDER, v,
+                        GNC_ID_ORDER, inst,
                         col_table );
 
     // Now, commit or delete any slots
@@ -136,17 +147,62 @@
 }
 
 /* ================================================================= */
+static gboolean
+order_should_be_saved( GncOrder *order )
+{
+    const char *id;
+
+	g_return_val_if_fail( order != NULL, FALSE );
+
+    /* make sure this is a valid order before we save it -- should have an ID */
+    id = gncOrderGetID( order );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+
 static void
+write_single_order( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_ORDER(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( order_should_be_saved( GNC_ORDER(term_p) ) ) {
+    	save_order( be, term_p );
+	}
+}
+
+static void
+write_orders( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_ORDER, be->primary_book, write_single_order, (gpointer)be );
+}
+
+/* ================================================================= */
+static void
 load_order_guid( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     GUID guid;
     const GUID* pGuid;
 	GncOrder* order = NULL;
 
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gda_data_model_get_value_at_col_name( pModel, table_row->col_name, row );
     if( gda_value_is_null( val ) ) {
         pGuid = NULL;
     } else {
@@ -156,8 +212,8 @@
 	if( pGuid != NULL ) {
 		order = gncOrderLookup( be->primary_book, pGuid );
 	}
-    if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, order, NULL );
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, order, NULL );
     } else {
 		(*setter)( pObject, (const gpointer)order );
     }
@@ -176,7 +232,9 @@
         GNC_ID_ORDER,
         save_order,						/* commit */
         load_all_orders,				/* initial_load */
-        create_order_tables				/* create_tables */
+        create_order_tables,			/* create_tables */
+		NULL, NULL, NULL,
+		write_orders					/* write */
     };
 
     qof_object_register_backend( GNC_ID_ORDER, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-owner-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-owner-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-owner-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -45,24 +45,31 @@
 static void
 load_owner( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     gchar* buf;
 	GncOwnerType type;
     GUID guid;
-	QofBook* book = be->primary_book;
+	QofBook* book;
 	GncOwner owner;
 
-    buf = g_strdup_printf( "%s_type", table->col_name );
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+	book = be->primary_book;
+    buf = g_strdup_printf( "%s_type", table_row->col_name );
     val = gda_data_model_get_value_at_col_name( pModel, buf, row );
 	type = (GncOwnerType)g_value_get_int( val );
     g_free( buf );
-    buf = g_strdup_printf( "%s_guid", table->col_name );
+    buf = g_strdup_printf( "%s_guid", table_row->col_name );
     val = gda_data_model_get_value_at_col_name( pModel, buf, row );
     g_free( buf );
 
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+    val = gda_data_model_get_value_at_col_name( pModel, table_row->col_name, row );
     if( !gda_value_is_null( val ) ) {
         string_to_guid( g_value_get_string( val ), &guid );
     }
@@ -116,8 +123,8 @@
     	PWARN("Invalid owner type: %d\n", type );
 	}
 
-	if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, &owner, NULL );
+	if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, &owner, NULL );
 	} else {
     	(*setter)( pObject, &owner );
 	}
@@ -130,6 +137,12 @@
     OwnerGetterFunc getter;
     GncOwner* owner;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( value != NULL );
+
     memset( value, 0, sizeof( GValue ) );
 
 	getter = (OwnerGetterFunc)gnc_gda_get_getter( obj_name, table_row );
@@ -151,6 +164,12 @@
 	GncOwnerType type;
 	QofInstance* inst = NULL;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( obj_name != NULL );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+	g_return_if_fail( query != NULL );
+
     memset( &value, 0, sizeof( GValue ) );
     get_gvalue_owner( be, obj_name, pObject, table_row, &value );
 
@@ -214,6 +233,12 @@
     GdaQueryCondition* sub_cond;
     GdaQueryCondition* cond;
 
+	g_return_val_if_fail( be != NULL, NULL );
+	g_return_val_if_fail( obj_name != NULL, NULL );
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( table_row != NULL, NULL );
+	g_return_val_if_fail( query != NULL, NULL );
+
     memset( &value, 0, sizeof( GValue ) );
     get_gvalue_owner( be, obj_name, pObject, table_row, &value );
     cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_NODE_AND );
@@ -275,6 +300,11 @@
     gchar* buf;
 	const col_cvt_t* subtable_row;
 
+	g_return_if_fail( server != NULL );
+	g_return_if_fail( cnn != NULL );
+	g_return_if_fail( array_data != NULL );
+	g_return_if_fail( table_row != NULL );
+
     dbms_type = gda_server_provider_get_default_dbms_type( server, cnn, G_TYPE_INT );
     buf = g_strdup_printf( "%s_type", table_row->col_name );
    	gnc_gda_add_table_column( server, cnn, array_data, buf, dbms_type, table_row->size, table_row->flags );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-tax-table-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-tax-table-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-tax-table-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -49,8 +49,6 @@
     const GUID* guid;
 } guid_info_t;
 
-static gpointer get_id( gpointer pObject, const QofParam* param );
-static void set_id( gpointer pObject, gpointer pValue );
 static gpointer get_obj_guid( gpointer pObject, const QofParam* param );
 static void set_obj_guid( gpointer pObject, gpointer pValue );
 static gpointer get_child( gpointer pObject, const QofParam* param );
@@ -99,23 +97,12 @@
 };
 
 static gpointer
-get_id( gpointer pObject, const QofParam* param )
-{
-    // Just need a 0 to force a new id
-    return (gpointer)0;
-}
-
-static void
-set_id( gpointer pObject, gpointer pValue )
-{
-    // Nowhere to put the ID
-}
-
-static gpointer
 get_obj_guid( gpointer pObject, const QofParam* param )
 {
     guid_info_t* pInfo = (guid_info_t*)pObject;
 
+	g_return_val_if_fail( pInfo != NULL, NULL );
+
     return (gpointer)pInfo->guid;
 }
 
@@ -131,6 +118,9 @@
 	GncTaxTable* tt = GNC_TAXTABLE(data);
 	gboolean b = GPOINTER_TO_INT(value);
 
+	g_return_if_fail( data != NULL );
+	g_return_if_fail( GNC_IS_TAXTABLE(data) );
+
 	if( b ) {
 		gncTaxTableMakeInvisible( tt );
 	}
@@ -140,6 +130,10 @@
 get_child( gpointer pObject, const QofParam* param )
 {
 	GncTaxTable* tt = GNC_TAXTABLE(pObject);
+
+	g_return_val_if_fail( pObject != NULL, NULL );
+	g_return_val_if_fail( GNC_IS_TAXTABLE(pObject), NULL );
+
 	return gncTaxTableGetChild( tt );
 }
 
@@ -149,6 +143,9 @@
 	GncTaxTable* tt = GNC_TAXTABLE(data);
 	GncTaxTable* parent;
 
+	g_return_if_fail( data != NULL );
+	g_return_if_fail( GNC_IS_TAXTABLE(data) );
+
 	if( value != NULL ) {
 		parent = GNC_TAXTABLE(value);
 		gncTaxTableSetParent( tt, parent );
@@ -159,6 +156,12 @@
 load_single_ttentry( GncGdaBackend* be, GdaDataModel* pModel, int row, GncTaxTable* tt )
 {
 	GncTaxTableEntry* e = gncTaxTableEntryCreate();
+
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( tt != NULL );
+
     gnc_gda_load_object( be, pModel, row, GNC_ID_TAXTABLE, e, ttentries_col_table );
 	gncTaxTableAddEntry( tt, e );
 }
@@ -172,6 +175,9 @@
     GdaQueryCondition* cond;
     GValue value;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( tt != NULL );
+
     guid_to_string_buff( qof_instance_get_guid( QOF_INSTANCE(tt) ), guid_buf );
     memset( &value, 0, sizeof( GValue ) );
     g_value_init( &value, G_TYPE_STRING );
@@ -194,13 +200,17 @@
     }
 }
 
-static GncTaxTable*
+static void
 load_single_taxtable( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncTaxTable* tt;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -214,8 +224,6 @@
 	load_taxtable_entries( be, tt );
 
     qof_instance_mark_clean( QOF_INSTANCE(tt) );
-
-    return tt;
 }
 
 static void
@@ -223,8 +231,9 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
 
+	g_return_if_fail( be != NULL );
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TT_TABLE_NAME );
@@ -237,7 +246,7 @@
         int r;
 
         for( r = 0; r < numRows; r++ ) {
-            (void)load_single_taxtable( be, pModel, r );
+            load_single_taxtable( be, pModel, r );
 		}
     }
 }
@@ -246,6 +255,8 @@
 static void
 create_taxtable_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TT_TABLE_NAME, tt_col_table );
     gnc_gda_create_table_if_needed( be, TTENTRIES_TABLE_NAME, ttentries_col_table );
 }
@@ -256,6 +267,9 @@
 {
     guid_info_t guid_info;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( guid != NULL );
+
     guid_info.be = be;
     guid_info.guid = guid;
     (void)gnc_gda_do_db_operation( be, OP_DB_DELETE, TTENTRIES_TABLE_NAME,
@@ -267,6 +281,9 @@
 {
 	GList* entry;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( guid != NULL );
+
     /* First, delete the old slots for this object */
     delete_all_tt_entries( be, guid );
 
@@ -286,6 +303,10 @@
     GncTaxTable* tt = GNC_TAXTABLE(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_TAXTABLE(inst) );
+
     (void)gnc_gda_do_db_operation( be,
                         (qof_instance_get_destroying(inst) ? OP_DB_DELETE : OP_DB_ADD_OR_UPDATE ),
                         TT_TABLE_NAME,
@@ -305,16 +326,43 @@
 
 /* ================================================================= */
 static void
+write_single_taxtable( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_TAXTABLE(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+    save_taxtable( be, term_p );
+}
+
+static void
+write_taxtables( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_TAXTABLE, be->primary_book, write_single_taxtable, (gpointer)be );
+}
+
+/* ================================================================= */
+static void
 load_taxtable_guid( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
             QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
+            const col_cvt_t* table_row )
 {
     const GValue* val;
     GUID guid;
     const GUID* pGuid;
 	GncTaxTable* taxtable = NULL;
 
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+	g_return_if_fail( pObject != NULL );
+	g_return_if_fail( table_row != NULL );
+
+    val = gda_data_model_get_value_at_col_name( pModel, table_row->col_name, row );
     if( gda_value_is_null( val ) ) {
         pGuid = NULL;
     } else {
@@ -324,8 +372,8 @@
 	if( pGuid != NULL ) {
 		taxtable = gncTaxTableLookup( be->primary_book, pGuid );
 	}
-    if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, taxtable, NULL );
+    if( table_row->gobj_param_name != NULL ) {
+		g_object_set( pObject, table_row->gobj_param_name, taxtable, NULL );
     } else {
 		(*setter)( pObject, (const gpointer)taxtable );
     }
@@ -344,7 +392,9 @@
         GNC_ID_TAXTABLE,
         save_taxtable,						/* commit */
         load_all_taxtables,					/* initial_load */
-        create_taxtable_tables				/* create_tables */
+        create_taxtable_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_taxtables						/* write */
     };
 
     qof_object_register_backend( GNC_ID_TAXTABLE, GNC_GDA_BACKEND, &be_data );

Modified: gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-vendor-gda.c
===================================================================
--- gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-vendor-gda.c	2007-12-31 18:52:32 UTC (rev 16777)
+++ gnucash/branches/gda-dev2/src/business/business-core/gda/gnc-vendor-gda.c	2008-01-01 18:56:13 UTC (rev 16778)
@@ -74,13 +74,17 @@
 	{ NULL }
 };
 
-static GncVendor*
+static void
 load_single_vendor( GncGdaBackend* be, GdaDataModel* pModel, int row )
 {
     const GUID* guid;
     GUID v_guid;
 	GncVendor* pVendor;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( pModel != NULL );
+	g_return_if_fail( row >= 0 );
+
     guid = gnc_gda_load_guid( be, pModel, row );
     v_guid = *guid;
 
@@ -93,8 +97,6 @@
                         qof_instance_get_slots( QOF_INSTANCE(pVendor) ) );
 
     qof_instance_mark_clean( QOF_INSTANCE(pVendor) );
-
-    return pVendor;
 }
 
 static void
@@ -102,8 +104,9 @@
 {
     static GdaQuery* query = NULL;
     GdaObject* ret;
-    QofBook* pBook = be->primary_book;
 
+	g_return_if_fail( be != NULL );
+
     /* First time, create the query */
     if( query == NULL ) {
         query = gnc_gda_create_select_query( be, TABLE_NAME );
@@ -125,6 +128,8 @@
 static void
 create_vendor_tables( GncGdaBackend* be )
 {
+	g_return_if_fail( be != NULL );
+
     gnc_gda_create_table_if_needed( be, TABLE_NAME, col_table );
 }
 
@@ -135,6 +140,10 @@
     GncVendor* v = GNC_VENDOR(inst);
     const GUID* guid;
 
+	g_return_if_fail( be != NULL );
+	g_return_if_fail( inst != NULL );
+	g_return_if_fail( GNC_IS_VENDOR(inst) );
+
     // Ensure the commodity is in the db
     gnc_gda_save_commodity( be, gncVendorGetCurrency( v ) );
 
@@ -154,6 +163,45 @@
 }
 
 /* ================================================================= */
+static gboolean
+vendor_should_be_saved( GncVendor *vendor )
+{
+    const char *id;
+
+	g_return_val_if_fail( vendor != NULL, FALSE );
+
+    /* make sure this is a valid vendor before we save it -- should have an ID */
+    id = gncVendorGetID( vendor );
+    if( id == NULL || *id == '\0' ) {
+        return FALSE;
+	}
+
+    return TRUE;
+}
+
+static void
+write_single_vendor( QofInstance *term_p, gpointer be_p )
+{
+    GncGdaBackend* be = (GncGdaBackend*)be_p;
+
+	g_return_if_fail( term_p != NULL );
+	g_return_if_fail( GNC_IS_VENDOR(term_p) );
+	g_return_if_fail( be_p != NULL );
+
+	if( vendor_should_be_saved( GNC_VENDOR(term_p) ) ) {
+    	save_vendor( be, term_p );
+	}
+}
+
+static void
+write_vendors( GncGdaBackend* be )
+{
+	g_return_if_fail( be != NULL );
+
+    qof_object_foreach( GNC_ID_VENDOR, be->primary_book, write_single_vendor, (gpointer)be );
+}
+
+/* ================================================================= */
 void
 gnc_vendor_gda_initialize( void )
 {
@@ -163,7 +211,9 @@
         GNC_ID_VENDOR,
         save_vendor,						/* commit */
         load_all_vendors,					/* initial_load */
-        create_vendor_tables				/* create_tables */
+        create_vendor_tables,				/* create_tables */
+		NULL, NULL, NULL,
+		write_vendors						/* write */
     };
 
     qof_object_register_backend( GNC_ID_VENDOR, GNC_GDA_BACKEND, &be_data );



More information about the gnucash-changes mailing list