[fpc-pascal] Re: RE : RE : RE : Assigning value toftVariantdatatype& varbytes-still stuck

Ludo Brands ludo.brands at free.fr
Wed Aug 10 13:48:45 CEST 2011


> Uploaded a patch to 
> http://bugs.freepascal.org/view.php?id=19930. Initially, 
> because of the crash, I wanted to submit another bug report 
> but the more I dig into this, the more I feel the definition 
> of SetFieldData/GetFieldData without a length/size parameter 
> and strings passed as pchar is causing all kind of problems:
> 1) TStringField.SetAsString copies the string to a buffer 
> with size dsMaxStringSize so that datasets that don't figure 
> out the original length of the string can simply copy the 
> full Field.TDatasize (TBufDataset, TDbf, TMemDataset,...). 
> TWideStringField.SetAsString didn't which caused the crash 
> when the string is shorter than Field.Size. 
> TCustomSqliteDataset uses a StrNew(PChar(Buffer)); to get the 
> length of the string but fails sometimes (see 4).
> 2) dsMaxStringSize isn't enforced for TStringField. Defining 
> a Field.size > dsMaxStringSize causes a crash in 
> TStringField.SetAsString. I haven't raised an issue on this, yet.
> 3) some of the speed advantage of memory based datasets is 
> offset by moving full Field.Tdatasize bytes in both set and 
> get fielddata
> 4) pascal strings can contain #0 characters in the string. 
> When converting to pchar part of these strings is lost. 
> 
> What I propose is:
> 1 to create overloaded versions of SetFieldData and 
> GetFieldData that include a length parameter, to change 
> TStringField.SetAsString and TWideStringField.SetAsWideString 
> to use these versions and to migrate the different datasets 
> to use these new versions. This way existing (user) code 
> using SetFieldData/GetFieldData will still work (and the user 
> still being responsible for buffer overruns...) and datasets 
> can correctly save and retrieve strings while improving performance. 
> 2 change the bufdataset internal storage for ftstring and 
> ftwidestring fields to include the string length so that 
> stored strings can be retrieved in full when containing #0 
> characters and without having to copy systematically datasize 
> bytes. However this will introduce an incompatible binary 
> format for TFpcBinaryDatapacketReader. Having a second 
> FpcBinaryIdent would allow for both formats to co-habitate. 
> 
> If need be the discussion can be moved to fpc-devel.
> 
> Ludo
> 
> PS: no misunderstanding. I'm volunteering to make these changes;)
> 
> 

BTW. Just noticed http://bugs.freepascal.org/view.php?id=19940 which is
directly linked to problem 2).

Ludo




More information about the fpc-pascal mailing list