r16694 - gnucash/branches/gda-dev/src/backend/gda - 1) Add function a function to register column type handlers. This will

Phil Longstaff plongstaff at cvs.gnucash.org
Sat Dec 22 12:04:07 EST 2007


Author: plongstaff
Date: 2007-12-22 12:04:06 -0500 (Sat, 22 Dec 2007)
New Revision: 16694
Trac: http://svn.gnucash.org/trac/changeset/16694

Modified:
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c
   gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h
Log:
1) Add function a function to register column type handlers.  This will
allow other column types (e.g. references to business tables) to be
added more easily.
2) Factor out object reference handling code so that business object
reference columns can be built more easily.



Modified: gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c
===================================================================
--- gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2007-12-22 05:28:56 UTC (rev 16693)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-gda.c	2007-12-22 17:04:06 UTC (rev 16694)
@@ -979,6 +979,7 @@
     if( !initialized ) {
         gda_init( "gnucash", "2.0", 0, NULL );
         gnc_gda_init_object_handlers();
+		gnc_gda_register_standard_col_type_handlers();
         initialized = TRUE;
     }
 

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 05:28:56 UTC (rev 16693)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.c	2007-12-22 17:04:06 UTC (rev 16694)
@@ -62,6 +62,7 @@
     gnc_gda_query_info* pQueryInfo;
 } gda_backend;
 
+#if 0
 typedef void (*GNC_GDA_LOAD_FN)( GncGdaBackend* be, GdaDataModel* pModel, gint row,
                                 QofSetterFunc setter, gpointer pObject,
                                 const col_cvt_t* table );
@@ -81,8 +82,8 @@
     GNC_GDA_GET_GVALUE_QUERY_FN get_gvalue_query_fn;
     GNC_GDA_GET_GVALUE_COND_FN  get_gvalue_cond_fn;
 } col_type_handler_t;
+#endif
 
-
 /* ================================================================= */
 static void
 add_field_to_query( GdaQuery* query, const gchar* col_name, const GValue* value )
@@ -596,51 +597,24 @@
 /* ----------------------------------------------------------------- */
 
 static void
-load_account_guid( GncGdaBackend* be, GdaDataModel* pModel, gint row,
-            QofSetterFunc setter, gpointer pObject,
-            const col_cvt_t* table )
-{
-    const GValue* val;
-    GUID guid;
-    const GUID* pGuid;
-	Account* account = NULL;
-
-    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
-    if( gda_value_is_null( val ) ) {
-        pGuid = NULL;
-    } else {
-        string_to_guid( g_value_get_string( val ), &guid );
-        pGuid = &guid;
-    }
-	if( pGuid != NULL ) {
-		account = xaccAccountLookup( pGuid, be->primary_book );
-	}
-    if( table->gobj_param_name != NULL ) {
-		g_object_set( pObject, table->gobj_param_name, account, NULL );
-    } else {
-		(*setter)( pObject, (const gpointer)account );
-    }
-}
-
-static void
-get_gvalue_account_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
+get_gvalue_objectref_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
                 const col_cvt_t* table_row, GValue* value )
 {
     QofAccessFunc getter;
     const GUID* guid = NULL;
     gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	Account* account;
+	QofInstance* inst;
 
     memset( value, 0, sizeof( GValue ) );
 
 	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &account, NULL );
+		g_object_get( pObject, table_row->gobj_param_name, &inst, NULL );
 	} else {
     	getter = get_getter( obj_name, table_row );
-    	account = (*getter)( pObject, NULL );
+    	inst = (*getter)( pObject, NULL );
 	}
-	if( account != NULL ) {
-		guid = qof_instance_get_guid( QOF_INSTANCE(account) );
+	if( inst != NULL ) {
+		guid = qof_instance_get_guid( inst );
 	}
     if( guid != NULL ) {
         (void)guid_to_string_buff( guid, guid_buf );
@@ -649,37 +623,64 @@
     }
 }
 
-static void
-get_gvalue_account_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+void
+gnc_gda_get_gvalue_objectref_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
                 gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
     GValue value;
 
-    get_gvalue_guid( be, obj_name, pObject, table_row, &value );
+    get_gvalue_objectref_guid( be, obj_name, pObject, table_row, &value );
     add_field_to_query( query, table_row->col_name, &value );
 }
 
