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, ×pec_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, ×pec_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