r16696 - gnucash/branches/gda-dev/src - Add CT_ADDRESS column type for business objects. Saves and restores

Phil Longstaff plongstaff at cvs.gnucash.org
Sat Dec 22 15:03:18 EST 2007


Author: plongstaff
Date: 2007-12-22 15:03:18 -0500 (Sat, 22 Dec 2007)
New Revision: 16696
Trac: http://svn.gnucash.org/trac/changeset/16696

Added:
   gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.c
   gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.h
Modified:
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h
   gnucash/branches/gda-dev/src/business/business-core/gda/Makefile.am
   gnucash/branches/gda-dev/src/business/business-core/gda/gnc-customer-gda.c
   gnucash/branches/gda-dev/src/business/business-core/gda/gnc-employee-gda.c
   gnucash/branches/gda-dev/src/business/business-core/gda/gnc-vendor-gda.c
   gnucash/branches/gda-dev/src/business/business-core/gda/gncmod-business-backend-gda.c
Log:
Add CT_ADDRESS column type for business objects.  Saves and restores
addresses as a series of columns.


Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -43,10 +43,6 @@
 #include "gnc-backend-util-gda.h"
 #include "gnc-gconf-utils.h"
 
-static void add_table_column( GdaServerProvider* server, GdaConnection* cnn,
-            xmlNodePtr array_data, const gchar* arg, const gchar* dbms_type,
-            gint size, gint flags );
-
 typedef struct {
     QofIdType searchObj;
     gpointer pCompiledQuery;
@@ -85,8 +81,8 @@
 #endif
 
 /* ================================================================= */
-static void
-add_field_to_query( GdaQuery* query, const gchar* col_name, const GValue* value )
+void
+gnc_gda_add_field_to_query( GdaQuery* query, const gchar* col_name, const GValue* value )
 {
     GdaQueryField* field;
     GdaQueryField* field_value;
@@ -132,8 +128,8 @@
     return cond;
 }
 /* ----------------------------------------------------------------- */
-static QofAccessFunc
-get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row )
+QofAccessFunc
+gnc_gda_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row )
 {
     QofAccessFunc getter;
 
@@ -179,7 +175,7 @@
 	if( table_row->gobj_param_name != NULL ) {
 		g_object_get( pObject, table_row->gobj_param_name, &s, NULL );
 	} else {
-    	getter = get_getter( obj_name, table_row );
+    	getter = gnc_gda_get_getter( obj_name, table_row );
     	s = (gchar*)(*getter)( pObject, NULL );
 	}
     if( s ) {
@@ -195,7 +191,7 @@
     GValue value;
 
     get_gvalue_string( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -217,7 +213,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_STRING );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -256,7 +252,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     int_value = GPOINTER_TO_INT((*getter)( pObject, NULL ));
     g_value_init( value, G_TYPE_INT );
     g_value_set_int( value, int_value );
@@ -269,7 +265,7 @@
     GValue value;
 
     get_gvalue_int( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -290,7 +286,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_INT );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -329,7 +325,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     int_value = GPOINTER_TO_INT((*getter)( pObject, NULL ));
     g_value_init( value, G_TYPE_INT );
     g_value_set_int( value, int_value );
@@ -342,7 +338,7 @@
     GValue value;
 
     get_gvalue_int( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -363,7 +359,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_INT );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -398,7 +394,7 @@
     QofAccessFunc getter;
 
     memset( value, 0, sizeof( GValue ) );
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     pInt64 = (*getter)( pObject, NULL );
     if( pInt64 != NULL ) {
         i64_value = *pInt64;
@@ -414,7 +410,7 @@
     GValue value;
 
     get_gvalue_int64( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -435,7 +431,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_INT64 );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -471,7 +467,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     pDouble = (*getter)( pObject, NULL );
     if( pDouble != NULL ) {
         d_value = *pDouble;
@@ -487,7 +483,7 @@
     GValue value;
 
     get_gvalue_double( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -508,7 +504,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_INT64 );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -553,7 +549,7 @@
 	if( table_row->gobj_param_name != NULL ) {
 		g_object_get( pObject, table_row->gobj_param_name, &guid, NULL );
 	} else {
-    	getter = get_getter( obj_name, table_row );
+    	getter = gnc_gda_get_getter( obj_name, table_row );
     	guid = (*getter)( pObject, NULL );
 	}
     if( guid != NULL ) {
@@ -570,7 +566,7 @@
     GValue value;
 
     get_gvalue_guid( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -587,7 +583,7 @@
 create_guid_col( GdaServerProvider* server, GdaConnection* cnn,
             xmlNodePtr array_data, const col_cvt_t* table_row, gboolean pkey )
 {
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     "char", GUID_ENCODING_LENGTH, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -610,7 +606,7 @@
 	if( table_row->gobj_param_name != NULL ) {
 		g_object_get( pObject, table_row->gobj_param_name, &inst, NULL );
 	} else {
-    	getter = get_getter( obj_name, table_row );
+    	getter = gnc_gda_get_getter( obj_name, table_row );
     	inst = (*getter)( pObject, NULL );
 	}
 	if( inst != NULL ) {
@@ -630,7 +626,7 @@
     GValue value;
 
     get_gvalue_objectref_guid( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 GdaQueryCondition*
@@ -647,7 +643,7 @@
 gnc_gda_create_objectref_guid_col( GdaServerProvider* server, GdaConnection* cnn,
             xmlNodePtr array_data, const col_cvt_t* table_row, gboolean pkey )
 {
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     "char", GUID_ENCODING_LENGTH, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -793,7 +789,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     pTimespec = (Timespec*)(*getter)( pObject, NULL );
     if( pTimespec != NULL ) {
         GDate* date;
@@ -816,7 +812,7 @@
     GValue value;
 
     get_gvalue_timespec( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -837,7 +833,7 @@
 
     dbms_type = gda_server_provider_get_default_dbms_type( server,
                                                         cnn, G_TYPE_DATE );
-    add_table_column( server, cnn, array_data, table_row->col_name,
+    gnc_gda_add_table_column( server, cnn, array_data, table_row->col_name,
                     dbms_type, table_row->size, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
@@ -890,7 +886,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = get_getter( obj_name, table_row );
+    getter = gnc_gda_get_getter( obj_name, table_row );
     date = (GDate*)(*getter)( pObject, NULL );
     if( date != NULL ) {
         g_value_init( value, G_TYPE_DATE );
@@ -905,7 +901,7 @@
     GValue value;
 
     get_gvalue_date( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
+    gnc_gda_add_field_to_query( query, table_row->col_name, &value );
 }
 
 static GdaQueryCondition*
@@ -992,7 +988,7 @@
 
     memset( value, 0, sizeof( GValue ) );
 
-    getter = (NumericGetterFunc)get_getter( obj_name, table_row );
+    getter = (NumericGetterFunc)gnc_gda_get_getter( obj_name, table_row );
     n = (*getter)( pObject );
     g_value_init( value, gnc_numeric_get_type() );
     g_value_set_boxed( value, &n );
@@ -1022,10 +1018,10 @@
     }
 
     s = g_strdup_printf( "%s_num", table_row->col_name );
-    add_field_to_query( query, s, &num_value );
+    gnc_gda_add_field_to_query( query, s, &num_value );
     g_free( s );
     s = g_strdup_printf( "%s_denom", table_row->col_name );
-    add_field_to_query( query, s, &denom_value );
+    gnc_gda_add_field_to_query( query, s, &denom_value );
     g_free( s );
 }
 
@@ -1056,10 +1052,10 @@
     }
 
     s = g_strdup_printf( "%s_num", table_row->col_name );
-    num_cond = gnc_gda_create_condition_from_field( query, table_row->col_name, &value );
+    num_cond = gnc_gda_create_condition_from_field( query, s, &value );
     g_free( s );
     s = g_strdup_printf( "%s_denom", table_row->col_name );
-    denom_cond = gnc_gda_create_condition_from_field( query, table_row->col_name, &value );
+    denom_cond = gnc_gda_create_condition_from_field( query, s, &value );
     g_free( s );
 
     cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_NODE_AND );
@@ -1079,11 +1075,11 @@
     dbms_type = gda_server_provider_get_default_dbms_type( server, cnn,
                                                             G_TYPE_INT64 );
     buf = g_strdup_printf( "%s_num", table_row->col_name );
-    add_table_column( server, cnn, array_data, buf, dbms_type,
+    gnc_gda_add_table_column( server, cnn, array_data, buf, dbms_type,
                         table_row->size, table_row->flags );
     g_free( buf );
     buf = g_strdup_printf( "%s_denom", table_row->col_name );
-    add_table_column( server, cnn, array_data, buf, dbms_type,
+    gnc_gda_add_table_column( server, cnn, array_data, buf, dbms_type,
                         table_row->size, table_row->flags );
     g_free( buf );
 }
@@ -1096,7 +1092,7 @@
 static GHashTable* g_columnTypeHash = NULL;
 
 void
-gnc_gda_register_column_handler( const gchar* colType, const col_type_handler_t* handler )
+gnc_gda_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler )
 {
 	if( g_columnTypeHash == NULL ) {
 		g_columnTypeHash = g_hash_table_new( g_str_hash, g_str_equal );
@@ -1121,18 +1117,18 @@
 void
 gnc_gda_register_standard_col_type_handlers( void )
 {
-	gnc_gda_register_column_handler( CT_STRING, &string_handler );
-    gnc_gda_register_column_handler( CT_BOOLEAN, &boolean_handler );
-    gnc_gda_register_column_handler( CT_INT, &int_handler );
-    gnc_gda_register_column_handler( CT_INT64, &int64_handler );
-    gnc_gda_register_column_handler( CT_DOUBLE, &double_handler );
-    gnc_gda_register_column_handler( CT_GUID, &guid_handler );
-	gnc_gda_register_column_handler( CT_ACCOUNTREF, &account_guid_handler );
-	gnc_gda_register_column_handler( CT_COMMODITYREF, &commodity_guid_handler );
-	gnc_gda_register_column_handler( CT_TXREF, &tx_guid_handler );
-    gnc_gda_register_column_handler( CT_TIMESPEC, &timespec_handler );
-    gnc_gda_register_column_handler( CT_GDATE, &date_handler );
-    gnc_gda_register_column_handler( CT_NUMERIC, &numeric_handler );
+	gnc_gda_register_col_type_handler( CT_STRING, &string_handler );
+    gnc_gda_register_col_type_handler( CT_BOOLEAN, &boolean_handler );
+    gnc_gda_register_col_type_handler( CT_INT, &int_handler );
+    gnc_gda_register_col_type_handler( CT_INT64, &int64_handler );
+    gnc_gda_register_col_type_handler( CT_DOUBLE, &double_handler );
+    gnc_gda_register_col_type_handler( CT_GUID, &guid_handler );
+	gnc_gda_register_col_type_handler( CT_ACCOUNTREF, &account_guid_handler );
+	gnc_gda_register_col_type_handler( CT_COMMODITYREF, &commodity_guid_handler );
+	gnc_gda_register_col_type_handler( CT_TXREF, &tx_guid_handler );
+    gnc_gda_register_col_type_handler( CT_TIMESPEC, &timespec_handler );
+    gnc_gda_register_col_type_handler( CT_GDATE, &date_handler );
+    gnc_gda_register_col_type_handler( CT_NUMERIC, &numeric_handler );
 }
 
 static void retrieve_guid( gpointer pObject, gpointer pValue );
@@ -1474,8 +1470,8 @@
 }
 
 /* ================================================================= */
-static void
-add_table_column( GdaServerProvider* server, GdaConnection* cnn,
+void
+gnc_gda_add_table_column( GdaServerProvider* server, GdaConnection* cnn,
             xmlNodePtr array_data, const gchar* arg, const gchar* dbms_type,
             gint size, gint flags )
 {

Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h	2007-12-22 20:03:18 UTC (rev 16696)
@@ -125,6 +125,11 @@
     GNC_GDA_GET_GVALUE_COND_FN  get_gvalue_cond_fn;
 } col_type_handler_t;
 
+QofAccessFunc gnc_gda_get_getter( QofIdTypeConst obj_name, const col_cvt_t* table_row );
+void gnc_gda_add_table_column( GdaServerProvider* server, GdaConnection* cnn,
+            xmlNodePtr array_data, const gchar* arg, const gchar* dbms_type,
+            gint size, gint flags );
+
 gboolean gnc_gda_do_db_operation( GncGdaBackend* pBackend,
 									E_DB_OPERATION op,
 									const gchar* table_name,
@@ -169,8 +174,9 @@
 GdaQueryCondition* gnc_gda_create_condition_from_field( GdaQuery* query,
 														const gchar* col_name,
 														const GValue* value );
-void gnc_gda_register_column_handler( const gchar* colType, const col_type_handler_t* handler );
+void gnc_gda_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler );
 void gnc_gda_register_standard_col_type_handlers( void );
+void gnc_gda_add_field_to_query( GdaQuery* query, const gchar* col_name, const GValue* value );
 
 void gnc_gda_get_gvalue_objectref_guid_for_query( const GncGdaBackend* be, QofIdTypeConst obj_name,
                 const gpointer pObject, const col_cvt_t* table_row, GdaQuery* query );

Modified: gnucash/branches/gda-dev/src/business/business-core/gda/Makefile.am
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/Makefile.am	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/Makefile.am	2007-12-22 20:03:18 UTC (rev 16696)
@@ -15,6 +15,7 @@
 
 libgncmod_business_backend_gda_la_SOURCES = \
   gncmod-business-backend-gda.c \
+  gnc-address-gda.c \
   gnc-customer-gda.c \
   gnc-employee-gda.c \
   gnc-invoice-gda.c \
@@ -23,18 +24,10 @@
   gnc-vendor-gda.c
 
 #libgncmod_business_backend_gda_la_SOURCES = \
-#  gncmod-business-backend-gda.c \
-#  gnc-address-gda.c \
 #  gnc-bill-term-gda.c \
-#  gnc-customer-gda.c \
-#  gnc-employee-gda.c \
 #  gnc-entry-gda.c \
-#  gnc-invoice-gda.c \
-#  gnc-job-gda.c \
-#  gnc-order-gda.c \
 #  gnc-owner-gda.c \
-#  gnc-tax-table-gda.c \
-#  gnc-vendor-gda.c
+#  gnc-tax-table-gda.c
 
 noinst_HEADERS = \
   gnc-address-gda.h \

Added: gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.c	                        (rev 0)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -0,0 +1,226 @@
+/********************************************************************\
+ * gnc-address-gda.c -- address gda backend implementation          *
+ *                                                                  *
+ * 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   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+ *                                                                  *
+\********************************************************************/
+
+/** @file gnc-address-gda.c
+ *  @brief load and save address data to SQL via libgda
+ *  @author Copyright (c) 2007 Phil Longstaff <plongstaff at rogers.com>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an SQL database via libgda
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libgda/libgda.h>
+
+#include "gnc-engine.h"
+#include "gnc-address-gda.h"
+
+#include "gnc-backend-util-gda.h"
+
+static QofLogModule log_module = GNC_MOD_BACKEND;
+
+#define ADDRESS_MAX_NAME_LEN 50
+#define ADDRESS_MAX_ADDRESS_LINE_LEN 50
+#define ADDRESS_MAX_PHONE_LEN 40
+#define ADDRESS_MAX_FAX_LEN 40
+#define ADDRESS_MAX_EMAIL_LEN 40
+
+static col_cvt_t col_table[] =
+{
+	{ "name",  CT_STRING, ADDRESS_MAX_NAME_LEN,         COL_NNUL, NULL, ADDRESS_NAME },
+	{ "addr1", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_ONE },
+	{ "addr2", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_TWO },
+	{ "addr3", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_THREE },
+	{ "addr4", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_FOUR },
+	{ "phone", CT_STRING, ADDRESS_MAX_PHONE_LEN,        COL_NNUL, NULL, ADDRESS_PHONE },
+	{ "fax",   CT_STRING, ADDRESS_MAX_FAX_LEN,          COL_NNUL, NULL, ADDRESS_FAX },
+	{ "email", CT_STRING, ADDRESS_MAX_EMAIL_LEN,        COL_NNUL, NULL, ADDRESS_EMAIL },
+	{ NULL }
+};
+
+typedef void (*AddressSetterFunc)( gpointer, GncAddress* );
+typedef GncAddress* (*AddressGetterFunc)( const gpointer );
+
+static void
+load_address( const GncGdaBackend* be, GdaDataModel* pModel, gint row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table )
+{
+    const GValue* val;
+    gchar* buf;
+    GncAddress* addr;
+	AddressSetterFunc a_setter = (AddressSetterFunc)setter;
+	const col_cvt_t* subtable;
+	const gchar* s;
+
+    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 );
+    	val = gda_data_model_get_value_at_col_name( pModel, buf, row );
+    	g_free( buf );
+    	if( gda_value_is_null( val ) ) {
+        	s = NULL;
+    	} else {
+        	s = g_value_get_string( val );
+    	}
+    	if( subtable->gobj_param_name != NULL ) {
+			g_object_set( addr, subtable->gobj_param_name, s, NULL );
+    	} else {
+	        if( subtable->param_name != NULL ) {
+            	setter = qof_class_get_parameter_setter( GNC_ID_ADDRESS, subtable->param_name );
+        	} else {
+            	setter = subtable->setter;
+        	}
+			(*setter)( addr, (const gpointer)s );
+    	}
+    }
+    (*a_setter)( pObject, addr );
+}
+
+static void
+get_gvalue_address( const GncGdaBackend* be, QofIdTypeConst obj_name, const gpointer pObject,
+                	const col_cvt_t* table_row, GValue* value )
+{
+    AddressGetterFunc getter;
+    GncAddress* addr;
+
+    memset( value, 0, sizeof( GValue ) );
+
+	getter = (AddressGetterFunc)gnc_gda_get_getter( obj_name, table_row );
+    addr = (*getter)( pObject );
+    g_value_init( value, gnc_address_get_type() );
+    g_value_set_object( value, addr );
+}
+
+static void
+get_gvalue_address_for_query( const GncGdaBackend* be, QofIdTypeConst obj_name,
+                			const gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+    GValue value;
+    GValue subfield_value;
+    GncAddress* addr;
+    gchar* s;
+    QofAccessFunc getter;
+	const col_cvt_t* subtable_row;
+	gchar* buf;
+
+    memset( &value, 0, sizeof( GValue ) );
+    get_gvalue_address( be, obj_name, pObject, table_row, &value );
+
+    if( G_VALUE_TYPE(&value) != 0 ) {
+        addr = g_value_get_object( &value );
+		for( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ ) {
+    		buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
+			
+    		memset( &subfield_value, 0, sizeof( GValue ) );
+			if( subtable_row->gobj_param_name != NULL ) {
+				g_object_get( addr, subtable_row->gobj_param_name, &s, NULL );
+			} else {
+    			getter = gnc_gda_get_getter( GNC_ID_ADDRESS, subtable_row );
+    			s = (gchar*)(*getter)( addr, NULL );
+			}
+    		if( s ) {
+        		g_value_init( &subfield_value, G_TYPE_STRING );
+        		g_value_set_string( &subfield_value, s );
+			}
+    		gnc_gda_add_field_to_query( query, buf, &subfield_value );
+			g_free( buf );
+		}
+    }
+}
+
+static GdaQueryCondition*
+get_gvalue_address_cond( const GncGdaBackend* be, QofIdTypeConst obj_name,
+                const gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
+{
+    GValue value;
+	GValue subfield_value;
+    GncAddress* addr;
+    gchar* buf;
+    GdaQueryCondition* sub_cond;
+    GdaQueryCondition* cond;
+	const col_cvt_t* subtable_row;
+	gchar* s;
+	QofAccessFunc getter;
+
+    memset( &value, 0, sizeof( GValue ) );
+    get_gvalue_address( be, obj_name, pObject, table_row, &value );
+
+    cond = gda_query_condition_new( query, GDA_QUERY_CONDITION_NODE_AND );
+    if( G_VALUE_TYPE(&value) != 0 ) {
+        addr = g_value_get_object( &value );
+		for( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ ) {
+    		buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
+			
+    		memset( &subfield_value, 0, sizeof( GValue ) );
+			if( subtable_row->gobj_param_name != NULL ) {
+				g_object_get( addr, subtable_row->gobj_param_name, &s, NULL );
+			} else {
+    			getter = gnc_gda_get_getter( GNC_ID_ADDRESS, subtable_row );
+    			s = (gchar*)(*getter)( addr, NULL );
+			}
+    		if( s ) {
+        		g_value_init( &subfield_value, G_TYPE_STRING );
+        		g_value_set_string( &subfield_value, s );
+			}
+    		sub_cond = gnc_gda_create_condition_from_field( query, buf, &subfield_value );
+    		gda_query_condition_node_add_child( cond, sub_cond, NULL );
+			g_free( buf );
+		}
+    }
+
+    return cond;
+}
+
+static void
+create_address_col( GdaServerProvider* server, GdaConnection* cnn,
+            xmlNodePtr array_data, const col_cvt_t* table_row, gboolean pkey )
+{
+    const gchar* dbms_type;
+    gchar* buf;
+	const col_cvt_t* subtable_row;
+
+    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++ ) {
+    	buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
+    	gnc_gda_add_table_column( server, cnn, array_data, buf, dbms_type, subtable_row->size, subtable_row->flags );
+    	g_free( buf );
+    }
+}
+
+static col_type_handler_t address_handler =
+        { load_address, create_address_col,
+            get_gvalue_address_for_query, get_gvalue_address_cond };
+
+/* ================================================================= */
+void
+gnc_address_gda_initialize( void )
+{
+	gnc_gda_register_col_type_handler( CT_ADDRESS, &address_handler );
+}
+/* ========================== END OF FILE ===================== */

Added: gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.h
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.h	                        (rev 0)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gnc-address-gda.h	2007-12-22 20:03:18 UTC (rev 16696)
@@ -0,0 +1,38 @@
+/* gnc-address-gda.h -- Address GDA header
+ *
+ * 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
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, contact:
+ *
+ * Free Software Foundation           Voice:  +1-617-542-5942
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org
+ */
+
+/** @file gnc-address-gda.h
+ *  @brief load and save address data to SQL via libgda
+ *  @author Copyright (c) 2007 Phil Longstaff <plongstaff at rogers.com>
+ *
+ * This file implements the top-level QofBackend API for saving/
+ * restoring data to/from an SQL database via libgda
+ */
+
+#ifndef GNC_ADDRESS_GDA_H
+#define GNC_ADDRESS_GDA_H
+
+#include "gncAddress.h"
+
+#define CT_ADDRESS "address"
+
+void gnc_address_gda_initialize( void );
+
+#endif /* GNC_ADDRESS_GDA_H */

Modified: gnucash/branches/gda-dev/src/business/business-core/gda/gnc-customer-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gnc-customer-gda.c	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gnc-customer-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -59,23 +59,16 @@
 	{ "currency",     CT_COMMODITYREF,  0,             COL_NNUL, NULL, NULL,
 			(QofAccessFunc)gncCustomerGetCurrency, (QofSetterFunc)gncCustomerSetCurrency },
 	{ "tax_override", CT_BOOLEAN,       0,             COL_NNUL, NULL, CUSTOMER_TT_OVER },
+	{ "addr",         CT_ADDRESS,       0,             0,        NULL, CUSTOMER_ADDR },
+	{ "shipaddr",     CT_ADDRESS,       0,             0,        NULL, CUSTOMER_SHIPADDR },
 	{ NULL }
 };
 
 #if 0
-/* ids */
-#define cust_addr_string "cust:addr"
-#define cust_shipaddr_string "cust:shipaddr"
 #define cust_terms_string "cust:terms"
 #define cust_taxincluded_string "cust:taxincluded"
 #define cust_taxtable_string "cust:taxtable"
 
-    xmlAddChild(ret, gnc_address_to_dom_tree(cust_addr_string,
-					     gncCustomerGetAddr (cust)));
-    
-    xmlAddChild(ret, gnc_address_to_dom_tree(cust_shipaddr_string,
-					     gncCustomerGetShipAddr (cust)));
-    
     term = gncCustomerGetTerms (cust);
     if (term)
       xmlAddChild(ret, guid_to_dom_tree(cust_terms_string,

Modified: gnucash/branches/gda-dev/src/business/business-core/gda/gnc-employee-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gnc-employee-gda.c	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gnc-employee-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -46,8 +46,6 @@
 #define MAX_LANGUAGE_LEN 50
 #define MAX_ACL_LEN 50
 
-#define employee_addr_string "employee:addr"
-
 #define TABLE_NAME "employees"
 
 static col_cvt_t col_table[] =
@@ -63,6 +61,7 @@
 	{ "ccard_guid", CT_ACCOUNTREF,    0,                COL_NNUL, NULL, EMPLOYEE_CC },
 	{ "workday",    CT_NUMERIC,       0,                COL_NNUL, NULL, EMPLOYEE_WORKDAY },
 	{ "rate",       CT_NUMERIC,       0,                COL_NNUL, NULL, EMPLOYEE_RATE },
+	{ "addr",       CT_ADDRESS,       0,                0,        NULL, EMPLOYEE_ADDR },
     { NULL }
 };
 

Modified: gnucash/branches/gda-dev/src/business/business-core/gda/gnc-vendor-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gnc-vendor-gda.c	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gnc-vendor-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -61,18 +61,15 @@
 	{ "active",       CT_BOOLEAN,       0,             COL_NNUL, NULL, NULL,
 			(QofAccessFunc)gncVendorGetActive, (QofSetterFunc)gncVendorSetActive },
 	{ "tax_override", CT_BOOLEAN,       0,             COL_NNUL, NULL, VENDOR_TAX_OVERRIDE },
+	{ "addr",         CT_ADDRESS,       0,             0,        NULL, VENDOR_ADDR },
 	{ NULL }
 };
 
 #if 0
-#define vendor_addr_string "vendor:addr"
 #define vendor_terms_string "vendor:terms"
 #define vendor_taxtable_string "vendor:taxtable"
 #define vendor_taxtableoverride_string "vendor:use-tt"
 
-    xmlAddChild(ret, gnc_address_to_dom_tree(vendor_addr_string,
-					     gncVendorGetAddr (vendor)));
-    
     term = gncVendorGetTerms (vendor);
     if (term)
       xmlAddChild(ret, guid_to_dom_tree(vendor_terms_string,

Modified: gnucash/branches/gda-dev/src/business/business-core/gda/gncmod-business-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/business/business-core/gda/gncmod-business-backend-gda.c	2007-12-22 18:18:37 UTC (rev 16695)
+++ gnucash/branches/gda-dev/src/business/business-core/gda/gncmod-business-backend-gda.c	2007-12-22 20:03:18 UTC (rev 16696)
@@ -77,7 +77,7 @@
 
   if (refcount == 0) {
     /* Initialize our pointers into the backend subsystem */
-//    gnc_address_gda_initialize ();
+    gnc_address_gda_initialize ();
 //    gnc_billterm_gda_initialize ();
     gnc_customer_gda_initialize ();
     gnc_employee_gda_initialize ();



More information about the gnucash-changes mailing list