mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
more query xml work
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3407 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
@@ -87,9 +87,9 @@ static int xaccBalanceMatchPredicate(Split * s, PredicateData * pd);
|
||||
/********************************************************************
|
||||
********************************************************************/
|
||||
|
||||
#if 0
|
||||
static void
|
||||
print_query(Query * q) {
|
||||
void
|
||||
xaccQueryPrint(Query * q)
|
||||
{
|
||||
GList * aterms;
|
||||
GList * i, * j;
|
||||
QueryTerm * qt;
|
||||
@@ -110,7 +110,6 @@ print_query(Query * q) {
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/********************************************************************
|
||||
@@ -1051,6 +1050,69 @@ xaccQueryGetSplits(Query * q) {
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddPredicate
|
||||
* Add a predicate an existing query.
|
||||
********************************************************************/
|
||||
|
||||
/* hack alert -- this is atemproray API */
|
||||
void
|
||||
xaccQueryAddPredicate (Query * q,
|
||||
int snes,
|
||||
PredicateData *pred,
|
||||
QueryOp op)
|
||||
{
|
||||
Query * qs = xaccMallocQuery();
|
||||
QueryTerm * qt = g_new0(QueryTerm, 1);
|
||||
Query * qr;
|
||||
|
||||
qt->sense = snes;
|
||||
qt->data = *pred;
|
||||
|
||||
/* hack alert this switch stement is clearly wrong !!!!! */
|
||||
switch (pred->type) {
|
||||
case PD_DATE:
|
||||
qt->p = & xaccDateMatchPredicate;
|
||||
break;
|
||||
case PD_AMOUNT:
|
||||
qt->p = & xaccAmountMatchPredicate;
|
||||
qt->p = & xaccSharePriceMatchPredicate;
|
||||
qt->p = & xaccSharesMatchPredicate;
|
||||
break;
|
||||
case PD_ACCOUNT:
|
||||
qt->p = & xaccAccountMatchPredicate;
|
||||
break;
|
||||
case PD_STRING:
|
||||
qt->p = & xaccDescriptionMatchPredicate;
|
||||
qt->p = & xaccMemoMatchPredicate;
|
||||
qt->p = & xaccNumberMatchPredicate;
|
||||
qt->p = & xaccActionMatchPredicate;
|
||||
break;
|
||||
case PD_CLEARED:
|
||||
qt->p = & xaccClearedMatchPredicate;
|
||||
break;
|
||||
case PD_BALANCE:
|
||||
qt->p = & xaccBalanceMatchPredicate;
|
||||
break;
|
||||
case PD_MISC:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
xaccInitQuery(qs, qt);
|
||||
xaccQuerySetGroup(qs, q->acct_group);
|
||||
|
||||
if(xaccQueryHasTerms(q)) {
|
||||
qr = xaccQueryMerge(q, qs, op);
|
||||
}
|
||||
else {
|
||||
qr = xaccQueryMerge(q, qs, QUERY_OR);
|
||||
}
|
||||
xaccQuerySwapTerms(q, qr);
|
||||
xaccFreeQuery(qs);
|
||||
xaccFreeQuery(qr);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddAccountMatch
|
||||
* Add an account filter to an existing query.
|
||||
@@ -1225,42 +1287,6 @@ xaccQueryAddMemoMatch(Query * q, const char * matchstring,
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddDateMatch
|
||||
* Add a date filter to an existing query.
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
xaccQueryAddDateMatch(Query * q,
|
||||
int use_start, int sday, int smonth, int syear,
|
||||
int use_end, int eday, int emonth, int eyear,
|
||||
QueryOp op) {
|
||||
Query * qs = xaccMallocQuery();
|
||||
QueryTerm * qt = g_new0(QueryTerm, 1);
|
||||
Query * qr;
|
||||
|
||||
qt->p = & xaccDateMatchPredicate;
|
||||
qt->sense = 1;
|
||||
qt->data.type = PD_DATE;
|
||||
qt->data.date.use_start = use_start;
|
||||
qt->data.date.start = gnc_dmy2timespec(sday, smonth, syear);
|
||||
qt->data.date.use_end = use_end;
|
||||
qt->data.date.end = gnc_dmy2timespec_end(eday, emonth, eyear);
|
||||
|
||||
xaccInitQuery(qs, qt);
|
||||
xaccQuerySetGroup(qs, q->acct_group);
|
||||
|
||||
if(xaccQueryHasTerms(q)) {
|
||||
qr = xaccQueryMerge(q, qs, op);
|
||||
}
|
||||
else {
|
||||
qr = xaccQueryMerge(q, qs, QUERY_OR);
|
||||
}
|
||||
xaccQuerySwapTerms(q, qr);
|
||||
xaccFreeQuery(qs);
|
||||
xaccFreeQuery(qr);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddDateMatchTS
|
||||
* Add a date filter to an existing query.
|
||||
@@ -1299,6 +1325,25 @@ xaccQueryAddDateMatchTS(Query * q,
|
||||
xaccFreeQuery(qr);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddDateMatch
|
||||
* Add a date filter to an existing query.
|
||||
********************************************************************/
|
||||
|
||||
void
|
||||
xaccQueryAddDateMatch(Query * q,
|
||||
int use_start, int sday, int smonth, int syear,
|
||||
int use_end, int eday, int emonth, int eyear,
|
||||
QueryOp op)
|
||||
{
|
||||
/* gcc -O3 will auto-inline this function, avoiding a call overhead */
|
||||
xaccQueryAddDateMatchTS (q, use_start,
|
||||
gnc_dmy2timespec(sday, smonth, syear),
|
||||
use_end,
|
||||
gnc_dmy2timespec_end(eday, emonth, eyear),
|
||||
op);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* xaccQueryAddDateMatchTT
|
||||
* Add a date filter to an existing query.
|
||||
@@ -1310,10 +1355,8 @@ xaccQueryAddDateMatchTT(Query * q,
|
||||
time_t stt,
|
||||
int use_end,
|
||||
time_t ett,
|
||||
QueryOp op) {
|
||||
Query * qs = xaccMallocQuery();
|
||||
QueryTerm * qt = g_new0(QueryTerm, 1);
|
||||
Query * qr;
|
||||
QueryOp op)
|
||||
{
|
||||
Timespec sts;
|
||||
Timespec ets;
|
||||
|
||||
@@ -1322,27 +1365,11 @@ xaccQueryAddDateMatchTT(Query * q,
|
||||
|
||||
ets.tv_sec = (long long)ett;
|
||||
ets.tv_nsec = 0;
|
||||
|
||||
/* gcc -O3 will auto-inline this function, avoiding a call overhead */
|
||||
xaccQueryAddDateMatchTS (q, use_start, sts,
|
||||
use_end, ets, op);
|
||||
|
||||
qt->p = & xaccDateMatchPredicate;
|
||||
qt->sense = 1;
|
||||
qt->data.type = PD_DATE;
|
||||
qt->data.date.use_start = use_start;
|
||||
qt->data.date.use_end = use_end;
|
||||
qt->data.date.start = sts;
|
||||
qt->data.date.end = ets;
|
||||
|
||||
xaccInitQuery(qs, qt);
|
||||
xaccQuerySetGroup(qs, q->acct_group);
|
||||
|
||||
if(xaccQueryHasTerms(q)) {
|
||||
qr = xaccQueryMerge(q, qs, op);
|
||||
}
|
||||
else {
|
||||
qr = xaccQueryMerge(q, qs, QUERY_OR);
|
||||
}
|
||||
xaccQuerySwapTerms(q, qr);
|
||||
xaccFreeQuery(qr);
|
||||
xaccFreeQuery(qs);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
|
||||
@@ -186,6 +186,9 @@ GList * xaccQueryGetTerms(Query * q);
|
||||
|
||||
GList * xaccQueryGetSplits(Query * q);
|
||||
|
||||
/* handy for debugging */
|
||||
void xaccQueryPrint(Query *q);
|
||||
|
||||
/*******************************************************************
|
||||
* match-adding API
|
||||
*******************************************************************/
|
||||
@@ -209,8 +212,8 @@ void DxaccQueryAddSharePriceMatch(Query * q, double amount,
|
||||
void DxaccQueryAddSharesMatch(Query * q, double amount,
|
||||
amt_match_t how, QueryOp op);
|
||||
void xaccQueryAddDateMatch(Query * q,
|
||||
int use_start, int syear, int smonth, int sday,
|
||||
int use_end, int eyear, int emonth, int eday,
|
||||
int use_start, int sday, int smonth, int syear,
|
||||
int use_end, int eday, int emonth, int eyear,
|
||||
QueryOp op);
|
||||
void xaccQueryAddDateMatchTS(Query * q,
|
||||
int use_start, Timespec sts,
|
||||
@@ -227,6 +230,9 @@ void xaccQueryAddBalanceMatch(Query * q, balance_match_t how, QueryOp op);
|
||||
void xaccQueryAddMiscMatch(Query * q, Predicate p, int how, int data,
|
||||
QueryOp op);
|
||||
|
||||
void xaccQueryAddPredicate (Query * q, int sense, PredicateData *pred,
|
||||
QueryOp op);
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
* sort-related functions
|
||||
|
||||
@@ -3920,8 +3920,17 @@ START_HANDLER(query_server)
|
||||
|
||||
END_HANDLER(query_server)
|
||||
{
|
||||
Query *q = (Query *) data_for_children;
|
||||
printf ("server duuuude its %p\n", q);
|
||||
Query *q;
|
||||
sixtp_child_result *cr;
|
||||
|
||||
g_return_val_if_fail(data_from_children, FALSE);
|
||||
|
||||
cr = (sixtp_child_result *) data_from_children->data;
|
||||
g_return_val_if_fail(cr, FALSE);
|
||||
|
||||
q = (Query *) (cr->data);
|
||||
g_return_val_if_fail(q, FALSE);
|
||||
|
||||
*result = q;
|
||||
return(TRUE);
|
||||
}
|
||||
@@ -3954,14 +3963,21 @@ START_HANDLER(query)
|
||||
|
||||
END_HANDLER(query)
|
||||
{
|
||||
Query *q = (Query *) data_for_children;
|
||||
printf ("query duuuude its %p\n", q);
|
||||
Query *q;
|
||||
sixtp_child_result *cr;
|
||||
|
||||
g_return_val_if_fail(data_from_children, FALSE);
|
||||
|
||||
cr = (sixtp_child_result *) data_from_children->data;
|
||||
g_return_val_if_fail(cr, FALSE);
|
||||
|
||||
q = (Query *) (cr->data);
|
||||
g_return_val_if_fail(q, FALSE);
|
||||
|
||||
*result = q;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ================================================================= */
|
||||
/* <restore> (lineage <query> <query-server>)
|
||||
|
||||
@@ -3995,8 +4011,7 @@ START_HANDLER(query_restore)
|
||||
|
||||
END_HANDLER(query_restore)
|
||||
{
|
||||
Query *q = (Query *) result;
|
||||
printf ("query restore duuuude its %p\n", q);
|
||||
Query *q = (Query *) data_for_children;
|
||||
g_return_val_if_fail(q, FALSE);
|
||||
*result = q;
|
||||
return(TRUE);
|
||||
@@ -4024,14 +4039,43 @@ AFTER_CHILD(query_restore)
|
||||
}
|
||||
|
||||
/* ================================================================= */
|
||||
/* <datepred> (lineage <restore> <query> <query-server>)
|
||||
|
||||
#define CVT_INT(to) { \
|
||||
gint32 val; \
|
||||
gboolean ok; \
|
||||
gchar *txt = NULL; \
|
||||
\
|
||||
txt = concatenate_child_result_chars(data_from_children); \
|
||||
g_return_val_if_fail(txt, FALSE); \
|
||||
\
|
||||
ok = (gboolean) string_to_gint32(txt, &val); \
|
||||
g_free(txt); \
|
||||
g_return_val_if_fail(ok, FALSE); \
|
||||
(to) = val; \
|
||||
}
|
||||
|
||||
#define CVT_DATE(to) { \
|
||||
TimespecParseInfo *info = (TimespecParseInfo *) data_for_children; \
|
||||
\
|
||||
g_return_val_if_fail(info, FALSE); \
|
||||
if(!timespec_parse_ok(info)) { \
|
||||
g_free(info); \
|
||||
return(FALSE); \
|
||||
} \
|
||||
\
|
||||
to = info->ts; \
|
||||
g_free(info); \
|
||||
}
|
||||
|
||||
/* ================================================================= */
|
||||
/* <datepred> (lineage <and-terms> <restore> <query> <query-server>)
|
||||
Restores a given date predicate.
|
||||
|
||||
from parent: Query*
|
||||
for children: NA
|
||||
result: NA
|
||||
-----------
|
||||
start: ??
|
||||
start: malloc a date predicate
|
||||
chars: allow and ignore only whitespace.
|
||||
end: AddDateMatch to Query
|
||||
cleanup-result: NA
|
||||
@@ -4043,22 +4087,23 @@ AFTER_CHILD(query_restore)
|
||||
|
||||
START_HANDLER(qrestore_datepred)
|
||||
{
|
||||
// Split *s = xaccMallocSplit();
|
||||
// g_return_val_if_fail(s, FALSE);
|
||||
// *data_for_children = s;
|
||||
DatePredicateData *dp = g_new (DatePredicateData, 1);
|
||||
g_return_val_if_fail(dp, FALSE);
|
||||
bzero (dp, sizeof (DatePredicateData));
|
||||
dp->type = PD_DATE;
|
||||
*data_for_children = dp;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
END_HANDLER(qrestore_datepred)
|
||||
{
|
||||
Query *q = (Query *) parent_data;
|
||||
PredicateData *dp = (PredicateData *) data_for_children;
|
||||
|
||||
g_return_val_if_fail(q, FALSE);
|
||||
g_return_val_if_fail(dp, FALSE);
|
||||
|
||||
#if 0
|
||||
Split *s = (Split *) data_for_children;
|
||||
g_return_val_if_fail(s, FALSE);
|
||||
#endif
|
||||
xaccQueryAddPredicate (q, 1, dp, QUERY_OR);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
@@ -4090,10 +4135,11 @@ AFTER_CHILD(qrestore_datepred)
|
||||
|
||||
FAIL_HANDLER(qrestore_datepred)
|
||||
{
|
||||
g_free (data_for_children);
|
||||
}
|
||||
|
||||
/* ================================================================= */
|
||||
/* <end-date> (lineage <date-pred> <restore> <query>)
|
||||
/* <end-date> (lineage <date-pred> <and-terms> <restore> <query>)
|
||||
restores a given query's end-date.
|
||||
Just uses a generic_timespec parser, but with our own end handler.
|
||||
end: set end-date.
|
||||
@@ -4101,38 +4147,36 @@ FAIL_HANDLER(qrestore_datepred)
|
||||
|
||||
END_HANDLER(datepred_use_start)
|
||||
{
|
||||
DatePredicateData *dp = (DatePredicateData *) parent_data;
|
||||
CVT_INT(dp->use_start);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
END_HANDLER(datepred_use_end)
|
||||
{
|
||||
DatePredicateData *dp = (DatePredicateData *) parent_data;
|
||||
CVT_INT(dp->use_end);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
END_HANDLER(datepred_start_date)
|
||||
{
|
||||
DatePredicateData *dp = (DatePredicateData *) parent_data;
|
||||
CVT_DATE (dp->start);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
END_HANDLER(datepred_end_date)
|
||||
{
|
||||
// Split *s = (Split *) parent_data;
|
||||
TimespecParseInfo *info = (TimespecParseInfo *) data_for_children;
|
||||
|
||||
g_return_val_if_fail(info, FALSE);
|
||||
if(!timespec_parse_ok(info)) {
|
||||
g_free(info);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
// xaccSplitSetDateReconciledTS(s, &(info->ts));
|
||||
g_free(info);
|
||||
|
||||
DatePredicateData *dp = (DatePredicateData *) parent_data;
|
||||
CVT_DATE (dp->end);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
END_HANDLER(generic_pred_sense)
|
||||
{
|
||||
DatePredicateData *dp = (DatePredicateData *) parent_data;
|
||||
// CVT_INT(dp->sense);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -886,11 +886,11 @@ xml_add_qterm_restorer(xmlNodePtr qxml, QueryTerm *qt)
|
||||
xml_add_gint32(p, "use-end", qt->data.date.use_end);
|
||||
if (qt->data.date.use_start) {
|
||||
xml_add_editable_timespec(p, "start-date",
|
||||
&qt->data.date.start, FALSE);
|
||||
&(qt->data.date.start), FALSE);
|
||||
}
|
||||
if (qt->data.date.use_end) {
|
||||
xml_add_editable_timespec(p, "end-date",
|
||||
&qt->data.date.end, FALSE);
|
||||
&(qt->data.date.end), FALSE);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -943,14 +943,14 @@ xml_add_qterm_restorer(xmlNodePtr qxml, QueryTerm *qt)
|
||||
static gboolean
|
||||
xml_add_query_restorers(xmlNodePtr p, Query *q)
|
||||
{
|
||||
xmlNodePtr qxml, restore_xml;
|
||||
GList *list;
|
||||
GList *node;
|
||||
xmlNodePtr qxml, restore_xml, and_xml;
|
||||
GList *aterms, *oterms;
|
||||
GList *anode, *onode;
|
||||
|
||||
g_return_val_if_fail(p, FALSE);
|
||||
g_return_val_if_fail(q, FALSE);
|
||||
|
||||
list = xaccQueryGetTerms (q);
|
||||
oterms = xaccQueryGetTerms (q);
|
||||
|
||||
/* write the nested <query> <restore> */
|
||||
qxml = xmlNewTextChild(p, NULL, "query", NULL);
|
||||
@@ -959,9 +959,15 @@ xml_add_query_restorers(xmlNodePtr p, Query *q)
|
||||
restore_xml = xmlNewTextChild(qxml, NULL, "restore", NULL);
|
||||
g_return_val_if_fail(restore_xml, FALSE);
|
||||
|
||||
for (node = list; node; node = node->next) {
|
||||
QueryTerm *qt = node->data;
|
||||
xml_add_qterm_restorer(restore_xml, qt);
|
||||
for (onode = oterms; onode; onode = onode->next) {
|
||||
aterms = onode->data;
|
||||
and_xml = xmlNewTextChild(restore_xml, NULL, "and-terms", NULL);
|
||||
g_return_val_if_fail(and_xml, FALSE);
|
||||
|
||||
for (anode = aterms; anode; anode = anode->next) {
|
||||
QueryTerm *qt = anode->data;
|
||||
xml_add_qterm_restorer(and_xml, qt);
|
||||
}
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user