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. smile

Re: some fixes at delphi.

Thanks a lot Parcel.

I check and include your fixes in the 0.42 release.