How to remove all txns from an Account?

Charles Day cedayiv at gmail.com
Tue Apr 15 20:43:45 EDT 2008


On Tue, Apr 15, 2008 at 2:36 PM, Charles Day <cedayiv at gmail.com> wrote:

> On Tue, Apr 15, 2008 at 2:11 PM, Derek Atkins <warlord at mit.edu> wrote:
>
> > Quoting Charles Day <cedayiv at gmail.com>:
> >
> >  OK, then we should very publicly document the dangerous trade-off: that
> > > the
> > > transaction callback function must never modify the account assigned
> > > to any
> > > split in the transaction, or destroy any split in the transaction, as
> > > doing
> > > so risks a crash.
> > >
> > > If you like, I can add that to the doxygen documentation in Account.h.
> > >
> >
> > Sure.   Go ahead.   That kind of documentation is a good thing.
>
>
> Will do.
>
>

OK, I've done this and made sure that doxygen will make the warnings fairly
obvious (there is a built-in "warning" format). There actually already were
a couple of warnings in Account.h, but not on functions I was looking at. I
have made sure that now every Account.h function that takes a
TransactionCallback argument has a warning. I'll include these changes with
my QIF importer fix.


> Also, it might make sense to do something like:
> >
> >  next = this->next
> >  callback(this)
> >  this = next
> >
> > instead of:
> >
> >  callback(this)
> >  this = this->next
> >
>
> That's definitely safer, but wouldn't entirely eliminate the risk of a
> crash since the callback function for the transaction associated with "this"
> split could destroy "next" if they both belong to the same transaction.
>

I went ahead and implemented change this in Account.c, so the loop now looks
like:

  for(split_p = priv->splits; split_p; split_p = next) {
    /* Get the next element in the split list now, just in case some
     * naughty thunk destroys the one we're using. This reduces, but
     * does not eliminate, the possibility of undefined results if
     * a thunk removes splits from this account. */
    next = g_list_next(split_p);

    s = split_p->data;
    trans = s->parent;
    if (trans && (trans->marker < stage)) {
      trans->marker = stage;
      if (thunk) {
        retval = thunk(trans, cb_data);
        if (retval) return retval;
      }
    }
  }


This will go in the fix as well, when it's finished and tested.

Or would you prefer the Account.h & Account.c fixes to be submitted
separately from the QIF fixes?

-Charles

 qif-to-gnc functionality.  But still, there shouldn't be any transactions
> > > > except those you've just imported.  You already have a handle on
> > > > those
> > > > transactions so just delete them.  Yet I'm still not sure how this
> > > > can
> > > > happen unless the qif-to-gnc is happening too early.
> > > >
> > > >
> > > You can still cancel the import after the qif-to-gnc stage by clicking
> > > Cancel on the final page of the druid instead of Apply. It is also
> > > necessary
> > > to cancel in cases where the qif-to-gnc functionality catches an
> > > exception
> > > (see my fix for bug 509089).
> > >
> > > When the Cancel button event is caught by the C handler, there is no
> > > already-built list of transactions. But either C or Scheme could build
> > > one
> > > based on the root account of the imported tree, which is known.
> > >
> > I also didn't think you could cancel the import after you reach the
> >
> > I see...
> >
> >  If I have to build my own list of transactions for a given account
> > > tree, is
> > > a QOF query perhaps the fastest way to go? There is already a routine
> > > written with this strategy in Scheme
> > > (gnc:account-tree-get-transactions in
> > > qif-merge-groups.scm).
> > >
> >
> > Might as well use that existing API.  I dont think you need a full
> > query.
> >
>
> OK, I'll give that a shot and see what happens.
>
> Charles
> > >
> > Cheers,
> >
> > -derek
> >
> > --
> >      Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
> >      Member, MIT Student Information Processing Board  (SIPB)
> >      URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
> >      warlord at MIT.EDU                        PGP key available
> >
> >
>


More information about the gnucash-devel mailing list