GDA: Question about some engine transaction functions

Derek Atkins warlord at MIT.EDU
Mon Mar 31 09:33:36 EDT 2008


Phil Longstaff <plongstaff at rogers.com> writes:

> src/engine/Transaction.c has the following functions:
>
> static void
> qofTransSetNum (Transaction *trans, const char *xnum)
> {
>         if (!qof_begin_edit(&trans->inst)) return;
>         xaccTransSetNum(trans, xnum);
>         qof_commit_edit(&trans->inst);
> }
> 	
> void
> xaccTransSetNum (Transaction *trans, const char *xnum)
> {
>    if (!trans || !xnum) return;
>    xaccTransBeginEdit(trans);
> 	
>    CACHE_REPLACE(trans->num, xnum);
>    qof_instance_set_dirty(QOF_INSTANCE(trans));
>    mark_trans(trans);  /* Dirty balance of every account in trans */
>    xaccTransCommitEdit(trans);
> }
>
>
> qofTransSetNum() is the function which is registered with qof, and if
> there is a function registered with qof, the gda backend tries to use
> it.  The problem is that if the editlevel is not 0 (which it is, because
> the gda backend calls xaccTransBeginEdit() before the tx is loaded from
> the db and xaccTransCommitEdit() after it is loaded), qof_begin_edit()
> will return FALSE so that the routine does nothing, but does leave the
> editlevel incremented.
>
> Is this correct behaviour?  If so, it is not useful to me.  Note that
> there are a number of these pairs of routine in Transaction.c and there
> may be more in other files.

I have no idea why qofTransSetNum() exists.  That logic certainly
looks wrong to me.  Even worse, the qof version will crash if you
pass in a NULL trans!  Eww.

> Phil

-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