-static GdaQueryCondition*
-get_gvalue_account_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+GdaQueryCondition*
+gnc_gda_get_gvalue_objectref_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
                 gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
 {
     GValue value;
 
-    get_gvalue_account_guid( be, obj_name, pObject, table_row, &value );
+    get_gvalue_objectref_guid( be, obj_name, pObject, table_row, &value );
     return gnc_gda_create_condition_from_field( query, table_row->col_name, &value );
 }
 
-static void
-create_account_guid_col( GdaServerProvider* server, GdaConnection* cnn,
+void
+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,
                     "char", GUID_ENCODING_LENGTH, table_row->flags | pkey ? COL_PKEY : 0 );
 }
 
+static void
+load_account_guid( GncGdaBackend* be, GdaDataModel* pModel, gint row,
+            QofSetterFunc setter, gpointer pObject,
+            const col_cvt_t* table )
+{
+    const GValue* val;
+    GUID guid;
+    const GUID* pGuid;
+	Account* account = NULL;
+
+    val = gda_data_model_get_value_at_col_name( pModel, table->col_name, row );
+    if( gda_value_is_null( val ) ) {
+        pGuid = NULL;
+    } else {
+        string_to_guid( g_value_get_string( val ), &guid );
+        pGuid = &guid;
+    }
+	if( pGuid != NULL ) {
+		account = xaccAccountLookup( pGuid, be->primary_book );
+	}
+    if( table->gobj_param_name != NULL ) {
+		g_object_set( pObject, table->gobj_param_name, account, NULL );
+    } else {
+		(*setter)( pObject, (const gpointer)account );
+    }
+}
+
 static col_type_handler_t account_guid_handler =
-        { load_account_guid, create_account_guid_col,
-            get_gvalue_account_guid_for_query, get_gvalue_account_guid_cond };
+        { load_account_guid, gnc_gda_create_objectref_guid_col,
+            gnc_gda_get_gvalue_objectref_guid_for_query, gnc_gda_get_gvalue_objectref_guid_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -709,64 +710,9 @@
     }
 }
 
-static void
-get_gvalue_commodity_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-                const col_cvt_t* table_row, GValue* value )
-{
-    QofAccessFunc getter;
-    const GUID* guid = NULL;
-    gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	gnc_commodity* commodity;
-
-    memset( value, 0, sizeof( GValue ) );
-
-	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &commodity, NULL );
-	} else {
-    	getter = get_getter( obj_name, table_row );
-    	commodity = (*getter)( pObject, NULL );
-	}
-	if( commodity != NULL ) {
-		guid = qof_instance_get_guid( QOF_INSTANCE(commodity) );
-	}
-    if( guid != NULL ) {
-        (void)guid_to_string_buff( guid, guid_buf );
-        g_value_init( value, G_TYPE_STRING );
-        g_value_set_string( value, guid_buf );
-    }
-}
-
-static void
-get_gvalue_commodity_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
-                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
-{
-    GValue value;
-
-    get_gvalue_commodity_guid( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
-}
-
-static GdaQueryCondition*
-get_gvalue_commodity_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
-                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
-{
-    GValue value;
-
-    get_gvalue_commodity_guid( be, obj_name, pObject, table_row, &value );
-    return gnc_gda_create_condition_from_field( query, table_row->col_name, &value );
-}
-
-static void
-create_commodity_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,
-                    "char", GUID_ENCODING_LENGTH, table_row->flags | pkey ? COL_PKEY : 0 );
-}
-
 static col_type_handler_t commodity_guid_handler =
-        { load_commodity_guid, create_commodity_guid_col,
-            get_gvalue_commodity_guid_for_query, get_gvalue_commodity_guid_cond };
+        { load_commodity_guid, gnc_gda_create_objectref_guid_col,
+            gnc_gda_get_gvalue_objectref_guid_for_query, gnc_gda_get_gvalue_objectref_guid_cond };
 /* ----------------------------------------------------------------- */
 
 static void
@@ -796,64 +742,9 @@
     }
 }
 
