[Gnucash-changes] add some debug statements, audit the math usage,
tweak the scrub
Linas Vepstas
linas at cvs.gnucash.org
Sun Jun 27 18:33:00 EDT 2004
Log Message:
-----------
add some debug statements,
audit the math usage,
tweak the scrub routines to get rid of the no-root error message
(some debugging printfs remain, which I'll remove later)
Modified Files:
--------------
gnucash/src/engine:
Scrub.c
cap-gains.c
Scrub2.c
Revision Data
-------------
Index: Scrub2.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Scrub2.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -Lsrc/engine/Scrub2.c -Lsrc/engine/Scrub2.c -u -r1.33 -r1.34
--- src/engine/Scrub2.c
+++ src/engine/Scrub2.c
@@ -121,6 +121,8 @@
{
Split *subsplit;
+PINFO ("duuuuude split=%s %s", gnc_numeric_to_string
+(split->amount),gnc_numeric_to_string (split->value));
subsplit = xaccSplitAssignToLot (split, lot);
if (subsplit == split)
{
@@ -184,7 +186,7 @@
/* Now, total up the values */
value = gnc_numeric_add (value, xaccSplitGetValue (s),
- GNC_DENOM_AUTO, GNC_DENOM_EXACT);
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
PINFO ("Split=%p value=%s Accum Lot value=%s", s,
gnc_numeric_to_string (s->value),
gnc_numeric_to_string (value));
@@ -257,9 +259,21 @@
dst_amt = xaccSplitGetAmount (s);
dst_val = xaccSplitGetValue (s);
target_val = gnc_numeric_mul (dst_amt, src_val,
- GNC_DENOM_AUTO, GNC_DENOM_REDUCE);
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
target_val = gnc_numeric_div (target_val, src_amt,
- scu, GNC_DENOM_EXACT);
+ scu, GNC_HOW_DENOM_EXACT|GNC_HOW_RND_ROUND);
+ if (gnc_numeric_check (target_val))
+ {
+ PERR ("Numeric overflow of value\n"
+ "\tAcct=%s txn=%s\n"
+ "\tdst_amt=%s src_val=%s src_amt=%s\n",
+ xaccAccountGetName (s->acc),
+ xaccTransGetDescription(txn),
+ gnc_numeric_to_string(dst_amt),
+ gnc_numeric_to_string(src_val),
+ gnc_numeric_to_string(src_amt));
+ continue;
+ }
/* If the required price changes are 'small', do nothing.
* That is a case that the user will have to deal with
Index: Scrub.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Scrub.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -Lsrc/engine/Scrub.c -Lsrc/engine/Scrub.c -u -r1.61 -r1.62
--- src/engine/Scrub.c
+++ src/engine/Scrub.c
@@ -144,9 +144,19 @@
if (split->acc)
{
TransScrubOrphansFast (trans, xaccAccountGetRoot(split->acc));
- break;
+ return;
}
}
+
+ /* If we got to here, then *none* of the splits belonged to an
+ * account. Not a happy situation. We should dig an account
+ * out of the book the transaction belongs to.
+ * XXX we should probably *always* to this, instead of the above loop!
+ */
+ PINFO ("Free Floating Transaction!");
+ QofBook *book = xaccTransGetBook (trans);
+ AccountGroup *root = xaccGetAccountGroup (book);
+ TransScrubOrphansFast (trans, root);
}
/* ================================================================ */
@@ -344,7 +354,27 @@
if (!root)
{
Split *s = slist->data;
+ if (NULL == s->acc)
+ {
+ /* This should never occur, since xaccTransScrubSplits()
+ * above should have fixed things up. */
+ PERR ("Split is not assigned to any account");
+ }
root = xaccAccountGetRoot (s->acc);
+ if (NULL == root)
+ {
+ /* This should never occur, accounts are always
+ * in an account group */
+ PERR ("Can't find root account");
+ QofBook *book = xaccTransGetBook (trans);
+ root = xaccGetAccountGroup (book);
+ }
+ if (NULL == root)
+ {
+ /* This can't occur, things should be in books */
+ PERR ("Bad data corruption, no root account in book");
+ return;
+ }
}
account = xaccScrubUtilityGetOrMakeAccount (root,
trans->common_currency, _("Imbalance"));
Index: cap-gains.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/cap-gains.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -Lsrc/engine/cap-gains.c -Lsrc/engine/cap-gains.c -u -r1.23 -r1.24
--- src/engine/cap-gains.c
+++ src/engine/cap-gains.c
@@ -445,12 +445,24 @@
*/
val_tot = split->value;
val_a = gnc_numeric_mul (amt_a, val_tot,
- GNC_DENOM_AUTO, GNC_DENOM_REDUCE);
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
tmp = gnc_numeric_div (val_a, amt_tot,
- gnc_numeric_denom(val_tot), GNC_DENOM_EXACT);
+ gnc_numeric_denom(val_tot),
+ GNC_HOW_RND_ROUND| GNC_HOW_DENOM_EXACT);
val_a = tmp;
val_b = gnc_numeric_sub_fixed (val_tot, val_a);
+ if (gnc_numeric_check(val_a))
+ {
+ PERR("Numeric overflow\n"
+ "Acct=%s Txn=%s\n"
+ "\tval_tot=%s amt_a=%s amt_tot=%s\n",
+ xaccAccountGetName(acc),
+ xaccTransGetDescription(trans),
+ gnc_numeric_to_string(val_tot),
+ gnc_numeric_to_string(amt_a),
+ gnc_numeric_to_string(amt_tot));
+ }
PINFO ("split value is = %s = %s + %s",
gnc_numeric_to_string(val_tot),
@@ -616,6 +628,10 @@
split->gains_split, split->gains,
kvp_frame_get_string (gnc_lot_get_slots (lot), "/title"));
+PINFO ("duude split amt=%s val=%s \n",
+ gnc_numeric_to_string (split->amount),
+ gnc_numeric_to_string (split->value));
+
/* Make sure the status flags and pointers are initialized */
if (GAINS_STATUS_UNKNOWN == split->gains) xaccSplitDetermineGainStatus(split);
if (pcy->PolicyIsOpeningSplit (pcy, lot, split))
@@ -707,6 +723,10 @@
pcy->PolicyGetLotOpening (pcy, lot, &opening_amount, &opening_value,
&opening_currency);
+PINFO ("duude lot opener amt=%s val=%s \n",
+ gnc_numeric_to_string (opening_amount),
+ gnc_numeric_to_string (opening_value));
+
/* Check to make sure the lot-opening currency and this split
* use the same currency */
if (FALSE == gnc_commodity_equiv (currency, opening_currency))
@@ -747,11 +767,13 @@
* cap_gain = current_value - cost_basis
*/
value = gnc_numeric_mul (opening_value, split->amount,
- GNC_DENOM_AUTO, GNC_RND_NEVER|GNC_DENOM_REDUCE);
+ GNC_DENOM_AUTO,
+ GNC_HOW_RND_NEVER|GNC_HOW_DENOM_REDUCE);
value = gnc_numeric_div (value, opening_amount,
- gnc_numeric_denom(opening_value), GNC_DENOM_EXACT);
+ gnc_numeric_denom(opening_value),
+ GNC_HOW_DENOM_EXACT|GNC_HOW_RND_ROUND);
value = gnc_numeric_sub (value, split->value,
- GNC_DENOM_AUTO, GNC_DENOM_LCD);
+ GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED);
PINFO ("Open amt=%s val=%s; split amt=%s val=%s; gains=%s\n",
gnc_numeric_to_string (opening_amount),
gnc_numeric_to_string (opening_value),
@@ -760,7 +782,16 @@
gnc_numeric_to_string (value));
if (gnc_numeric_check (value))
{
- PERR ("Numeric overflow during gains calculation");
+ PERR ("Numeric overflow during gains calculation\n"
+ "Acct=%s Txn=%s\n"
+ "\tOpen amt=%s val=%s\n\tsplit amt=%s val=%s\n\tgains=%s\n",
+ xaccAccountGetName(split->acc),
+ xaccTransGetDescription(split->parent),
+ gnc_numeric_to_string (opening_amount),
+ gnc_numeric_to_string (opening_value),
+ gnc_numeric_to_string (split->amount),
+ gnc_numeric_to_string (split->value),
+ gnc_numeric_to_string (value));
return;
}
@@ -875,6 +906,7 @@
xaccSplitGetCapGains(Split * split)
{
if (!split) return gnc_numeric_zero();
+ ENTER("(split=%p)", split);
if (GAINS_STATUS_UNKNOWN == split->gains) xaccSplitDetermineGainStatus(split);
if ((split->gains & GAINS_STATUS_A_VDIRTY) ||
@@ -892,6 +924,7 @@
split = split->gains_split;
}
+ LEAVE("(split=%p)", split);
if (!split) return gnc_numeric_zero();
return split->value;
@@ -910,6 +943,7 @@
* then the cap gains are changed. To capture this, we need
* to mark all splits dirty if the opening splits are dirty. */
+ ENTER("(lot=%p)", lot);
pcy = lot->account->policy;
for (node=lot->splits; node; node=node->next)
{
@@ -939,6 +973,7 @@
Split *s = node->data;
xaccSplitComputeCapGains (s, gain_acc);
}
+ LEAVE("(lot=%p)", lot);
}
/* ============================================================== */
@@ -1002,6 +1037,7 @@
{
SplitList *node;
+ ENTER("(trans=%p)", trans);
/* Lock down posted date, its to be synced to the posted date
* for the source of the cap gains. */
xaccScrubGainsDate(trans);
@@ -1036,6 +1072,7 @@
xaccSplitComputeCapGains (split, gain_acc);
}
}
+ LEAVE("(trans=%p)", trans);
}
/* =========================== END OF FILE ======================= */
More information about the gnucash-changes
mailing list