Hi
I managed to implement correct TField.IsNull behaviour for fields inside TIBQuery dataset. I'm attaching:
-- patch to packages/base/ibase/ibase60types.inc, this fixes a small bug in ibase60 unit that defined Short as Integer (= 32 bits, since ibase60 unit is compiled in objfpc mode), while it should be 16 bits.
-- patch to fcl/db/interbase/interbase.pp that
1) Fixes FFieldFlag declaration, it should be an array of IBase60.Short type (16 bits, not 8-bits ShortInt type as it was).
2) Implements correct TField.IsNull behaviour by recording "IsNull" state of each field of each record, along with data of that field. ThenTIBQuery.GetFieldData can be modified to return correct value of IsNull, and set Buffer^ only if field is not null and Buffer nil (since TField.GetIsNull calls TField.GetData with Buffer = Nil, and this causes call to FDataset.GetFieldData with Buffer = nil)
3) Oh, and small changes to TIBTransaction that I sent in my previous email this day (publishing 4 properties) are also included in this patch. Sorry, this was just easier for me, and since I didn't see them committed yet... Anyway, these changes to TIBTransaction are absolutely not related to all that "IsNull stuff", so feel free to cut them out if you don't like them.
-- I'm also attaching a trivial program using Interbase unit and some testing db to check that IsNull works as it should. Just in case it will save you some time in testing my patch :)
Michalis.