-static void
-get_gvalue_tx_guid( GncGdaBackend* be, QofIdTypeConst obj_name, gpointer pObject,
-                const col_cvt_t* table_row, GValue* value )
-{
-    QofAccessFunc getter;
-    const GUID* guid = NULL;
-    gchar guid_buf[GUID_ENCODING_LENGTH+1];
-	Transaction* tx;
-
-    memset( value, 0, sizeof( GValue ) );
-
-	if( table_row->gobj_param_name != NULL ) {
-		g_object_get( pObject, table_row->gobj_param_name, &tx, NULL );
-	} else {
-    	getter = get_getter( obj_name, table_row );
-    	tx = (*getter)( pObject, NULL );
-	}
-	if( tx != NULL ) {
-		guid = qof_instance_get_guid( QOF_INSTANCE(tx) );
-	}
-    if( guid != NULL ) {
-        (void)guid_to_string_buff( guid, guid_buf );
-        g_value_init( value, G_TYPE_STRING );
-        g_value_set_string( value, guid_buf );
-    }
-}
-
-static void
-get_gvalue_tx_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
-                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
-{
-    GValue value;
-
-    get_gvalue_tx_guid( be, obj_name, pObject, table_row, &value );
-    add_field_to_query( query, table_row->col_name, &value );
-}
-
-static GdaQueryCondition*
-get_gvalue_tx_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
-                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query )
-{
-    GValue value;
-
-    get_gvalue_tx_guid( be, obj_name, pObject, table_row, &value );
-    return gnc_gda_create_condition_from_field( query, table_row->col_name, &value );
-}
-
-static void
-create_tx_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,
-                    "char", GUID_ENCODING_LENGTH, table_row->flags | pkey ? COL_PKEY : 0 );
-}
-
 static col_type_handler_t tx_guid_handler =
-        { load_tx_guid, create_tx_guid_col,
-            get_gvalue_tx_guid_for_query, get_gvalue_tx_guid_cond };
+        { load_tx_guid, gnc_gda_create_objectref_guid_col,
+            gnc_gda_get_gvalue_objectref_guid_for_query, gnc_gda_get_gvalue_objectref_guid_cond };
 /* ----------------------------------------------------------------- */
 static void
 load_timespec( GncGdaBackend* be, GdaDataModel* pModel, gint row,
@@ -1202,67 +1093,48 @@
             get_gvalue_numeric_for_query, get_gvalue_numeric_cond };
 /* ================================================================= */
 
+static GHashTable* g_columnTypeHash = NULL;
+
+void
+gnc_gda_register_column_handler( gint colType, col_type_handler_t* handler )
+{
+	if( g_columnTypeHash == NULL ) {
+		g_columnTypeHash = g_hash_table_new( g_direct_hash, g_direct_equal );
+	}
+
+	g_hash_table_insert( g_columnTypeHash, GINT_TO_POINTER(colType), handler );
+}
+
 static col_type_handler_t*
