r18172 - gnucash/trunk/src/backend/sql - Handle SPLIT_VALUE terms in split query. I'm not sure credit vs debit is handled correctly, but

Phil Longstaff plongstaff at code.gnucash.org
Fri Jul 3 13:49:51 EDT 2009


Author: plongstaff
Date: 2009-07-03 13:49:51 -0400 (Fri, 03 Jul 2009)
New Revision: 18172
Trac: http://svn.gnucash.org/trac/changeset/18172

Modified:
   gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
Log:
Handle SPLIT_VALUE terms in split query.  I'm not sure credit vs debit is handled correctly, but
given the weird way queries work, it doesn't really matter.  By this, I mean that all the backend
is supposed to do with a query is ensure that the correct set of splits is loaded.  Since an
account can only be reconciled once it is opened in a register, and opening a register loads all
splits in the account, and reconciling queries for a subset of splits (those that haven't been
reconciled), the reconcile query could do nothing and it would all still work.  This will need
to be revisted once the register and queries need to be smarter.


Modified: gnucash/trunk/src/backend/sql/gnc-transaction-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-transaction-sql.c	2009-07-03 16:16:11 UTC (rev 18171)
+++ gnucash/trunk/src/backend/sql/gnc-transaction-sql.c	2009-07-03 17:49:51 UTC (rev 18172)
@@ -799,7 +799,6 @@
     QofQueryPredData* pPredData;
     gboolean isInverted;
     GSList* name;
-    gchar val[GUID_ENCODING_LENGTH+1];
 
 	g_return_if_fail( pTerm != NULL );
 	g_return_if_fail( sql != NULL );
@@ -831,15 +830,13 @@
 		}
 
 		for( guid_entry = guid_data->guids; guid_entry != NULL; guid_entry = guid_entry->next ) {
+    		gchar guid_buf[GUID_ENCODING_LENGTH+1];
+
 		    if( guid_entry != guid_data->guids ) g_string_append( sql, "," );
-        	(void)guid_to_string_buff( guid_entry->data, val );
-        	g_string_append( sql, "'" );
-        	g_string_append( sql, val );
-        	g_string_append( sql, "'" );
+        	(void)guid_to_string_buff( guid_entry->data, guid_buf );
+        	g_string_append_printf( sql, "'%s'", guid_buf );
 		}
-		g_string_append( sql, ")" );
-		g_string_append( sql, ")" );
-		return;
+		g_string_append( sql, "))" );
 
     } else if( safe_strcmp( pPredData->type_name, QOF_TYPE_CHAR ) == 0 ) {
 	    query_char_t char_data = (query_char_t)pPredData;
@@ -865,21 +862,7 @@
 		if( isInverted ) {
 			g_string_append( sql, ") " );
 		}
-		return;
 
-    } else if( safe_strcmp( pPredData->type_name, QOF_TYPE_DATE ) == 0 ) {
-        query_date_t date_data = (query_date_t)pPredData;
-		gchar* datebuf;
-
-        g_string_append( sql, "(" );
-        g_string_append( sql, fieldName );
-	    convert_query_comparison_to_sql( pPredData, isInverted, sql );
-		datebuf = gnc_sql_convert_timespec_to_string( date_data->date );
-        g_string_append( sql, "'" );
-        g_string_append( sql, datebuf );
-        g_string_append( sql, "')" );
-		return;
-
     } else if( safe_strcmp( pPredData->type_name, QOF_TYPE_STRING ) == 0 ) {
         query_string_t string_data = (query_string_t)pPredData;
 		sqlEscape* escape = sqlEscape_new();
@@ -911,42 +894,51 @@
 			g_string_append( sql, ")" );
 		}
 		sqlEscape_destroy( escape );
-		return;
-	}
 
-    g_string_append( sql, "(" );
-    g_string_append( sql, fieldName );
-	convert_query_comparison_to_sql( pPredData, isInverted, sql );
+	} else {
+    	g_string_append( sql, "(" );
+    	g_string_append( sql, fieldName );
+		convert_query_comparison_to_sql( pPredData, isInverted, sql );
 
-    if( strcmp( pPredData->type_name, "numeric" ) == 0 ) {
-        query_numeric_t pData = (query_numeric_t)pPredData;
+    	if( strcmp( pPredData->type_name, QOF_TYPE_NUMERIC ) == 0 ) {
+        	query_numeric_t pData = (query_numeric_t)pPredData;
+			double d = gnc_numeric_to_double( pData->amount );
     
-        g_string_append( sql, "numeric" );
-    } else if( strcmp( pPredData->type_name, "gint32" ) == 0 ) {
-        query_int32_t pData = (query_int32_t)pPredData;
+        	g_string_append_printf( sql, "%f", d );
 
-        sprintf( val, "%d", pData->val );
-        g_string_append( sql, val );
-    } else if( strcmp( pPredData->type_name, "gint64" ) == 0 ) {
-        query_int64_t pData = (query_int64_t)pPredData;
+    	} else if( safe_strcmp( pPredData->type_name, QOF_TYPE_DATE ) == 0 ) {
+        	query_date_t date_data = (query_date_t)pPredData;
+			gchar* datebuf;
+
+			datebuf = gnc_sql_convert_timespec_to_string( date_data->date );
+        	g_string_append_printf( sql, "'%s'", datebuf );
+
+    	} else if( strcmp( pPredData->type_name, QOF_TYPE_INT32 ) == 0 ) {
+        	query_int32_t pData = (query_int32_t)pPredData;
+
+        	g_string_append_printf( sql, "%d", pData->val );
+
+    	} else if( strcmp( pPredData->type_name, QOF_TYPE_INT64 ) == 0 ) {
+        	query_int64_t pData = (query_int64_t)pPredData;
     
-        sprintf( val, "%" G_GINT64_FORMAT, pData->val );
-        g_string_append( sql, val );
-    } else if( strcmp( pPredData->type_name, "double" ) == 0 ) {
-        query_double_t pData = (query_double_t)pPredData;
+        	g_string_append_printf( sql, "%" G_GINT64_FORMAT, pData->val );
 
-        sprintf( val, "%f", pData->val );
-        g_string_append( sql, val );
-    } else if( strcmp( pPredData->type_name, "boolean" ) == 0 ) {
-        query_boolean_t pData = (query_boolean_t)pPredData;
+    	} else if( strcmp( pPredData->type_name, QOF_TYPE_DOUBLE ) == 0 ) {
+        	query_double_t pData = (query_double_t)pPredData;
 
-        sprintf( val, "%d", pData->val );
-        g_string_append( sql, val );
-    } else {
-        PERR( "Unknown query predicate type: %s\n", pPredData->type_name );
-    }
+        	g_string_append_printf( sql, "%f", pData->val );
 
-    g_string_append( sql, ")" );
+    	} else if( strcmp( pPredData->type_name, QOF_TYPE_BOOLEAN ) == 0 ) {
+        	query_boolean_t pData = (query_boolean_t)pPredData;
+
+        	g_string_append_printf( sql, "%d", pData->val );
+
+    	} else {
+        	PERR( "Unknown query predicate type: %s\n", pPredData->type_name );
+    	}
+
+    	g_string_append( sql, ")" );
+	}
 }
 
 typedef struct {
@@ -1019,6 +1011,9 @@
 						unknownPath = TRUE;
 					}
 
+				} else if( strcmp( paramPath->data, SPLIT_VALUE ) == 0 ) {
+                	convert_query_term_to_sql( "s.value_num/s.value_denom", term, sql );
+
 				} else {
 					unknownPath = TRUE;
 				}



More information about the gnucash-changes mailing list