Help with libdbi code

Geert Janssens geert.gnucash at kobaltwit.be
Sat May 7 11:47:05 EDT 2016


On Saturday 07 May 2016 16:23:56 Colin Law wrote:
> On 7 May 2016 at 15:56, John Ralls <jralls at ceridwen.us> wrote:
> > ..
> > Try changing gnc-backend-dbi.c line 2702 from
> > 
> >     type_name = "TIMESTAMP NULL DEFAULT 0";
> > 
> > to
> > 
> >     type_name = "TIMESTAMP NULL DEFAULT NULL";
> 
> I don't think it is necessary to specify DEFAULT NULL as that is the
> default.
> 
> Well That does prevent the error and nothing else undesirable seems to
> be happening.  Can we be sure, though, that nowhere does the code
> explicitly write 0 (as opposed to not asking for anything to be
> written,  so the default is written)?

Good question. I haven't searched thoroughly through the code yet. However one spot that 
may cause this is gnc_dbi_safe_sync_all in gnc-backend-dbi.c line 1642. If there is a 0 
timestamp somewhere in the DB, I assume it will plainly copy it. Of course this depends on 
whether some other code actually does write 0 timestamps. I haven't had time yet to search 
where timestamps are written or whether it's special cased somewhere in the backend code or 
anything.

>From the trace file however there's good hope that gnucash prefers to write NULL for an invalid 
timestamp, at least that's what it does for the slot table there.
> 
> I could not find anything in the libdbi docs that explicitly says what
> happens when a field containing NULL is fetched.  I presume it is
> going to return 0 however, so that should be OK.

No, a NULL value in the database is explicitly tested for in gnc-backend-dbi.c line 2108. In that 
case gnucash will internally continue with NULL. So this situation appears to be taken into 
account.

> 
> The other area I can think of where this could cause problems is if
> anywhere in the code issues a query specifying date <> 0 or > 0 or = 0
> or other similar operation.  These would have to be changed to IS NOT
> NULL etc.

True. I doubt gnucash does that already though. Gnucash reads the whole db in memory at load 
time and does all querying in-memory. It just writes back any change as well. Those write-backs 
typically use the guid to find the proper row in any table, not a timestamp.

Regards,

Geert


More information about the gnucash-devel mailing list