-get_handler( int col_type )
+get_handler( gint col_type )
 {
     col_type_handler_t* pHandler;
 
-    switch( col_type ) {
-        case CT_STRING:
-            pHandler = &string_handler;
-            break;
-
-        case CT_BOOLEAN:
-            pHandler = &boolean_handler;
-            break;
-
-        case CT_INT:
-            pHandler = &int_handler;
-            break;
-
-        case CT_INT64:
-            pHandler = &int64_handler;
-            break;
-
-        case CT_DOUBLE:
-            pHandler = &double_handler;
-            break;
-
-        case CT_GUID:
-            pHandler = &guid_handler;
-            break;
-                
-		case CT_GUID_A:
-            pHandler = &account_guid_handler;
-            break;
-                
-		case CT_GUID_C:
-            pHandler = &commodity_guid_handler;
-            break;
-                
-		case CT_GUID_T:
-            pHandler = &tx_guid_handler;
-            break;
-                
-        case CT_TIMESPEC:
-            pHandler = &timespec_handler;
-            break;
-
-        case CT_GDATE:
-            pHandler = &date_handler;
-            break;
-
-        case CT_NUMERIC:
-            pHandler = &numeric_handler;
-            break;
-
-        default:    /* undefined col type */
-            g_assert( FALSE );
+	pHandler = g_hash_table_lookup( g_columnTypeHash, GINT_TO_POINTER(col_type) );
+	if( pHandler == NULL ) {
+        g_assert( FALSE );
     }
 
     return pHandler;
 }
 
+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_GUID_A, &account_guid_handler );
+	gnc_gda_register_column_handler( CT_GUID_C, &commodity_guid_handler );
+	gnc_gda_register_column_handler( CT_GUID_T, &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 );
+}
+
 static void retrieve_guid( gpointer pObject, gpointer pValue );
 
 static void 

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 05:28:56 UTC (rev 16693)
+++ gnucash/branches/gda-dev/src/backend/gda/gnc-backend-util-gda.h	2007-12-22 17:04:06 UTC (rev 16694)
@@ -75,18 +75,18 @@
 
 // Type for conversion of db row to object.
 typedef enum {
-	CT_STRING,
-	CT_GUID,
-	CT_GUID_A,
-	CT_GUID_C,
-	CT_GUID_T,
-	CT_INT,
-	CT_INT64,
-	CT_TIMESPEC,
-	CT_GDATE,
-	CT_NUMERIC,
-	CT_DOUBLE,
-	CT_BOOLEAN
+	CT_STRING = -1,
+	CT_GUID = -2,
+	CT_INT = -3,
+	CT_INT64 = -4,
+	CT_TIMESPEC = -5,
+	CT_GDATE = -6,
+	CT_NUMERIC = -7,
+	CT_DOUBLE = -8,
+	CT_BOOLEAN = -9,
+	CT_GUID_A = -10,
+	CT_GUID_C = -11,
+	CT_GUID_T = -12
 } E_COL_TYPE;
 
 typedef struct {
@@ -110,6 +110,26 @@
 	OP_DB_DELETE
 } E_DB_OPERATION;
 
+typedef void (*GNC_GDA_LOAD_FN)( GncGdaBackend* be, GdaDataModel* pModel, gint row,
+                                QofSetterFunc setter, gpointer pObject,
+                                const col_cvt_t* table );
+typedef void (*GNC_GDA_CREATE_COL_FN)( GdaServerProvider* server,
+                        GdaConnection* cnn, xmlNodePtr array_data,
+                        const col_cvt_t* table_row, gboolean pkey );
+typedef void (*GNC_GDA_GET_GVALUE_QUERY_FN)( GncGdaBackend* be,
+                QofIdTypeConst obj_name, gpointer pObject,
+                const col_cvt_t* table_row, GdaQuery* query );
+typedef GdaQueryCondition* (*GNC_GDA_GET_GVALUE_COND_FN)( GncGdaBackend* be,
+                QofIdTypeConst obj_name, gpointer pObject,
+                const col_cvt_t* table_row, GdaQuery* query );
+
+typedef struct {
+    GNC_GDA_LOAD_FN             load_fn;
+    GNC_GDA_CREATE_COL_FN       create_col_fn;
+    GNC_GDA_GET_GVALUE_QUERY_FN get_gvalue_query_fn;
+    GNC_GDA_GET_GVALUE_COND_FN  get_gvalue_cond_fn;
+} col_type_handler_t;
+
 gboolean gnc_gda_do_db_operation( GncGdaBackend* pBackend,
 									E_DB_OPERATION op,
 									const gchar* table_name,
@@ -154,7 +174,16 @@
 GdaQueryCondition* gnc_gda_create_condition_from_field( GdaQuery* query,
 														const gchar* col_name,
 														const GValue* value );
+void gnc_gda_register_column_handler( int colType, col_type_handler_t* handler );
+void gnc_gda_register_standard_col_type_handlers( void );
 
+void gnc_gda_get_gvalue_objectref_guid_for_query( GncGdaBackend* be, QofIdTypeConst obj_name,
+                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query );
+GdaQueryCondition* gnc_gda_get_gvalue_objectref_guid_cond( GncGdaBackend* be, QofIdTypeConst obj_name,
+                gpointer pObject, const col_cvt_t* table_row, GdaQuery* query );
+void gnc_gda_create_objectref_guid_col( GdaServerProvider* server, GdaConnection* cnn,
+	            xmlNodePtr array_data, const col_cvt_t* table_row, gboolean pkey );
+
 G_MODULE_EXPORT const gchar *
 g_module_check_init(GModule *module);
 



More information about the gnucash-changes mailing list