Topic: some fixes at delphi.
procedure TSqlitePassDatabaseDataTypeOptions.FindSubString
(Chr: Char; LowerStr: String; Var StartPos, EndPos: Word);
var
StrLength: Integer;
begin
StartPos := Pos(Chr,LowerStr);
StrLength := Length(LowerStr);
if StartPos > 0 then
begin
EndPos := StartPos;
// fix range check error
While (EndPos <= StrLength) Do
if (LowerStr[EndPos] = Chr) then
Inc(EndPos)
else Break;
end;
Dec(EndPos,StartPos);
end;
--------------------------------------------------------------------------------------------------------
const
{ Default Fields Type when DatabaseType is dtbUnknown }
DefaultFieldsTypes:array[0..21] of TSqlitePassPresetFieldType =
((Name:'widestring'; FieldType:ftString), { must be before string }
(Name:'string'; FieldType:ftString),
(Name:'smallint'; FieldType:ftSmallInt), { must be before integer }
(Name:'largeint'; FieldType:ftLargeint), { must be before integer }
(Name:'integer'; Fieldtype:ftInteger),
(Name:'word'; FieldType:ftWord),
(Name:'float'; FieldType:ftFloat),
(Name:'boolean'; FieldType:ftBoolean),
(Name:'currency'; FieldType:ftCurrency), // fix misspell
(Name:'bcd'; FieldType:ftBCD),
(Name:'datetime'; FieldType:ftDateTime), { must be before 'date' }
(Name:'date'; FieldType:ftDate),
(Name:'time'; FieldType:ftTime),
(Name:'varbytes'; FieldType:ftVarBytes),
(Name:'bytes'; FieldType:ftBytes),
(Name:'autoinc'; FieldType:ftLargeInt), { Do not set as ftAutoInc }
(Name:'fmtmemo'; FieldType:ftFmtMemo), { must be before memo }
(Name:'memo'; FieldType:ftMemo),
(Name:'blob'; FieldType:ftBlob),
(Name:'graphic'; FieldType:ftGraphic),
(Name:'typedbinary'; FieldType:ftTypedBinary),
(Name:'fixedchar'; FieldType:ftfixedchar));
-----------------------------------------------------------------------------------------------------------------------
procedure TSqlitePassRecordset.GetRecords(Sql: String);
var
Accept: Boolean;
PSqliteData: Pointer;
ColumnCount, ColumnIndex: Cardinal;
Buffer: PChar;
ValueOffset, BufferSize, ErrorCode,LowerLimit,
UpperLimit, LimitIdx, BufferFieldPos: Integer;
RecordIndex: Integer;
begin
Try
PSqliteData := nil;
...
for ColumnIndex := 0 to Pred(ColumnCount) do
begin
if Assigned(FDataset) then
{ fields are defined }
begin
BufferFieldPos := int64(ColumnIndex)-FRowIdTablesCount; // << fix integer overflow
if ColumnIndex < FRowIdTablesCount
{ Stores the rowid for each table returned by SQL }
then BufferSize := SqliteValueToBuffer(PSqliteData, ColumnIndex, BufferFieldPos, ftLargeInt, Buffer)
{ Stores the fields values }
else BufferSize := SqliteValueToBuffer(PSqliteData, ColumnIndex, BufferFieldPos, FDataset.FieldDefs[BufferFieldPos].DataType, Buffer);
Inc(Buffer, BufferSize);
end
-------------------------------------------------------------------------------------------------------------------------------
function TSqlitePassRecordset.SetFRecordSize: Integer;
var
i, j: Integer;
begin
FCalcFieldsCount := 0;
SetLength(FInternalFieldsOffset, 0);
...
GetMem(FCalcFieldsNullValuesInitBuffer, FCalcFieldsCount);
if FCalcFieldsNullValuesInitBuffer<>nil then // fix error, if FCalcFieldsCount=0 then FCalcFieldsNullValuesInitBuffer=nil
for i := 0 to Pred(FCalcFieldsCount)
do PByteBool(FCalcFieldsNullValuesInitBuffer + (i * SizeOf(ByteBool)))^ := True;
{ Set the definitive Fields Offset array size }
SetLength(FInternalFieldsOffset, j);
end
some fixes at delphi.