r21577 - gnucash/trunk/src/backend/xml - Fix xml backend to load and save invoice kvp values.

John Ralls jralls at ceridwen.us
Wed Dec 7 19:56:48 EST 2011


On Dec 7, 2011, at 8:15 AM, Geert Janssens wrote:

> Op woensdag 7 december 2011 10:34:33 schreef Derek Atkins:
>> John Ralls <jralls at ceridwen.us> writes:
>>>    This is effectively my "feature" flags suggestion from before. 
>>>    You flag (new) features as they are used, and refuse to load
>>>    the database if there are used features that you don't
>>>    understand.
>>> 
>>> Something to look at adding for 2.6 to get ready for the database
>>> overhaul in 2.8/3.0. It's not in 2.4, and it would need a new "feature"
>>> table to hold the features so it probably shouldn't go in.
>> 
>> Luckily the features table is one that doesn't affect the rest of the
>> database, so we could add it in without breaking <=2.4.8; but yes, only
>> versions >= 2.4.9 would know to check it, so it wouldn't necessarily
>> help older versions.
>> 
> To avoid confusion:
> You propose to add a features table for the upcoming 2.6 and backport it to 
> 2.4.9. So all (stable) versions as of 2.4.9 know how to handle it.
> 
> Together with this, I presume we should bump the compat version parameter, so 
> that older versions of GnuCash will not attempt to load data files with that 
> depend on the features table ? I don't see another way to prevent unintended 
> access to newer features by older versions.
> 
> Does it have to be a complete feature table by the way ? Or is just adding a 
> single number (like the minimum required gnucash version to open the data 
> file) sufficient. I don't see how an older version otherwise would know what 
> features to check in order to determine if it is still compatible.
> 
> Another question: who will be implementing this ? I don't feel comfortable 
> enough in either backend to do this. If it weren't for Alex' example, I would 
> have quite some difficulty also to simply add a new data field.
> 

I'd do it as a table with a feature name and a boolean "is-used" in SQL, and 
<xs:element name="features" required="true">
    <xs:element name="feature_name" required="false" multiple="true">
          <xs:attribute name="is_used" required="true" type="boolean"/>
    </xs:element>
</xs:element> 
in XML. (Sorry for the syntax, I'm pretty rusty at XML-Schema and didn't go look up the right attribute names.)
Gnucash would scan the table for any features with is_used="true" that it didn't know about and would raise an error if it found one. When writing it would add to the features table/element any new features that it knows about with is_true set appropriately.

The devil is in the details for knowing that it has written data that only a feature would know about. 

We should probably change the load logic in the SQL backend to query for specific field names instead of SELECT * and rely on the fields being presented in the right order while we're at it. That would be a lot more robust, and not just in the face of changing schema: SQL doesn't actually guarantee that fields will be returned in any particular order from a SELECT * , it just usually works out that they are.

I don't think that we can get this ready for a release this weekend....

Regards,
John Ralls




More information about the gnucash-devel mailing list