Browse Source

--- Merging r19994 into '.':
U packages/fcl-db/src/base/dataset.inc
U packages/fcl-db/src/base/bufdataset.pas
U packages/fcl-db/src/base/db.pas
U packages/fcl-db/src/base/bufdataset_parser.pp
--- Merging r19998 into '.':
U packages/fcl-db/src/sqlite/customsqliteds.pas
U packages/fcl-db/src/memds/memds.pp
U packages/fcl-db/src/json/fpjsondataset.pp
G packages/fcl-db/src/base/db.pas
U packages/fcl-db/src/sdf/sdfdata.pp
U packages/fcl-db/src/dbase/dbf_dbffile.pas
U packages/fcl-db/src/dbase/dbf_parser.pas
U packages/fcl-db/src/dbase/dbf_idxfile.pas
U packages/fcl-db/src/dbase/dbf_idxcur.pas
U packages/fcl-db/src/dbase/dbf.pas
U packages/fcl-db/src/paradox/paradox.pp
--- Merging r20050 into '.':
G packages/fcl-db/src/memds/memds.pp
--- Merging r20052 into '.':
U packages/fcl-db/tests/testfieldtypes.pas
U packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp
U packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
U packages/fcl-db/src/base/fields.inc
--- Merging r20059 into '.':
U packages/ibase/src/ibase60.inc
--- Merging r20067 into '.':
G packages/fcl-db/src/base/bufdataset.pas

# revisions: 19994,19998,20050,20052,20059,20067
------------------------------------------------------------------------
r19994 | marco | 2012-01-07 18:38:36 +0100 (Sat, 07 Jan 2012) | 3 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas
M /trunk/packages/fcl-db/src/base/bufdataset_parser.pp
M /trunk/packages/fcl-db/src/base/dataset.inc
M /trunk/packages/fcl-db/src/base/db.pas

* TRecordBuffer, first batch (src/base). Delphi/Unicode defines buffer types as TRecordBuffer=PByte.
For now, TRecordBuffer=Pansichar is used, but at least the signatures are more D2009+ compat now.

------------------------------------------------------------------------
------------------------------------------------------------------------
r19998 | marco | 2012-01-07 22:18:29 +0100 (Sat, 07 Jan 2012) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/db.pas
M /trunk/packages/fcl-db/src/dbase/dbf.pas
M /trunk/packages/fcl-db/src/dbase/dbf_dbffile.pas
M /trunk/packages/fcl-db/src/dbase/dbf_idxcur.pas
M /trunk/packages/fcl-db/src/dbase/dbf_idxfile.pas
M /trunk/packages/fcl-db/src/dbase/dbf_parser.pas
M /trunk/packages/fcl-db/src/json/fpjsondataset.pp
M /trunk/packages/fcl-db/src/memds/memds.pp
M /trunk/packages/fcl-db/src/paradox/paradox.pp
M /trunk/packages/fcl-db/src/sdf/sdfdata.pp
M /trunk/packages/fcl-db/src/sqlite/customsqliteds.pas

* Rest of fcl-db adapted to use TRecordBuffer.

------------------------------------------------------------------------
------------------------------------------------------------------------
r20050 | marco | 2012-01-11 16:04:55 +0100 (Wed, 11 Jan 2012) | 3 lines
Changed paths:
M /trunk/packages/fcl-db/src/memds/memds.pp

* Delphi ifdef for ptrint changed to an includefile since the old hack
won't work on XE2 64-bit. Related to mantis #20575

------------------------------------------------------------------------
------------------------------------------------------------------------
r20052 | marco | 2012-01-11 18:16:08 +0100 (Wed, 11 Jan 2012) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/fields.inc
M /trunk/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc
M /trunk/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp
M /trunk/packages/fcl-db/tests/testfieldtypes.pas

* Length of data in binary string. First part of Mantis #20453

------------------------------------------------------------------------
------------------------------------------------------------------------
r20059 | michael | 2012-01-12 20:47:44 +0100 (Thu, 12 Jan 2012) | 1 line
Changed paths:
M /trunk/packages/ibase/src/ibase60.inc

* Changed to a more sensible and backwards comparible loading order
------------------------------------------------------------------------
------------------------------------------------------------------------
r20067 | joost | 2012-01-13 22:46:10 +0100 (Fri, 13 Jan 2012) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/bufdataset.pas

* Made DoFilterRecord virtual, so that descendents can add their own filtering easily
------------------------------------------------------------------------

git-svn-id: branches/fixes_2_6@20112 -

marco 13 years ago
parent
commit
e639884937

+ 87 - 88
packages/fcl-db/src/base/bufdataset.pas

@@ -84,7 +84,7 @@ type
      - If UpdateKind is ukModify it contains a record-buffer which contains the old data
      - If UpdateKind is ukDelete it contains a record-buffer with the data of the deleted record
 }
-    OldValuesBuffer    : pchar;
+    OldValuesBuffer    : TRecordBuffer;
   end;
 
   PBufBlobField = ^TBufBlobField;
@@ -116,10 +116,10 @@ type
   protected
     function GetBookmarkSize: integer; virtual; abstract;
     function GetCurrentBuffer: Pointer; virtual; abstract;
-    function GetCurrentRecord: PChar; virtual; abstract;
+    function GetCurrentRecord: TRecordBuffer; virtual; abstract;
     function GetIsInitialized: boolean; virtual; abstract;
-    function GetSpareBuffer: PChar; virtual; abstract;
-    function GetSpareRecord: PChar; virtual; abstract;
+    function GetSpareBuffer: TRecordBuffer; virtual; abstract;
+    function GetSpareRecord: TRecordBuffer; virtual; abstract;
   public
     DBCompareStruct : TDBCompareStruct;
     Name            : String;
@@ -151,7 +151,7 @@ type
 
     procedure InitialiseIndex; virtual; abstract;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); virtual; abstract;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); virtual; abstract;
     procedure ReleaseSpareRecord; virtual; abstract;
 
     procedure BeginUpdate; virtual; abstract;
@@ -160,7 +160,7 @@ type
     procedure AddRecord; virtual; abstract;
     // Inserts a record before the current record, or if the record is sorted,
     // insert it to the proper position
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); virtual; abstract;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); virtual; abstract;
     procedure EndUpdate; virtual; abstract;
     
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); virtual; abstract;
@@ -169,9 +169,9 @@ type
     Function GetRecNo(const ABookmark : PBufBookmark) : integer; virtual; abstract;
 
 
-    property SpareRecord : PChar read GetSpareRecord;
-    property SpareBuffer : PChar read GetSpareBuffer;
-    property CurrentRecord : PChar read GetCurrentRecord;
+    property SpareRecord : TRecordBuffer read GetSpareRecord;
+    property SpareBuffer : TRecordBuffer read GetSpareBuffer;
+    property CurrentRecord : TRecordBuffer read GetCurrentRecord;
     property CurrentBuffer : Pointer read GetCurrentBuffer;
     property IsInitialized : boolean read GetIsInitialized;
     property BookmarkSize : integer read GetBookmarkSize;
@@ -190,10 +190,10 @@ type
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     FLastRecBuf     : PBufRecLinkItem;
     FFirstRecBuf    : PBufRecLinkItem;
@@ -219,7 +219,7 @@ type
 
     procedure InitialiseIndex; override;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
@@ -227,7 +227,7 @@ type
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
     procedure EndUpdate; override;
   end;
 
@@ -235,14 +235,14 @@ type
 
   TUniDirectionalBufIndex = class(TBufIndex)
   private
-    FSPareBuffer: PChar;
+    FSPareBuffer:  TRecordBuffer;
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     function ScrollBackward : TGetResult; override;
     function ScrollForward : TGetResult; override;
@@ -264,7 +264,7 @@ type
     procedure GotoBookmark(const ABookmark : PBufBookmark); override;
 
     procedure InitialiseIndex; override;
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
@@ -272,7 +272,7 @@ type
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
     procedure EndUpdate; override;
   end;
 
@@ -289,10 +289,10 @@ type
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     FCurrentRecInd  : integer;
     FRecordArray    : array of Pointer;
@@ -320,12 +320,12 @@ type
 
     procedure InitialiseIndex; override;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     Function GetRecNo(const ABookmark : PBufBookmark) : integer; override;
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
@@ -405,7 +405,7 @@ type
     FIndexesCount   : integer;
     FCurrentIndex   : TBufIndex;
 
-    FFilterBuffer   : pchar;
+    FFilterBuffer   : TRecordBuffer;
     FBRecordCount   : integer;
 
     FPacketRecords  : integer;
@@ -430,12 +430,12 @@ type
     procedure FetchAll;
     procedure BuildIndex(var AIndex : TBufIndex);
     function GetIndexDefs : TIndexDefs;
-    function  GetCurrentBuffer: PChar;
+    function  GetCurrentBuffer: TRecordBuffer;
     procedure CalcRecordSize;
     function GetIndexFieldNames: String;
     function GetIndexName: String;
     function GetBufUniDirectional: boolean;
-    function LoadBuffer(Buffer : PChar): TGetResult;
+    function LoadBuffer(Buffer : TRecordBuffer): TGetResult;
     function GetFieldSize(FieldDef : TFieldDef) : longint;
     function GetRecordUpdateBuffer(const ABookmark : TBufBookmark; IncludePrior : boolean = false; AFindNext : boolean = false) : boolean;
     function GetRecordUpdateBufferCached(const ABookmark : TBufBookmark; IncludePrior : boolean = false) : boolean;
@@ -445,12 +445,11 @@ type
     procedure SetIndexName(AValue: String);
     procedure SetMaxIndexesCount(const AValue: Integer);
     procedure SetPacketRecords(aValue : integer);
-    function  IntAllocRecordBuffer: PChar;
-    procedure DoFilterRecord(out Acceptable: Boolean);
+    function  IntAllocRecordBuffer: TRecordBuffer;
     procedure ParseFilter(const AFilter: string);
     procedure IntLoadFielddefsFromFile;
     procedure IntLoadRecordsFromFile;
-    procedure CurrentRecordToBuffer(Buffer: PChar);
+    procedure CurrentRecordToBuffer(Buffer: TRecordBuffer);
     procedure SetBufUniDirectional(const AValue: boolean);
     procedure InitDefaultIndexes;
   protected
@@ -461,12 +460,12 @@ type
     procedure SetRecNo(Value: Longint); override;
     function  GetRecNo: Longint; override;
     function GetChangeCount: integer; virtual;
-    function  AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure ClearCalcFields(Buffer: PChar); override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    function  AllocRecordBuffer: TRecordBuffer override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     function  GetCanModify: Boolean; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     procedure DoBeforeClose; override;
     procedure InternalOpen; override;
     procedure InternalClose; override;
@@ -479,12 +478,12 @@ type
     procedure InternalDelete; override;
     procedure InternalFirst; override;
     procedure InternalLast; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
     function IsCursorOpen: Boolean; override;
     function  GetRecordCount: Longint; override;
     procedure ApplyRecUpdate(UpdateKind : TUpdateKind); virtual;
@@ -493,6 +492,7 @@ type
     procedure SetFiltered(Value: Boolean); override; {virtual;}
     procedure InternalRefresh; override;
     procedure BeforeRefreshOpenCursor; virtual;
+    procedure DoFilterRecord(out Acceptable: Boolean); virtual;
   {abstracts, must be overidden by descendents}
     function Fetch : boolean; virtual;
     function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
@@ -1072,13 +1072,13 @@ begin
   Result:= True;
 end;
 
-function TCustomBufDataset.intAllocRecordBuffer: PChar;
+function TCustomBufDataset.intAllocRecordBuffer: TRecordBuffer;
 begin
   // Note: Only the internal buffers of TDataset provide bookmark information
   result := AllocMem(FRecordsize+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
 end;
 
-function TCustomBufDataset.AllocRecordBuffer: PChar;
+function TCustomBufDataset.AllocRecordBuffer: TRecordBuffer;
 begin
   result := AllocMem(FRecordsize + BookmarkSize + CalcfieldsSize);
 // The records are initialised, or else the fields of an empty, just-opened dataset
@@ -1086,12 +1086,12 @@ begin
   InitRecord(result);
 end;
 
-procedure TCustomBufDataset.FreeRecordBuffer(var Buffer: PChar);
+procedure TCustomBufDataset.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   ReAllocMem(Buffer,0);
 end;
 
-procedure TCustomBufDataset.ClearCalcFields(Buffer: PChar);
+procedure TCustomBufDataset.ClearCalcFields(Buffer: TRecordBuffer);
 begin
   if CalcFieldsSize > 0 then
     FillByte((Buffer+RecordSize)^,CalcFieldsSize,0);
@@ -1136,7 +1136,7 @@ procedure TCustomBufDataset.InternalClose;
 
 var r  : integer;
     iGetResult : TGetResult;
-    pc : pchar;
+    pc : TRecordBuffer;
 
 begin
   FOpen:=False;
@@ -1199,9 +1199,9 @@ begin
   SetToLastRecord;
 end;
 
-function TDoubleLinkedBufIndex.GetCurrentRecord: PChar;
+function TDoubleLinkedBufIndex.GetCurrentRecord: TRecordBuffer;
 begin
-  Result := pchar(FCurrentRecBuf);
+  Result := TRecordBuffer(FCurrentRecBuf);
 end;
 
 function TDoubleLinkedBufIndex.GetBookmarkSize: integer;
@@ -1219,14 +1219,14 @@ begin
   Result := (FFirstRecBuf<>nil);
 end;
 
-function TDoubleLinkedBufIndex.GetSpareBuffer: PChar;
+function TDoubleLinkedBufIndex.GetSpareBuffer: TRecordBuffer;
 begin
   Result := pointer(FLastRecBuf)+(sizeof(TBufRecLinkItem)*FDataset.MaxIndexesCount);
 end;
 
-function TDoubleLinkedBufIndex.GetSpareRecord: PChar;
+function TDoubleLinkedBufIndex.GetSpareRecord: TRecordBuffer;
 begin
-  Result := pchar(FLastRecBuf);
+  Result := TRecordBuffer(FLastRecBuf);
 end;
 
 constructor TBufIndex.Create(const ADataset: TCustomBufDataset);
@@ -1351,7 +1351,7 @@ begin
     Result := True;
 end;
 
-procedure TDoubleLinkedBufIndex.InitialiseSpareRecord(const ASpareRecord : PChar);
+procedure TDoubleLinkedBufIndex.InitialiseSpareRecord(const ASpareRecord : TRecordBuffer);
 begin
   FFirstRecBuf := pointer(ASpareRecord);
   FLastRecBuf := FFirstRecBuf;
@@ -1402,7 +1402,7 @@ begin
 end;
 
 procedure TDoubleLinkedBufIndex.AddRecord;
-var ARecord: PChar;
+var ARecord: TRecordBuffer;
 begin
   ARecord := FDataset.IntAllocRecordBuffer;
   FLastRecBuf[IndNr].next := pointer(ARecord);
@@ -1411,7 +1411,7 @@ begin
   FLastRecBuf := FLastRecBuf[IndNr].next;
 end;
 
-procedure TDoubleLinkedBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TDoubleLinkedBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: TRecordBuffer);
 var ANewRecord : PBufRecLinkItem;
 begin
   ANewRecord:=PBufRecLinkItem(ARecord);
@@ -1434,7 +1434,7 @@ begin
   if FCursOnFirstRec then FCurrentRecBuf:=FLastRecBuf;
 end;
 
-procedure TCustomBufDataset.CurrentRecordToBuffer(Buffer: PChar);
+procedure TCustomBufDataset.CurrentRecordToBuffer(Buffer: TRecordBuffer);
 var ABookMark : PBufBookmark;
 begin
   with FCurrentIndex do
@@ -1472,7 +1472,7 @@ begin
     end;
 end;
 
-function TCustomBufDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+function TCustomBufDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 
 var Acceptable : Boolean;
     SaveState : TDataSetState;
@@ -1607,27 +1607,27 @@ begin
     DatabaseError(SMinIndexes);
 end;
 
-procedure TCustomBufDataset.InternalSetToRecord(Buffer: PChar);
+procedure TCustomBufDataset.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   FCurrentIndex.GotoBookmark(PBufBookmark(Buffer+FRecordSize));
 end;
 
-procedure TCustomBufDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomBufDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PBufBookmark(Buffer + FRecordSize)^ := PBufBookmark(Data)^;
 end;
 
-procedure TCustomBufDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TCustomBufDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag := Value;
 end;
 
-procedure TCustomBufDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomBufDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PBufBookmark(Data)^ := PBufBookmark(Buffer + FRecordSize)^;
 end;
 
-function TCustomBufDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TCustomBufDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag;
 end;
@@ -1642,7 +1642,7 @@ end;
 function TCustomBufDataset.getnextpacket : integer;
 
 var i : integer;
-    pb : pchar;
+    pb : TRecordBuffer;
 
 begin
   if FAllPacketsFetched then
@@ -1747,7 +1747,7 @@ begin
     Result := GetRecordUpdateBuffer(ABookmark,IncludePrior);
 end;
 
-function TCustomBufDataset.LoadBuffer(Buffer : PChar): TGetResult;
+function TCustomBufDataset.LoadBuffer(Buffer : TRecordBuffer): TGetResult;
 
 var NullMask        : pbyte;
     x               : longint;
@@ -1791,7 +1791,7 @@ begin
   Result := grOK;
 end;
 
-function TCustomBufDataset.GetCurrentBuffer: PChar;
+function TCustomBufDataset.GetCurrentBuffer: TRecordBuffer;
 begin
   if State = dsFilter then Result := FFilterBuffer
   else if state = dsCalcFields then Result := CalcBuffer
@@ -1807,7 +1807,7 @@ end;
 
 function TCustomBufDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 
-var CurrBuff : pchar;
+var CurrBuff : TRecordBuffer;
 
 begin
   Result := False;
@@ -1935,7 +1935,7 @@ procedure TCustomBufDataset.CancelUpdates;
 var StoreRecBM     : TBufBookmark;
   procedure CancelUpdBuffer(var AUpdBuffer : TRecUpdateBuffer);
   var
-    TmpBuf         : PChar;
+    TmpBuf         : TRecordBuffer;
     StoreUpdBuf    : integer;
     Bm             : TBufBookmark;
     x              : Integer;
@@ -1945,15 +1945,15 @@ var StoreRecBM     : TBufBookmark;
       if (UpdateKind = ukModify) then
         begin
         FCurrentIndex.GotoBookmark(@BookmarkData);
-        move(pchar(OldValuesBuffer)^,pchar(FCurrentIndex.CurrentBuffer)^,FRecordSize);
+        move(TRecordBuffer(OldValuesBuffer)^,TRecordBuffer(FCurrentIndex.CurrentBuffer)^,FRecordSize);
         FreeRecordBuffer(OldValuesBuffer);
         end
       else if (UpdateKind = ukDelete) and (assigned(OldValuesBuffer)) then
         begin
         FCurrentIndex.GotoBookmark(@NextBookmarkData);
-        FCurrentIndex.InsertRecordBeforeCurrentRecord(PChar(BookmarkData.BookmarkData));
+        FCurrentIndex.InsertRecordBeforeCurrentRecord(TRecordBuffer(BookmarkData.BookmarkData));
         FCurrentIndex.ScrollBackward;
-        move(pchar(OldValuesBuffer)^,pchar(FCurrentIndex.CurrentBuffer)^,FRecordSize);
+        move(TRecordBuffer(OldValuesBuffer)^,TRecordBuffer(FCurrentIndex.CurrentBuffer)^,FRecordSize);
 
 {        for x := length(FUpdateBuffer)-1 downto 0 do
           begin
@@ -2083,7 +2083,7 @@ begin
           begin
           FreeRecordBuffer(FUpdateBuffer[r].OldValuesBuffer);
           if FUpdateBuffer[r].UpdateKind = ukDelete then
-            FreeRecordBuffer(PChar(FUpdateBuffer[r].BookmarkData.BookmarkData));
+            FreeRecordBuffer( TRecordBuffer(FUpdateBuffer[r].BookmarkData.BookmarkData));
           FUpdateBuffer[r].BookmarkData.BookmarkData := nil;
           end
         end;
@@ -2137,7 +2137,7 @@ end;
 
 procedure TCustomBufDataset.InternalPost;
 
-Var CurrBuff     : PChar;
+Var CurrBuff     :  TRecordBuffer;
     i            : integer;
     blobbuf      : tbufblobfield;
     NullMask     : pbyte;
@@ -2272,7 +2272,7 @@ begin
 end;
 
 
-procedure TCustomBufDataset.InternalInitRecord(Buffer: PChar);
+procedure TCustomBufDataset.InternalInitRecord(Buffer:  TRecordBuffer);
 
 begin
   FillChar(Buffer^, FRecordSize, #0);
@@ -2305,7 +2305,7 @@ end;
 
 function TCustomBufDataset.GetRecNo: Longint;
 
-Var abuf            : PChar;
+Var abuf            :  TRecordBuffer;
 
 begin
   abuf := GetCurrentBuffer;
@@ -2848,7 +2848,6 @@ begin
   // check filtertext
   if Acceptable and (Length(Filter) > 0) then
     Acceptable := Boolean((FParser.ExtractFromBuffer(GetCurrentBuffer))^);
-
 end;
 
 procedure TCustomBufDataset.SetFilterText(const Value: String);
@@ -2976,7 +2975,7 @@ var CurrLinkItem    : PBufRecLinkItem;
     DBCompareStruct : TDBCompareStruct;
     FieldNr         : Integer;
     StoreDSState    : TDataSetState;
-    FilterBuffer    : PChar;
+    FilterBuffer    :  TRecordBuffer;
     FiltAcceptable  : boolean;
 
 begin
@@ -3059,10 +3058,10 @@ end;
 
 function TArrayBufIndex.GetCurrentBuffer: Pointer;
 begin
-  Result:=pchar(FRecordArray[FCurrentRecInd]);
+  Result:=TRecordBuffer(FRecordArray[FCurrentRecInd]);
 end;
 
-function TArrayBufIndex.GetCurrentRecord: PChar;
+function TArrayBufIndex.GetCurrentRecord:  TRecordBuffer;
 begin
   Result:=GetCurrentBuffer;
 end;
@@ -3072,15 +3071,15 @@ begin
   Result:=Length(FRecordArray)>0;
 end;
 
-function TArrayBufIndex.GetSpareBuffer: PChar;
+function TArrayBufIndex.GetSpareBuffer:  TRecordBuffer;
 begin
   if FLastRecInd>-1 then
-    Result:=pchar(FRecordArray[FLastRecInd])
+    Result:= TRecordBuffer(FRecordArray[FLastRecInd])
   else
     Result := nil;
 end;
 
-function TArrayBufIndex.GetSpareRecord: PChar;
+function TArrayBufIndex.GetSpareRecord:  TRecordBuffer;
 begin
   Result := GetSpareBuffer;
 end;
@@ -3205,7 +3204,7 @@ begin
   FLastRecInd:=-1;
 end;
 
-procedure TArrayBufIndex.InitialiseSpareRecord(const ASpareRecord: PChar);
+procedure TArrayBufIndex.InitialiseSpareRecord(const ASpareRecord:  TRecordBuffer);
 begin
   FLastRecInd := 0;
  // FCurrentRecInd := 0;
@@ -3230,7 +3229,7 @@ begin
   dec(FLastRecInd);
 end;
 
-procedure TArrayBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TArrayBufIndex.InsertRecordBeforeCurrentRecord(const ARecord:  TRecordBuffer);
 begin
   inc(FLastRecInd);
   if FLastRecInd >= length(FRecordArray) then
@@ -3247,7 +3246,7 @@ begin
 end;
 
 procedure TArrayBufIndex.AddRecord;
-var ARecord: PChar;
+var ARecord:  TRecordBuffer;
 begin
   ARecord := FDataset.IntAllocRecordBuffer;
   inc(FLastRecInd);
@@ -3418,7 +3417,7 @@ begin
   result := FSPareBuffer;
 end;
 
-function TUniDirectionalBufIndex.GetCurrentRecord: PChar;
+function TUniDirectionalBufIndex.GetCurrentRecord:  TRecordBuffer;
 begin
 //  Result:=inherited GetCurrentRecord;
 end;
@@ -3428,12 +3427,12 @@ begin
   Result := Assigned(FSPareBuffer);
 end;
 
-function TUniDirectionalBufIndex.GetSpareBuffer: PChar;
+function TUniDirectionalBufIndex.GetSpareBuffer:  TRecordBuffer;
 begin
   result := FSPareBuffer;
 end;
 
-function TUniDirectionalBufIndex.GetSpareRecord: PChar;
+function TUniDirectionalBufIndex.GetSpareRecord:  TRecordBuffer;
 begin
   result := FSPareBuffer;
 end;
@@ -3514,7 +3513,7 @@ begin
   // do nothing
 end;
 
-procedure TUniDirectionalBufIndex.InitialiseSpareRecord(const ASpareRecord: PChar);
+procedure TUniDirectionalBufIndex.InitialiseSpareRecord(const ASpareRecord:  TRecordBuffer);
 begin
   FSPareBuffer:=ASpareRecord;
 end;
@@ -3544,7 +3543,7 @@ begin
   // Do nothing
 end;
 
-procedure TUniDirectionalBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TUniDirectionalBufIndex.InsertRecordBeforeCurrentRecord(const ARecord:  TRecordBuffer);
 begin
   // Do nothing
 end;

+ 16 - 16
packages/fcl-db/src/base/bufdataset_parser.pp

@@ -43,7 +43,7 @@ type
     procedure ClearExpressions; override;
 
     procedure ParseExpression(AExpression: string); virtual;
-    function ExtractFromBuffer(Buffer: PChar): PChar; virtual;
+    function ExtractFromBuffer(Buffer: TRecordBuffer): PChar; virtual;
 
     property Dataset: TDataSet read FDataset; // write FDataset;
     property Expression: string read FCurrentExpression;
@@ -72,7 +72,7 @@ type
   public
     constructor Create(UseField: TField);
 
-    procedure Refresh(Buffer: PChar); virtual; abstract;
+    procedure Refresh(Buffer: TRecordBuffer); virtual; abstract;
 
     property FieldVal: Pointer read GetFieldVal;
     property FieldDef: TField read FField;
@@ -90,7 +90,7 @@ type
     constructor Create(UseField: TField);
     destructor Destroy; override;
 
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TFloatFieldVar = class(TFieldVar)
@@ -100,7 +100,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TIntegerFieldVar = class(TFieldVar)
@@ -110,7 +110,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TLargeIntFieldVar = class(TFieldVar)
@@ -120,7 +120,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TDateTimeFieldVar = class(TFieldVar)
@@ -130,7 +130,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TBooleanFieldVar = class(TFieldVar)
@@ -140,7 +140,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
 //--TFieldVar----------------------------------------------------------------
@@ -179,7 +179,7 @@ begin
   inherited;
 end;
 
-procedure TStringFieldVar.Refresh(Buffer: PChar);
+procedure TStringFieldVar.Refresh(Buffer: TRecordBuffer);
 var Fieldbuf : TStringFieldBuffer;
     s        : string;
 begin
@@ -201,7 +201,7 @@ begin
   Result := etFloat;
 end;
 
-procedure TFloatFieldVar.Refresh(Buffer: PChar);
+procedure TFloatFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -218,7 +218,7 @@ begin
   Result := etInteger;
 end;
 
-procedure TIntegerFieldVar.Refresh(Buffer: PChar);
+procedure TIntegerFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -235,7 +235,7 @@ begin
   Result := etLargeInt;
 end;
 
-procedure TLargeIntFieldVar.Refresh(Buffer: PChar);
+procedure TLargeIntFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -252,7 +252,7 @@ begin
   Result := etDateTime;
 end;
 
-procedure TDateTimeFieldVar.Refresh(Buffer: PChar);
+procedure TDateTimeFieldVar.Refresh(Buffer:TRecordBuffer );
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -269,7 +269,7 @@ begin
   Result := etBoolean;
 end;
 
-procedure TBooleanFieldVar.Refresh(Buffer: PChar);
+procedure TBooleanFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := False;
@@ -437,7 +437,7 @@ end;
 
 procedure TBufDatasetParser.ParseExpression(AExpression: string);
 var
-  TempBuffer: pchar;
+  TempBuffer: TRecordBuffer;
 begin
   // clear any current expression
   ClearExpressions;
@@ -486,7 +486,7 @@ begin
   FCurrentExpression := AExpression;
 end;
 
-function TBufDatasetParser.ExtractFromBuffer(Buffer: PChar): PChar;
+function TBufDatasetParser.ExtractFromBuffer(Buffer: TRecordBuffer): PChar;
 var
   I: Integer;
 begin

+ 26 - 27
packages/fcl-db/src/base/dataset.inc

@@ -30,7 +30,7 @@ begin
   FConstraints:=TCheckConstraints.Create(Self);
   
 // FBuffer must be allocated on create, to make Activebuffer return nil
-  ReAllocMem(FBuffers,SizeOf(PChar));
+  ReAllocMem(FBuffers,SizeOf(TRecordBuffer));
 //  pointer(FBuffers^) := nil;
   FBuffers[0] := nil;
   FActiveRecord := 0;
@@ -138,12 +138,11 @@ begin
           and (getBookMarkFlag(ActiveBuffer)=bfCurrent);
 end;
 
-Procedure TDataset.CalculateFields(Buffer: PChar);
+Procedure TDataset.CalculateFields(Buffer: TRecordBuffer);
 var
   i: Integer;
 begin
-  FCalcBuffer := Buffer;
-  
+  FCalcBuffer := Buffer; 
   if not IsUniDirectional and (FState <> dsInternalCalc) then try
     ClearCalcFields(FCalcBuffer);
     for i := 0 to FFieldList.Count - 1 do
@@ -178,7 +177,7 @@ begin
   FEOF:=True;
 end;
 
-Procedure TDataset.ClearCalcFields(Buffer: PChar);
+Procedure TDataset.ClearCalcFields(Buffer: TRecordBuffer);
 
 begin
   // Empty
@@ -466,13 +465,13 @@ begin
     end
 end;
 
-Function TDataset.GetBuffer (Index : longint) : Pchar;
+Function TDataset.GetBuffer (Index : longint) : TRecordBuffer;
 
 begin
   Result:=FBuffers[Index];
 end;
 
-Procedure TDataset.GetCalcFields(Buffer: PChar);
+Procedure TDataset.GetCalcFields(Buffer: TRecordBuffer);
 
 var
   dss: TDataSetState;
@@ -936,7 +935,7 @@ begin
     end;
 end;
 
-Procedure TDataset.InitRecord(Buffer: PChar);
+Procedure TDataset.InitRecord(Buffer: TRecordBuffer);
 
 begin
   InternalInitRecord(Buffer);
@@ -990,7 +989,7 @@ begin
   end;
 end;
 
-Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
+Procedure TDataset.RefreshInternalCalcFields(Buffer: TRecordBuffer);
 
 begin
   //!! To be implemented
@@ -1026,7 +1025,7 @@ begin
     ShowException(ExceptObject,ExceptAddr);
 end;
 
-procedure TDataSet.InternalInitRecord(Buffer: PChar);
+procedure TDataSet.InternalInitRecord(Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
@@ -1055,17 +1054,17 @@ begin
   Checkrequired;
 end;
 
-procedure TDataSet.InternalSetToRecord(Buffer: PChar);
+procedure TDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
 
-procedure TDataSet.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TDataSet.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   // empty stub
 end;
 
-procedure TDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   // empty stub
 end;
@@ -1194,25 +1193,25 @@ begin
   If Value>FBufferCount then
     begin
 {$ifdef dsdebug}
-    Writeln ('   Reallocating memory :',(Value+1)*SizeOf(PChar));
+    Writeln ('   Reallocating memory :',(Value+1)*SizeOf(TRecordBuffer));
 {$endif}
     ReAllocMem(FBuffers,(Value+1)*SizeOf(PChar));
 {$ifdef dsdebug}
-    Writeln ('   Filling memory :',(Value+1-FBufferCount)*SizeOf(PChar));
+    Writeln ('   Filling memory :',(Value+1-FBufferCount)*SizeOf(TRecordBuffer));
 {$endif}
     inc(FBufferCount); // Cause FBuffers[FBufferCount] is already allocated
-    FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(Pchar),#0);
+    FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(TRecordBuffer),#0);
 {$ifdef dsdebug}
     Writeln ('   Filled memory :');
 {$endif}
     Try
 {$ifdef dsdebug}
-      Writeln ('   Assigning buffers :',(Value)*SizeOf(PChar));
+      Writeln ('   Assigning buffers :',(Value)*SizeOf(TRecordBuffer));
 {$endif}
       For I:=FBufferCount to Value do
         FBuffers[i]:=AllocRecordBuffer;
 {$ifdef dsdebug}
-      Writeln ('   Assigned buffers ',FBufferCount,' :',(Value)*SizeOf(PChar));
+      Writeln ('   Assigned buffers ',FBufferCount,' :',(Value)*SizeOf(TRecordBuffer));
 {$endif}
     except
       I:=FBufferCount;
@@ -1243,11 +1242,11 @@ begin
       // FBuffer must stay allocated, to make sure that Activebuffer returns nil
       if Value = -1 then
         begin
-        ReAllocMem(FBuffers,SizeOf(Pchar));
+        ReAllocMem(FBuffers,SizeOf(TRecordBuffer));
         FBuffers[0] := nil;
         end
       else
-        ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
+        ReAllocMem(FBuffers,(Value+1)*SizeOf(TRecordBuffer));
       end;
     end;
   FBufferCount:=Value;
@@ -1388,7 +1387,7 @@ begin
     end;
 end;
 
-Function TDataset.Tempbuffer: PChar;
+Function TDataset.Tempbuffer: TRecordBuffer;
 
 begin
   Result := FBuffers[FRecordCount];
@@ -1400,22 +1399,22 @@ begin
   // Empty Abstract
 end;
 
-function TDataSet.AllocRecordBuffer: PChar;
+function TDataSet.AllocRecordBuffer: TRecordBuffer;
 begin
   Result := nil;
 end;
 
-procedure TDataSet.FreeRecordBuffer(var Buffer: PChar);
+procedure TDataSet.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
 
-procedure TDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   // empty stub
 end;
 
-function TDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := bfCurrent;
 end;
@@ -1426,7 +1425,7 @@ begin
   Result := (FDisableControlsCount > 0);
 end;
 
-Function TDataset.ActiveBuffer: PChar;
+Function TDataset.ActiveBuffer: TRecordBuffer;
 
 begin
 {$ifdef dsdebug}
@@ -1816,7 +1815,7 @@ begin
     Result:=Nil;
 end;
 
-Function TDataset.GetCurrentRecord(Buffer: PChar): Boolean;
+Function TDataset.GetCurrentRecord(Buffer: TRecordBuffer): Boolean;
 
 
 begin

+ 34 - 24
packages/fcl-db/src/base/db.pas

@@ -1250,9 +1250,19 @@ type
   PBookmarkFlag = ^TBookmarkFlag;
   TBookmarkFlag = (bfCurrent, bfBOF, bfEOF, bfInserted);
 
+{ These types are used by Delphi/Unicode to replace the ambiguous "pchar" buffer types.
+  For now, they are just aliases to PAnsiChar, but in Delphi/Unicode it is pbyte. This will
+  be changed later (2.8?), to allow a grace period for descendents to catch up.
+  
+  Testing with TRecordBuffer=PByte will turn up typing problems. TRecordBuffer=pansichar is backwards
+  compatible, even if overriden with "pchar" variants.
+}
+  TRecordBufferBaseType = AnsiChar; // must match TRecordBuffer. 
+  TRecordBuffer = PAnsiChar;
   PBufferList = ^TBufferList;
-  TBufferList = array[0..dsMaxBufferCount - 1] of PChar;
-
+  TBufferList = array[0..dsMaxBufferCount - 1] of TRecordBuffer;  // Dynamic array in Delphi.
+  TBufferArray = ^TRecordBuffer;
+  
   TGetMode = (gmCurrent, gmNext, gmPrior);
 
   TGetResult = (grOK, grBOF, grEOF, grError);
@@ -1282,7 +1292,7 @@ type
     var Accept: Boolean) of object;
 
   TDatasetClass = Class of TDataset;
-  TBufferArray = ^pchar;
+
 
 {------------------------------------------------------------------------------}
 {IProviderSupport interface}
@@ -1355,7 +1365,7 @@ type
     FBookmarkSize: Longint;
     FBuffers : TBufferArray;
     FBufferCount: Longint;
-    FCalcBuffer: PChar;
+    FCalcBuffer: TRecordBuffer;
     FCalcFieldsSize: Longint;
     FConstraints: TCheckConstraints;
     FDisableControlsCount : Integer;
@@ -1385,7 +1395,7 @@ type
     FInternalOpenComplete: Boolean;
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInternalOpen;
-    Function  GetBuffer (Index : longint) : Pchar;
+    Function  GetBuffer (Index : longint) : TRecordBuffer;
     Function  GetField (Index : Longint) : TField;
     Procedure RegisterDataSource(ADatasource : TDataSource);
     Procedure RemoveField (Field : TField);
@@ -1404,13 +1414,13 @@ type
     procedure ActivateBuffers; virtual;
     procedure BindFields(Binding: Boolean);
     function  BookmarkAvailable: Boolean;
-    procedure CalculateFields(Buffer: PChar); virtual;
+    procedure CalculateFields(Buffer: TRecordBuffer); virtual;
     procedure CheckActive; virtual;
     procedure CheckInactive; virtual;
     procedure CheckBiDirectional;
     procedure Loaded; override;
     procedure ClearBuffers; virtual;
-    procedure ClearCalcFields(Buffer: PChar); virtual;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); virtual;
     procedure CloseBlob(Field: TField); virtual;
     procedure CloseCursor; virtual;
     procedure CreateFields; virtual;
@@ -1440,7 +1450,7 @@ type
     function  FindRecord(Restart, GoForward: Boolean): Boolean; virtual;
     procedure FreeFieldBuffers; virtual;
     function  GetBookmarkStr: TBookmarkStr; virtual;
-    procedure GetCalcFields(Buffer: PChar); virtual;
+    procedure GetCalcFields(Buffer: TRecordBuffer); virtual;
     function  GetCanModify: Boolean; virtual;
     procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
     function  GetFieldClass(FieldType: TFieldType): TFieldClass; virtual;
@@ -1456,14 +1466,14 @@ type
     function  GetRecNo: Longint; virtual;
     procedure InitFieldDefs; virtual;
     procedure InitFieldDefsFromfields;
-    procedure InitRecord(Buffer: PChar); virtual;
+    procedure InitRecord(Buffer: TRecordBuffer); virtual;
     procedure InternalCancel; virtual;
     procedure InternalEdit; virtual;
     procedure InternalInsert; virtual;
     procedure InternalRefresh; virtual;
     procedure OpenCursor(InfoQuery: Boolean); virtual;
     procedure OpenCursorcomplete; virtual;
-    procedure RefreshInternalCalcFields(Buffer: PChar); virtual;
+    procedure RefreshInternalCalcFields(Buffer: TRecordBuffer); virtual;
     procedure RestoreState(const Value: TDataSetState);
     Procedure SetActive (Value : Boolean); virtual;
     procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;
@@ -1482,22 +1492,22 @@ type
     procedure SetRecNo(Value: Longint); virtual;
     procedure SetState(Value: TDataSetState);
     function SetTempState(const Value: TDataSetState): TDataSetState;
-    Function Tempbuffer: PChar;
+    Function Tempbuffer: TRecordBuffer;
     procedure UpdateIndexDefs; virtual;
     property ActiveRecord: Longint read FActiveRecord;
     property CurrentRecord: Longint read FCurrentRecord;
     property BlobFieldCount: Longint read FBlobFieldCount;
     property BookmarkSize: Longint read FBookmarkSize write FBookmarkSize;
-    property Buffers[Index: Longint]: PChar read GetBuffer;
+    property Buffers[Index: Longint]: TRecordBuffer read GetBuffer;
     property BufferCount: Longint read FBufferCount;
-    property CalcBuffer: PChar read FCalcBuffer;
+    property CalcBuffer: TRecordBuffer read FCalcBuffer;
     property CalcFieldsSize: Longint read FCalcFieldsSize;
     property InternalCalcFields: Boolean read FInternalCalcFields;
     property Constraints: TCheckConstraints read FConstraints write FConstraints;
-    function AllocRecordBuffer: PChar; virtual;
-    procedure FreeRecordBuffer(var Buffer: PChar); virtual;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); virtual;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; virtual;
+    function AllocRecordBuffer: TRecordBuffer; virtual;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); virtual;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); virtual;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; virtual;
     function GetDataSource: TDataSource; virtual;
     function GetRecordSize: Word; virtual;
     procedure InternalAddRecord(Buffer: Pointer; AAppend: Boolean); virtual;
@@ -1505,15 +1515,15 @@ type
     procedure InternalFirst; virtual;
     procedure InternalGotoBookmark(ABookmark: Pointer); virtual;
     procedure InternalHandleException; virtual;
-    procedure InternalInitRecord(Buffer: PChar); virtual;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); virtual;
     procedure InternalLast; virtual;
     procedure InternalPost; virtual;
-    procedure InternalSetToRecord(Buffer: PChar); virtual;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); virtual;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); virtual;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); virtual;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); virtual;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); virtual;
     procedure SetUniDirectional(const Value: Boolean);
   protected { abstract methods }
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
     procedure InternalClose; virtual; abstract;
     procedure InternalOpen; virtual; abstract;
     procedure InternalInitFieldDefs; virtual; abstract;
@@ -1547,7 +1557,7 @@ type
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
-    function ActiveBuffer: PChar;
+    function ActiveBuffer: TRecordBuffer;
     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; virtual;
     procedure SetFieldData(Field: TField; Buffer: Pointer); overload; virtual;
@@ -1577,7 +1587,7 @@ type
     procedure First;
     procedure FreeBookmark(ABookmark: TBookmark); virtual;
     function GetBookmark: TBookmark; virtual;
-    function GetCurrentRecord(Buffer: PChar): Boolean; virtual;
+    function GetCurrentRecord(Buffer: TRecordBuffer): Boolean; virtual;
     procedure GetFieldList(List: TList; const FieldNames: string);
     procedure GetFieldNames(List: TStrings);
     procedure GotoBookmark(ABookmark: TBookmark);

+ 15 - 10
packages/fcl-db/src/base/fields.inc

@@ -429,7 +429,7 @@ end;
 function TField.GetAsBytes: TBytes;
 begin
   SetLength(Result, DataSize);
-  if not GetData(@Result[0], False) then
+  if assigned(result) and not GetData(@Result[0], False) then
     Result := nil;
 end;
 
@@ -2181,14 +2181,22 @@ begin
   // Just check for really invalid stuff; actual size is
   // dependent on the record...
   If AValue<1 then
-    DatabaseErrorfmt(SInvalidFieldSize,[Avalue]);
+    DatabaseErrorFmt(SInvalidFieldSize,[AValue]);
 end;
 
 function TBinaryField.GetAsBytes: TBytes;
+var B: TBytes;
 begin
-  SetLength(Result, DataSize);
-  if not GetData(Pointer(Result), True) then
-    SetLength(Result, 0);
+  SetLength(B, DataSize);
+  if not assigned(B) or not GetData(Pointer(B), True) then
+    SetLength(Result, 0)
+  else if DataType = ftVarBytes then
+  begin
+    SetLength(Result, PWord(B)^);
+    Move(B[sizeof(Word)], Result[0], Length(Result));
+  end
+  else // ftBytes
+    Result := B;
 end;
 
 
@@ -2199,10 +2207,7 @@ begin
   if length(B) = 0 then
     Result := ''
   else
-  begin
-    SetLength(Result, length(B) div SizeOf(Char));
-    Move(B[0], Result[1], length(Result) * SizeOf(Char));
-  end;
+    SetString(Result, @B[0], length(B) div SizeOf(Char));
 end;
 
 
@@ -2246,8 +2251,8 @@ begin
     end;
 
     if DataType = ftVarBytes then begin
-      Move(AValue[0], P[2], Len);
       PWord(P)^ := Len;
+      Move(AValue[0], P[sizeof(Word)], Len);
     end
     else begin // ftBytes
       Move(AValue[0], P^, Len);

+ 44 - 41
packages/fcl-db/src/dbase/dbf.pas

@@ -120,7 +120,7 @@ type
     FOnMasterChange: TNotifyEvent;
     FOnMasterDisable: TNotifyEvent;
 
-    function GetFieldsVal: PChar;
+    function GetFieldsVal: TRecordBuffer;
 
     procedure SetFieldNames(const Value: string);
   protected
@@ -135,7 +135,7 @@ type
 
     property FieldNames: string read FFieldNames write SetFieldNames;
     property ValidExpression: Boolean read FValidExpression write FValidExpression;
-    property FieldsVal: PChar read GetFieldsVal;
+    property FieldsVal: TRecordBuffer read GetFieldsVal;
     property Parser: TDbfParser read FParser;
 
     property OnMasterChange: TNotifyEvent read FOnMasterChange write FOnMasterChange;
@@ -160,8 +160,8 @@ type
     FAbsolutePath: string;
     FIndexName: string;
     FReadOnly: Boolean;
-    FFilterBuffer: PChar;
-    FTempBuffer: PChar;
+    FFilterBuffer: TRecordBuffer;
+    FTempBuffer: TRecordBuffer;
     FEditingRecNo: Integer;
 {$ifdef SUPPORT_VARIANTS}    
     FLocateRecNo: Integer;
@@ -221,18 +221,18 @@ type
     function  ParseIndexName(const AIndexName: string): string;
     procedure ParseFilter(const AFilter: string);
     function  GetDbfFieldDefs: TDbfFieldDefs;
-    function  ReadCurrentRecord(Buffer: PChar; var Acceptable: Boolean): TGetResult;
+    function  ReadCurrentRecord(Buffer: TRecordBuffer; var Acceptable: Boolean): TGetResult;
     function  SearchKeyBuffer(Buffer: PChar; SearchType: TSearchKeyType): Boolean;
     procedure SetRangeBuffer(LowRange: PChar; HighRange: PChar);
 
   protected
     { abstract methods }
-    function  AllocRecordBuffer: PChar; override; {virtual abstract}
-    procedure ClearCalcFields(Buffer: PChar); override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override; {virtual abstract}
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override; {virtual abstract}
-    function  GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override; {virtual abstract}
-    function  GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; {virtual abstract}
+    function  AllocRecordBuffer: TRecordBuffer; override; {virtual abstract}
+    procedure ClearCalcFields(Buffer: TRecordBuffer); override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override; {virtual abstract}
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override; {virtual abstract}
+    function  GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override; {virtual abstract}
+    function  GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override; {virtual abstract}
     function  GetRecordSize: Word; override; {virtual abstract}
     procedure InternalAddRecord(Buffer: Pointer; AAppend: Boolean); override; {virtual abstract}
     procedure InternalClose; override; {virtual abstract}
@@ -241,7 +241,7 @@ type
     procedure InternalGotoBookmark(ABookmark: Pointer); override; {virtual abstract}
     procedure InternalHandleException; override; {virtual abstract}
     procedure InternalInitFieldDefs; override; {virtual abstract}
-    procedure InternalInitRecord(Buffer: PChar); override; {virtual abstract}
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override; {virtual abstract}
     procedure InternalLast; override; {virtual abstract}
     procedure InternalOpen; override; {virtual abstract}
     procedure InternalEdit; override; {virtual}
@@ -252,11 +252,11 @@ type
 {$endif}
 {$endif}
     procedure InternalPost; override; {virtual abstract}
-    procedure InternalSetToRecord(Buffer: PChar); override; {virtual abstract}
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override; {virtual abstract}
     procedure InitFieldDefs; override;
     function  IsCursorOpen: Boolean; override; {virtual abstract}
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override; {virtual abstract}
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override; {virtual abstract}
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override; {virtual abstract}
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override; {virtual abstract}
     procedure SetFieldData(Field: TField; Buffer: Pointer);
       {$ifdef SUPPORT_OVERLOAD} overload; {$endif} override; {virtual abstract}
 
@@ -338,7 +338,7 @@ type
       {$ifdef SUPPORT_DEFAULT_PARAMS}= false{$endif}): Boolean;
     procedure SetRangePChar(LowRange: PChar; HighRange: PChar; KeyIsANSI: boolean
       {$ifdef SUPPORT_DEFAULT_PARAMS}= false{$endif});
-    function  GetCurrentBuffer: PChar;
+    function  GetCurrentBuffer: TRecordBuffer;
     procedure ExtractKey(KeyBuffer: PChar);
     procedure UpdateIndexDefs; override;
     procedure GetFileNames(Strings: TStrings; Files: TDbfFileNames); {$ifdef SUPPORT_DEFAULT_PARAMS} overload; {$endif}
@@ -667,27 +667,27 @@ begin
   FMasterLink.Free;
 end;
 
-function TDbf.AllocRecordBuffer: PChar; {override virtual abstract from TDataset}
+function TDbf.AllocRecordBuffer: TRecordBuffer; {override virtual abstract from TDataset}
 begin
   GetMem(Result, SizeOf(TDbfRecordHeader)+FDbfFile.RecordSize+CalcFieldsSize+1);
 end;
 
-procedure TDbf.FreeRecordBuffer(var Buffer: PChar); {override virtual abstract from TDataset}
+procedure TDbf.FreeRecordBuffer(var Buffer: TRecordBuffer); {override virtual abstract from TDataset}
 begin
   FreeMemAndNil(Pointer(Buffer));
 end;
 
-procedure TDbf.GetBookmarkData(Buffer: PChar; Data: Pointer); {override virtual abstract from TDataset}
+procedure TDbf.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); {override virtual abstract from TDataset}
 begin
   pBookmarkData(Data)^ := pDbfRecord(Buffer)^.BookmarkData;
 end;
 
-function TDbf.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; {override virtual abstract from TDataset}
+function TDbf.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; {override virtual abstract from TDataset}
 begin
   Result := pDbfRecord(Buffer)^.BookmarkFlag;
 end;
 
-function TDbf.GetCurrentBuffer: PChar;
+function TDbf.GetCurrentBuffer: TRecordBuffer;
 begin
   case State of
     dsFilter:     Result := FFilterBuffer;
@@ -726,7 +726,7 @@ const
   NativeFormat = true;
 {$endif}
 var
-  Src: PChar;
+  Src: TRecordBuffer;
 begin
   Src := GetCurrentBuffer;
   if Src = nil then
@@ -799,7 +799,7 @@ begin
     OnFilterRecord(Self, Acceptable);
 end;
 
-function TDbf.ReadCurrentRecord(Buffer: PChar; var Acceptable: Boolean): TGetResult;
+function TDbf.ReadCurrentRecord(Buffer: TRecordBuffer; var Acceptable: Boolean): TGetResult;
 var
   lPhysicalRecNo: Integer;
   pRecord: pDbfRecord;
@@ -817,7 +817,7 @@ begin
   end;
 end;
 
-function TDbf.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; {override virtual abstract from TDataset}
+function TDbf.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; {override virtual abstract from TDataset}
 var
   pRecord: pDbfRecord;
   acceptable: Boolean;
@@ -1116,7 +1116,7 @@ begin
   end;
 end;
 
-procedure TDbf.InternalInitRecord(Buffer: PChar); {override virtual abstract from TDataset}
+procedure TDbf.InternalInitRecord(Buffer: TRecordBuffer); {override virtual abstract from TDataset}
 var
   pRecord: pDbfRecord;
 begin
@@ -2083,7 +2083,7 @@ end;
 
 {$endif}
 
-procedure TDbf.ClearCalcFields(Buffer: PChar);
+procedure TDbf.ClearCalcFields(Buffer: TRecordBuffer);
 var
   lRealBuffer, lCalcBuffer: PChar;
 begin
@@ -2092,7 +2092,7 @@ begin
   FillChar(lCalcBuffer^, CalcFieldsSize, 0);
 end;
 
-procedure TDbf.InternalSetToRecord(Buffer: PChar); {override virtual abstract from TDataset}
+procedure TDbf.InternalSetToRecord(Buffer: TRecordBuffer); {override virtual abstract from TDataset}
 var
   pRecord: pDbfRecord;
 begin
@@ -2118,12 +2118,12 @@ begin
   Result := StoreDefs and (FieldDefs.Count > 0);
 end;
 
-procedure TDbf.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); {override virtual abstract from TDataset}
+procedure TDbf.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); {override virtual abstract from TDataset}
 begin
   pDbfRecord(Buffer)^.BookmarkFlag := Value;
 end;
 
-procedure TDbf.SetBookmarkData(Buffer: PChar; Data: Pointer); {override virtual abstract from TDataset}
+procedure TDbf.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); {override virtual abstract from TDataset}
 begin
   pDbfRecord(Buffer)^.BookmarkData := pBookmarkData(Data)^;
 end;
@@ -2616,26 +2616,26 @@ end;
 
 function TDbf.IsDeleted: Boolean;
 var
-  src: PChar;
+  src: TRecordBuffer;
 begin
   src := GetCurrentBuffer;
-  IsDeleted := (src=nil) or (src^ = '*')
+  IsDeleted := (src=nil) or (AnsiChar(src^) = '*')
 end;
 
 procedure TDbf.Undelete;
 var
-  src: PChar;
+  src: TRecordBuffer;
 begin
   if State <> dsEdit then
     inherited Edit;
   // get active buffer
   src := GetCurrentBuffer;
-  if (src <> nil) and (src^ = '*') then
+  if (src <> nil) and (AnsiChar(src^) = '*') then
   begin
     // notify indexes record is about to be recalled
     FDbfFile.RecordRecalled(FCursor.PhysicalRecNo, src);
     // recall record
-    src^ := ' ';
+    src^ := TRecordBufferBaseType(' ');
     FDbfFile.WriteRecord(FCursor.PhysicalRecNo, src);
   end;
 end;
@@ -2821,19 +2821,22 @@ end;
 
 procedure TDbf.UpdateRange;
 var
-  fieldsVal: PChar;
+  fieldsVal: TRecordBuffer;
   tempBuffer: array[0..300] of char;
 begin
   fieldsVal := FMasterLink.FieldsVal;
   if (TDbf(FMasterLink.DataSet).DbfFile.UseCodePage <> FDbfFile.UseCodePage)
         and (FMasterLink.Parser.ResultType = etString) then
   begin
-    FMasterLink.DataSet.Translate(fieldsVal, @tempBuffer[0], false);
+    FMasterLink.DataSet.Translate(pansichar(fieldsVal), @tempBuffer[0], false);
     fieldsVal := @tempBuffer[0];
-    Translate(fieldsVal, fieldsVal, true);
+    Translate(pansichar(fieldsVal), pansichar(fieldsVal), true);
   end;
-  fieldsVal := TIndexCursor(FCursor).IndexFile.PrepareKey(fieldsVal, FMasterLink.Parser.ResultType);
-  SetRangeBuffer(fieldsVal, fieldsVal);
+  // preparekey, setrangebuffer and updatekeyfrom* are functions which arguments
+  // are not entirely classified in pchar<>trecordbuffer terms.
+  // so we typecast for now.
+  fieldsVal := TRecordBuffer(TIndexCursor(FCursor).IndexFile.PrepareKey((fieldsVal), FMasterLink.Parser.ResultType));
+  SetRangeBuffer(pansichar(fieldsVal), pansichar(fieldsVal)); 
 end;
 
 procedure TDbf.MasterChanged(Sender: TObject);
@@ -3018,9 +3021,9 @@ begin
   end;
 end;
 
-function TDbfMasterLink.GetFieldsVal: PChar;
+function TDbfMasterLink.GetFieldsVal: TRecordBuffer;
 begin
-  Result := FParser.ExtractFromBuffer(@pDbfRecord(TDbf(DataSet).ActiveBuffer)^.DeletedFlag);
+  Result := TRecordBuffer(FParser.ExtractFromBuffer(@pDbfRecord(TDbf(DataSet).ActiveBuffer)^.DeletedFlag));
 end;
 
 ////////////////////////////////////////////////////////////////////////////

+ 27 - 27
packages/fcl-db/src/dbase/dbf_dbffile.pas

@@ -48,8 +48,8 @@ type
     FIndexNames: TStringList;
     FIndexFiles: TList;
     FDbfVersion: TXBaseVersion;
-    FPrevBuffer: PChar;
-    FDefaultBuffer: PChar;
+    FPrevBuffer: TRecordBuffer;
+    FDefaultBuffer: TRecordBuffer;
     FRecordBufferSize: Integer;
     FLockUserLen: DWORD;
     FFileCodePage: Cardinal;
@@ -76,7 +76,7 @@ type
     procedure ConstructFieldDefs;
     procedure InitDefaultBuffer;
     procedure UpdateNullField(Buffer: Pointer; AFieldDef: TDbfFieldDef; Action: TUpdateNullField);
-    procedure WriteLockInfo(Buffer: PChar);
+    procedure WriteLockInfo(Buffer: TRecordBuffer);
 
   public
     constructor Create;
@@ -97,9 +97,9 @@ type
     procedure CloseIndex(AIndexName: string);
     procedure RepageIndex(AIndexFile: string);
     procedure CompactIndex(AIndexFile: string);
-    function  Insert(Buffer: PChar): integer;
+    function  Insert(Buffer: TRecordBuffer): integer;
     procedure WriteHeader; override;
-    procedure ApplyAutoIncToBuffer(DestBuf: PChar);     // dBase7 support. Writeback last next-autoinc value
+    procedure ApplyAutoIncToBuffer(DestBuf: TRecordBuffer);     // dBase7 support. Writeback last next-autoinc value
     procedure FastPackTable;
     procedure RestructureTable(DbfFieldDefs: TDbfFieldDefs; Pack: Boolean);
     procedure Rename(DestFileName: string; NewIndexFileNames: TStrings; DeleteFiles: boolean);
@@ -109,13 +109,13 @@ type
     function  GetFieldDataFromDef(AFieldDef: TDbfFieldDef; DataType: TFieldType; 
       Src, Dst: Pointer; NativeFormat: boolean): Boolean;
     procedure SetFieldData(Column: Integer; DataType: TFieldType; Src,Dst: Pointer; NativeFormat: boolean);
-    procedure InitRecord(DestBuf: PChar);
+    procedure InitRecord(DestBuf: TRecordBuffer);
     procedure PackIndex(lIndexFile: TIndexFile; AIndexName: string);
     procedure RegenerateIndexes;
-    procedure LockRecord(RecNo: Integer; Buffer: PChar);
-    procedure UnlockRecord(RecNo: Integer; Buffer: PChar);
-    procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
-    procedure RecordRecalled(RecNo: Integer; Buffer: PChar);
+    procedure LockRecord(RecNo: Integer; Buffer: TRecordBuffer);
+    procedure UnlockRecord(RecNo: Integer; Buffer: TRecordBuffer);
+    procedure RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
+    procedure RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer);
 
     property MemoFile: TMemoFile read FMemoFile;
     property FieldDefs: TDbfFieldDefs read FFieldDefs;
@@ -128,7 +128,7 @@ type
     property UseCodePage: Cardinal read FUseCodePage write FUseCodePage;
     property FileLangId: Byte read FFileLangId write FFileLangId;
     property DbfVersion: TXBaseVersion read FDbfVersion write FDbfVersion;
-    property PrevBuffer: PChar read FPrevBuffer;
+    property PrevBuffer: TRecordBuffer read FPrevBuffer;
     property ForceClose: Boolean read FForceClose;
     property CopyDateTimeAsString: Boolean read FCopyDateTimeAsString write FCopyDateTimeAsString;
     property DateTimeHandling: TDateTimeHandling read FDateTimeHandling write FDateTimeHandling;
@@ -1133,7 +1133,7 @@ var
   OldIndexFiles: TStrings;
   IndexName, NewBaseName: string;
   I, lRecNo, lFieldNo, lFieldSize, lBlobPageNo, lWRecNo, srcOffset, dstOffset: Integer;
-  pBuff, pDestBuff: PChar;
+  pBuff, pDestBuff: TRecordBuffer;
   RestructFieldInfo: PRestructFieldInfo;
   BlobStream: TMemoryStream;
 begin
@@ -1264,7 +1264,7 @@ begin
       // read record from original dbf
       ReadRecord(lRecNo, pBuff);
       // copy record?
-      if (pBuff^ <> '*') or not Pack then
+      if (ansichar(pBuff^) <> '*') or not Pack then
       begin
         // if restructure, initialize dest
         if DbfFieldDefs <> nil then
@@ -1940,14 +1940,14 @@ begin
   end;
 end;
 
-procedure TDbfFile.InitRecord(DestBuf: PChar);
+procedure TDbfFile.InitRecord(DestBuf: TRecordBuffer);
 begin
   if FDefaultBuffer = nil then
     InitDefaultBuffer;
   Move(FDefaultBuffer^, DestBuf^, RecordSize);
 end;
 
-procedure TDbfFile.ApplyAutoIncToBuffer(DestBuf: PChar);
+procedure TDbfFile.ApplyAutoIncToBuffer(DestBuf: TRecordBuffer);
 var
   TempFieldDef: TDbfFieldDef;
   I, NextVal, lAutoIncOffset: {LongWord} Cardinal;    {Delphi 3 does not know LongWord?}
@@ -2358,7 +2358,7 @@ begin
   end;
 end;
 
-function TDbfFile.Insert(Buffer: PChar): integer;
+function TDbfFile.Insert(Buffer: TRecordBuffer): integer;
 type
   TErrorContext = (ecNone, ecInsert, ecWriteIndex, ecWriteDbf);
 var
@@ -2472,7 +2472,7 @@ begin
     Result := newRecord;
 end;
 
-procedure TDbfFile.WriteLockInfo(Buffer: PChar);
+procedure TDbfFile.WriteLockInfo(Buffer: TRecordBuffer);
 //
 // *) assumes FHasLockField = true
 //
@@ -2486,19 +2486,19 @@ begin
   // set time
   DecodeDate(Now(), year, month, day);
   DecodeTime(Now(), hour, minute, sec, msec);
-  Buffer[lockoffset+2] := Char(hour);
-  Buffer[lockoffset+3] := Char(minute);
-  Buffer[lockoffset+4] := Char(sec);
+  Buffer[lockoffset+2] := TRecordBufferBaseType(hour);
+  Buffer[lockoffset+3] := TRecordBufferBaseType(minute);
+  Buffer[lockoffset+4] := TRecordBufferBaseType(sec);
   // set date
-  Buffer[lockoffset+5] := Char(year - 1900);
-  Buffer[lockoffset+6] := Char(month);
-  Buffer[lockoffset+7] := Char(day);
+  Buffer[lockoffset+5] := TRecordBufferBaseType(year - 1900);
+  Buffer[lockoffset+6] := TRecordBufferBaseType(month);
+  Buffer[lockoffset+7] := TRecordBufferBaseType(day);
   // set name
   FillChar(Buffer[lockoffset+8], FLockField.Size-8, ' ');
   Move(DbfGlobals.UserName[1], Buffer[lockoffset+8], FLockUserLen);
 end;
 
-procedure TDbfFile.LockRecord(RecNo: Integer; Buffer: PChar);
+procedure TDbfFile.LockRecord(RecNo: Integer; Buffer: TRecordBuffer);
 begin
   if LockPage(RecNo, false) then
   begin
@@ -2518,7 +2518,7 @@ begin
     raise EDbfError.Create(STRING_RECORD_LOCKED);
 end;
 
-procedure TDbfFile.UnlockRecord(RecNo: Integer; Buffer: PChar);
+procedure TDbfFile.UnlockRecord(RecNo: Integer; Buffer: TRecordBuffer);
 var
   I: Integer;
   lIndex, lErrorIndex: TIndexFile;
@@ -2548,7 +2548,7 @@ begin
   UnlockPage(RecNo);
 end;
 
-procedure TDbfFile.RecordDeleted(RecNo: Integer; Buffer: PChar);
+procedure TDbfFile.RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
 var
   I: Integer;
   lIndex: TIndexFile;
@@ -2561,7 +2561,7 @@ begin
   end;
 end;
 
-procedure TDbfFile.RecordRecalled(RecNo: Integer; Buffer: PChar);
+procedure TDbfFile.RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer);
 var
   I: Integer;
   lIndex, lErrorIndex: TIndexFile;

+ 10 - 9
packages/fcl-db/src/dbase/dbf_idxcur.pas

@@ -7,6 +7,7 @@ interface
 uses
   SysUtils,
   Classes,
+  db,
   dbf_cursor,
   dbf_idxfile,
   dbf_prsdef,
@@ -30,7 +31,7 @@ type
     procedure SetPhysicalRecNo(RecNo: Integer); override;
     procedure SetSequentialRecNo(RecNo: Integer); override;
 
-    procedure VariantStrToBuffer(Key: Variant; ABuffer: PChar);
+    procedure VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
   public
     constructor Create(DbfIndexFile: TIndexFile);
     destructor Destroy; override;
@@ -40,11 +41,11 @@ type
     procedure First; override;
     procedure Last; override;
 
-    procedure Insert(RecNo: Integer; Buffer: PChar);
-    procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
+    procedure Insert(RecNo: Integer; Buffer: TRecordBuffer);
+    procedure Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
 
 {$ifdef SUPPORT_VARIANTS}
-    function  VariantToBuffer(Key: Variant; ABuffer: PChar): TExpressionType;
+    function  VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
 {$endif}
     function  CheckUserKey(Key: PChar; StringBuf: PChar): PChar;
 
@@ -79,13 +80,13 @@ begin
   inherited Destroy;
 end;
 
-procedure TIndexCursor.Insert(RecNo: Integer; Buffer: PChar);
+procedure TIndexCursor.Insert(RecNo: Integer; Buffer: TRecordBuffer);
 begin
   TIndexFile(PagedFile).Insert(RecNo,Buffer);
   // TODO SET RecNo and Key
 end;
 
-procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar);
+procedure TIndexCursor.Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer);
 begin
   TIndexFile(PagedFile).Update(RecNo, PrevBuffer, NewBuffer);
 end;
@@ -137,18 +138,18 @@ end;
 
 {$ifdef SUPPORT_VARIANTS}
 
-procedure TIndexCursor.VariantStrToBuffer(Key: Variant; ABuffer: PChar);
+procedure TIndexCursor.VariantStrToBuffer(Key: Variant; ABuffer: TRecordBuffer);
 var
   currLen: Integer;
   StrKey: string;
 begin
   StrKey := Key;
-  currLen := TranslateString(GetACP, FIndexFile.CodePage, PChar(StrKey), ABuffer, -1);
+  currLen := TranslateString(GetACP, FIndexFile.CodePage, PAnsiChar(StrKey), PAnsiChar(ABuffer), -1);
   // we have null-terminated string, pad with spaces if string too short
   FillChar(ABuffer[currLen], TIndexFile(PagedFile).KeyLen-currLen, ' ');
 end;
 
-function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: PChar): TExpressionType;
+function TIndexCursor.VariantToBuffer(Key: Variant; ABuffer: TRecordBuffer): TExpressionType;
 // assumes ABuffer is large enough ie. at least max key size
 begin
   if (TIndexFile(PagedFile).KeyType='N') then

+ 28 - 28
packages/fcl-db/src/dbase/dbf_idxfile.pas

@@ -285,12 +285,12 @@ type
     function  CalcTagOffset(AIndex: Integer): Pointer;
 
     function  FindKey(AInsert: boolean): Integer;
-    function  InsertKey(Buffer: PChar): Boolean;
-    procedure DeleteKey(Buffer: PChar);
+    function  InsertKey(Buffer: TRecordBuffer): Boolean;
+    procedure DeleteKey(Buffer: TRecordBuffer);
     function  InsertCurrent: Boolean;
     procedure DeleteCurrent;
-    function  UpdateCurrent(PrevBuffer, NewBuffer: PChar): Boolean;
-    function  UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
+    function  UpdateCurrent(PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
+    function  UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
     procedure ReadIndexes;
     procedure Resync(Relative: boolean);
     procedure ResyncRoot;
@@ -337,19 +337,19 @@ type
     procedure AddNewLevel;
     procedure UnlockHeader;
     procedure InsertError;
-    function  Insert(RecNo: Integer; Buffer: PChar): Boolean;
-    function  Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
-    procedure Delete(RecNo: Integer; Buffer: PChar);
-    function  CheckKeyViolation(Buffer: PChar): Boolean;
-    procedure RecordDeleted(RecNo: Integer; Buffer: PChar);
-    function  RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
+    function  Insert(RecNo: Integer; Buffer:TRecordBuffer ): Boolean;
+    function  Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
+    procedure Delete(RecNo: Integer; Buffer: TRecordBuffer);
+    function  CheckKeyViolation(Buffer: TRecordBuffer): Boolean;
+    procedure RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
+    function  RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer): Boolean;
     procedure DeleteIndex(const AIndexName: string);
     procedure RepageFile;
     procedure CompactFile;
     procedure PrepareRename(NewFileName: string);
 
     procedure CreateIndex(FieldDesc, TagName: string; Options: TIndexOptions);
-    function  ExtractKeyFromBuffer(Buffer: PChar): PChar;
+    function  ExtractKeyFromBuffer(Buffer: TRecordBuffer): PChar;
     function  SearchKey(Key: PChar; SearchType: TSearchKeyType): Boolean;
     function  Find(RecNo: Integer; Buffer: PChar): Integer;
     function  IndexOf(const AIndexName: string): Integer;
@@ -371,7 +371,7 @@ type
     function  MatchKey(UserKey: PChar): Integer;
     function  CompareKey(Key: PChar): Integer;
     function  CompareKeys(Key1, Key2: PChar): Integer;
-    function  PrepareKey(Buffer: PChar; ResultType: TExpressionType): PChar;
+    function  PrepareKey(Buffer: TRecordBuffer; ResultType: TExpressionType): PChar;
 
     property KeyLen: Integer read GetKeyLen;
     property IndexVersion: TXBaseVersion read FIndexVersion;
@@ -1725,7 +1725,7 @@ const
   AnsiFuncsToMode: array[boolean] of TStringFieldMode = (smRaw, smAnsi);
 var
   TempRec: PExpressionRec;
-  TempBuffer: pchar;
+  TempBuffer: TRecordBuffer;
   I: integer;
   hasAnsiFuncs: boolean;
 begin
@@ -2818,7 +2818,7 @@ begin
     UnlockPage(0);
 end;
 
-function TIndexFile.Insert(RecNo: Integer; Buffer: PChar): Boolean; {override;}
+function TIndexFile.Insert(RecNo: Integer; Buffer: TRecordBuffer): Boolean; {override;}
 var
   I, curSel, count: Integer;
 begin
@@ -2856,7 +2856,7 @@ begin
   ResyncRange(true);
 end;
 
-function TIndexFile.CheckKeyViolation(Buffer: PChar): Boolean;
+function TIndexFile.CheckKeyViolation(Buffer: TRecordBuffer): Boolean;
 var
   I, curSel: Integer;
 begin
@@ -2886,7 +2886,7 @@ begin
   end;
 end;
 
-function TIndexFile.PrepareKey(Buffer: PChar; ResultType: TExpressionType): PChar;
+function TIndexFile.PrepareKey(Buffer: TRecordBuffer; ResultType: TExpressionType): PChar;
 var
   FloatRec: TFloatRec;
   I, IntSrc, NumDecimals: Integer;
@@ -2898,7 +2898,7 @@ var
 
 begin
   // need to convert numeric?
-  Result := Buffer;
+  Result := PChar(Buffer);
   if PIndexHdr(FIndexHeader)^.KeyType in ['N', 'F'] then
   begin
     if FIndexVersion = xBaseIII then
@@ -3000,19 +3000,19 @@ begin
   end;
 end;
 
-function TIndexFile.ExtractKeyFromBuffer(Buffer: PChar): PChar;
+function TIndexFile.ExtractKeyFromBuffer(Buffer: TRecordBuffer): PChar;
 begin
   // execute expression to get key
-  Result := PrepareKey(FCurrentParser.ExtractFromBuffer(Buffer), FCurrentParser.ResultType);
+  Result := PrepareKey(TRecordBuffer(FCurrentParser.ExtractFromBuffer(Buffer)), FCurrentParser.ResultType);
   if FCurrentParser.StringFieldMode <> smRaw then
     TranslateString(GetACP, FCodePage, Result, Result, KeyLen);
 end;
 
-function TIndexFile.InsertKey(Buffer: PChar): boolean;
+function TIndexFile.InsertKey(Buffer: TRecordBuffer): boolean;
 begin
   Result := true;
   // ignore deleted records
-  if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (Buffer^ = '*') then
+  if (FModifyMode = mmNormal) and (FUniqueMode = iuDistinct) and (AnsiChar(Buffer^) = '*') then
     exit;
   // check proper index and modifiability
   if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
@@ -3077,7 +3077,7 @@ begin
   raise EDbfError.Create(errorStr);
 end;
 
-procedure TIndexFile.Delete(RecNo: Integer; Buffer: PChar);
+procedure TIndexFile.Delete(RecNo: Integer; Buffer: TRecordBuffer);
 var
   I, curSel: Integer;
 begin
@@ -3101,7 +3101,7 @@ begin
   ResyncRange(true);
 end;
 
-procedure TIndexFile.DeleteKey(Buffer: PChar);
+procedure TIndexFile.DeleteKey(Buffer: TRecordBuffer);
 begin
   if FCanEdit and (PIndexHdr(FIndexHeader)^.KeyLen <> 0) then
   begin
@@ -3131,13 +3131,13 @@ begin
   end;
 end;
 
-function TIndexFile.UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
+function TIndexFile.UpdateIndex(Index: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
 begin
   SelectIndexVars(Index);
   Result := UpdateCurrent(PrevBuffer, NewBuffer);
 end;
 
-function TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: PChar): Boolean;
+function TIndexFile.Update(RecNo: Integer; PrevBuffer, NewBuffer: TRecordBuffer): Boolean;
 var
   I, curSel, count: Integer;
 begin
@@ -3175,7 +3175,7 @@ begin
     ResyncRange(true);
 end;
 
-function TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: PChar): boolean;
+function TIndexFile.UpdateCurrent(PrevBuffer, NewBuffer: TRecordBuffer): boolean;
 var
   InsertKey, DeleteKey: PChar;
   TempBuffer: array [0..100] of Char;
@@ -3421,7 +3421,7 @@ begin
   ResyncRange(true);
 end;
 
-procedure TIndexFile.RecordDeleted(RecNo: Integer; Buffer: PChar);
+procedure TIndexFile.RecordDeleted(RecNo: Integer; Buffer: TRecordBuffer);
 begin
   // are we distinct -> then delete record from index
   FModifyMode := mmDeleteRecall;
@@ -3429,7 +3429,7 @@ begin
   FModifyMode := mmNormal;
 end;
 
-function TIndexFile.RecordRecalled(RecNo: Integer; Buffer: PChar): Boolean;
+function TIndexFile.RecordRecalled(RecNo: Integer; Buffer: TRecordBuffer): Boolean;
 begin
   // are we distinct -> then reinsert record in index
   FModifyMode := mmDeleteRecall;

+ 19 - 19
packages/fcl-db/src/dbase/dbf_parser.pas

@@ -55,7 +55,7 @@ type
     procedure ClearExpressions; override;
 
     procedure ParseExpression(AExpression: string); virtual;
-    function ExtractFromBuffer(Buffer: PChar): PChar; virtual;
+    function ExtractFromBuffer(Buffer: TRecordBuffer): PChar; virtual;
 
     property DbfFile: Pointer read FDbfFile write FDbfFile;
     property Expression: string read FCurrentExpression;
@@ -96,7 +96,7 @@ type
   public
     constructor Create(UseFieldDef: TDbfFieldDef; ADbfFile: TDbfFile);
 
-    procedure Refresh(Buffer: PChar); virtual; abstract;
+    procedure Refresh(Buffer: TRecordBuffer); virtual; abstract;
 
     property FieldVal: Pointer read GetFieldVal;
     property FieldDef: TDbfFieldDef read FFieldDef;
@@ -118,7 +118,7 @@ type
   public
     destructor Destroy; override;
 
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
 
     property Mode: TStringFieldMode read FMode write SetMode;
   end;
@@ -130,7 +130,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TIntegerFieldVar = class(TFieldVar)
@@ -140,7 +140,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
 {$ifdef SUPPORT_INT64}
@@ -151,7 +151,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 {$endif}
 
@@ -162,7 +162,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TBooleanFieldVar = class(TFieldVar)
@@ -172,7 +172,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
 { TFieldVar }
@@ -212,10 +212,10 @@ begin
   Result := etString;
 end;
 
-procedure TStringFieldVar.Refresh(Buffer: PChar);
+procedure TStringFieldVar.Refresh(Buffer: TRecordBuffer);
 var
   Len: Integer;
-  Src: PChar;
+  Src: TRecordBuffer;
 begin
   Src := Buffer+FieldDef.Offset;
   if FMode <> smRaw then
@@ -223,12 +223,12 @@ begin
     // copy field data
     Len := FieldDef.Size;
     if FMode = smAnsiTrim then
-      while (Len >= 1) and (Src[Len-1] = ' ') do Dec(Len);
+      while (Len >= 1) and (Src[Len-1] = TRecordbufferbasetype(' ')) do Dec(Len);
     // translate to ANSI
-    Len := TranslateString(DbfFile.UseCodePage, GetACP, Src, FFieldVal, Len);
+    Len := TranslateString(DbfFile.UseCodePage, GetACP, pansichar(Src), FFieldVal, Len);
     FFieldVal[Len] := #0;
   end else
-    FFieldVal := Src;
+    FFieldVal := pansichar(Src);
 end;
 
 procedure TStringFieldVar.SetExprWord(NewExprWord: TExprWord);
@@ -269,7 +269,7 @@ begin
   Result := etFloat;
 end;
 
-procedure TFloatFieldVar.Refresh(Buffer: PChar);
+procedure TFloatFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   // database width is default 64-bit double
   if not FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false) then
@@ -287,7 +287,7 @@ begin
   Result := etInteger;
 end;
 
-procedure TIntegerFieldVar.Refresh(Buffer: PChar);
+procedure TIntegerFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   FFieldVal := 0;
   FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false);
@@ -306,7 +306,7 @@ begin
   Result := etLargeInt;
 end;
 
-procedure TLargeIntFieldVar.Refresh(Buffer: PChar);
+procedure TLargeIntFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FDbfFile.GetFieldDataFromDef(FieldDef, FieldDef.FieldType, Buffer, @FFieldVal, false) then
     FFieldVal := 0;
@@ -325,7 +325,7 @@ begin
   Result := etDateTime;
 end;
 
-procedure TDateTimeFieldVar.Refresh(Buffer: PChar);
+procedure TDateTimeFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FDbfFile.GetFieldDataFromDef(FieldDef, ftDateTime, Buffer, @FFieldVal, false) then
     FFieldVal.DateTime := 0.0;
@@ -342,7 +342,7 @@ begin
   Result := etBoolean;
 end;
 
-procedure TBooleanFieldVar.Refresh(Buffer: PChar);
+procedure TBooleanFieldVar.Refresh(Buffer: TRecordBuffer);
 var
   lFieldVal: word;
 begin
@@ -575,7 +575,7 @@ begin
   FCurrentExpression := AExpression;
 end;
 
-function TDbfParser.ExtractFromBuffer(Buffer: PChar): PChar;
+function TDbfParser.ExtractFromBuffer(Buffer: TRecordBuffer): PChar;
 var
   I: Integer;
 begin

+ 21 - 20
packages/fcl-db/src/json/fpjsondataset.pp

@@ -76,12 +76,12 @@ type
     procedure SetRows(AValue: TJSONArray);
   protected
     // dataset virtual methods
-    function AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure InternalInitRecord(Buffer: PChar); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    function AllocRecordBuffer: TRecordBuffer; override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function GetRecordSize: Word; override;
     procedure InternalClose; override;
     procedure InternalDelete; override;
@@ -94,11 +94,11 @@ type
     procedure InternalEdit; override;
     procedure InternalCancel; override;
     procedure InternalInitFieldDefs; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     function  GetFieldClass(FieldType: TFieldType): TFieldClass; override;
     function IsCursorOpen: Boolean; override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
     function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat : Boolean): Boolean; override;
     procedure SetFieldData(Field: TField; Buffer: Pointer; NativeFormat : Boolean); override;
     function GetRecordCount: Integer; override;
@@ -319,27 +319,28 @@ begin
   FRows:=AValue;
 end;
 
-function TBaseJSONDataSet.AllocRecordBuffer: PChar;
+function TBaseJSONDataSet.AllocRecordBuffer: TRecordBuffer;
 begin
-  Result := StrAlloc(fRecordSize);
+  Result := TRecordBuffer(StrAlloc(fRecordSize));
 end;
 
-procedure TBaseJSONDataSet.InternalInitRecord(Buffer: PChar);
+// the next two are particularly ugly.
+procedure TBaseJSONDataSet.InternalInitRecord(Buffer: TRecordBuffer);
 begin
   FillChar(Buffer^, FRecordSize, 0);
 end;
 
-procedure TBaseJSONDataSet.FreeRecordBuffer (var Buffer: PChar);
+procedure TBaseJSONDataSet.FreeRecordBuffer (var Buffer: TRecordBuffer);
 begin
-  StrDispose(Buffer);
+  StrDispose(pansichar(Buffer));
 end;
 
-procedure TBaseJSONDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TBaseJSONDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PInteger(Data)^ := PRecInfo(Buffer)^.Bookmark;
 end;
 
-function TBaseJSONDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TBaseJSONDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := PRecInfo(Buffer)^.BookmarkFlag;
 end;
@@ -706,7 +707,7 @@ begin
     end;
 end;
 
-function TBaseJSONDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
+function TBaseJSONDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
   DoCheck: Boolean): TGetResult;
 begin
   Result := grOK; // default
@@ -869,7 +870,7 @@ begin
   FEditRow:=Nil;
 end;
 
-procedure TBaseJSONDataSet.InternalSetToRecord(Buffer: PChar);
+procedure TBaseJSONDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   FCurrent := PRecInfo(Buffer)^.Index;
 end;
@@ -890,7 +891,7 @@ begin
   Result := Assigned(FDefaultList);
 end;
 
-procedure TBaseJSONDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TBaseJSONDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PRecInfo(Buffer)^.Bookmark := PInteger(Data)^;
 end;
@@ -1074,7 +1075,7 @@ begin
 //  Writeln('Field data is set : ',FEditRow.AsJSON);
 end;
 
-procedure TBaseJSONDataSet.SetBookmarkFlag(Buffer: PChar;
+procedure TBaseJSONDataSet.SetBookmarkFlag(Buffer: TRecordBuffer;
   Value: TBookmarkFlag);
 begin
   PRecInfo(Buffer)^.BookmarkFlag := Value;

+ 37 - 36
packages/fcl-db/src/memds/memds.pp

@@ -40,7 +40,8 @@ const
 
 type
   {$IFNDEF FPC}
-  ptrint = Integer;
+  {$i memdsdelphi.inc} // should set ptrint is longint|intptr
+		       // & trecordbuffer ( if <2009)
   {$ENDIF}
 
   MDSError=class(Exception);
@@ -66,29 +67,29 @@ type
     FCurrRecNo: integer;
     FIsOpen: boolean;
     FTableIsCreated: boolean;
-    FFilterBuffer: PChar;
+    FFilterBuffer: TRecordBuffer;
     ffieldoffsets: PInteger;
     ffieldsizes: PInteger;
-    function GetCharPointer(p:PChar; Pos:Integer):PChar;
+    function GetRecordBufferPointer(p:TRecordBuffer; Pos:Integer):TRecordBuffer;
     function GetIntegerPointer(p:PInteger; Pos:Integer):PInteger;
 
     procedure calcrecordlayout;
     function  MDSGetRecordOffset(ARecNo: integer): longint;
     function  MDSGetFieldOffset(FieldNo: integer): integer;
     function  MDSGetBufferSize(FieldNo: integer): integer;
-    function  MDSGetActiveBuffer(var Buffer: PChar): Boolean;
-    procedure MDSReadRecord(Buffer:PChar;ARecNo:Integer);
-    procedure MDSWriteRecord(Buffer:PChar;ARecNo:Integer);
-    procedure MDSAppendRecord(Buffer:PChar);
-    function  MDSFilterRecord(Buffer: PChar): Boolean;
+    function  MDSGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
+    procedure MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer);
+    procedure MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer);
+    procedure MDSAppendRecord(Buffer:TRecordBuffer);
+    function  MDSFilterRecord(Buffer:TRecordBuffer): Boolean;
   protected
     // Mandatory
-    function  AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function  GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
+    function  AllocRecordBuffer: TRecordBuffer; override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function  GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
     function  GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
-    function  GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    function  GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function  GetRecordSize: Word; override;
     procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
     procedure InternalClose; override;
@@ -96,14 +97,14 @@ type
     procedure InternalFirst; override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
     procedure InternalInitFieldDefs; override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     procedure InternalLast; override;
     procedure InternalOpen; override;
     procedure InternalPost; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     function  IsCursorOpen: Boolean; override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
     procedure SetFieldData(Field: TField; Buffer: Pointer); override;
 
     // Optional.
@@ -328,7 +329,7 @@ begin
 {$ENDIF}
 end;
 
-function TMemDataset.MDSGetActiveBuffer(var Buffer: PChar): Boolean;
+function TMemDataset.MDSGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
 
 begin
  case State of
@@ -348,20 +349,20 @@ begin
  Result:=(Buffer<>nil);
 end;
 
-procedure TMemDataset.MDSReadRecord(Buffer:PChar;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
+procedure TMemDataset.MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
 begin
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.ReadBuffer(Buffer^, FRecSize);
 end;
 
-procedure TMemDataset.MDSWriteRecord(Buffer:PChar;ARecNo:Integer);  //Writes a Rec from Buffer to Stream
+procedure TMemDataset.MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer);  //Writes a Rec from Buffer to Stream
 begin
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.WriteBuffer(Buffer^, FRecSize);
   FFileModified:=True;
 end;
 
-procedure TMemDataset.MDSAppendRecord(Buffer:PChar);   //Appends a Rec (from Buffer) to Stream
+procedure TMemDataset.MDSAppendRecord(Buffer:TRecordBuffer);   //Appends a Rec (from Buffer) to Stream
 begin
   FStream.Position:=MDSGetRecordOffset(FRecCount);
   FStream.WriteBuffer(Buffer^, FRecSize);
@@ -369,17 +370,17 @@ begin
 end;
 
 //Abstract Overrides
-function TMemDataset.AllocRecordBuffer: PChar;
+function TMemDataset.AllocRecordBuffer: TRecordBuffer;
 begin
   GetMem(Result,FRecBufferSize);
 end;
 
-procedure TMemDataset.FreeRecordBuffer (var Buffer: PChar);
+procedure TMemDataset.FreeRecordBuffer (var Buffer: TRecordBuffer);
 begin
   FreeMem(Buffer);
 end;
 
-procedure TMemDataset.InternalInitRecord(Buffer: PChar);
+procedure TMemDataset.InternalInitRecord(Buffer: TRecordBuffer);
 
 var
   I : integer;
@@ -663,7 +664,7 @@ begin
   Result:=FIsOpen;
 end;
 
-function TMemDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+function TMemDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 
 var
   Accepted: Boolean;
@@ -709,7 +710,7 @@ end;
 
 function TMemDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 var
- SrcBuffer: PChar;
+ SrcBuffer: TRecordBuffer;
  I: integer;
 begin
  I:= Field.FieldNo - 1;
@@ -717,13 +718,13 @@ begin
           not getfieldisnull(pointer(srcbuffer),I);
  if result and (buffer <> nil) then 
    begin
-   Move(getcharpointer(SrcBuffer,getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
+   Move(GetRecordBufferPointer((SrcBuffer),getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
    end;
 end;
 
 procedure TMemDataset.SetFieldData(Field: TField; Buffer: Pointer);
 var
- DestBuffer: PChar;
+ DestBuffer: TRecordBuffer;
  I,J: integer;
 
 begin
@@ -740,7 +741,7 @@ begin
      J:=GetIntegerPointer(FFieldSizes, I)^;
      if Field.DataType=ftString then
        Dec(J); // Do not move terminating 0, which is in the size.
-     Move(Buffer^,GetCharPointer(DestBuffer, getIntegerPointer(FFieldOffsets, I)^)^,J);
+     Move(Buffer^,GetRecordBufferPointer((DestBuffer), getIntegerPointer(FFieldOffsets, I)^)^,J);
      dataevent(defieldchange,ptrint(field));
      end;
    end;
@@ -765,7 +766,7 @@ begin
     RaiseError(SErrBookMarkNotFound,[ReqBookmark]);
 end;
 
-procedure TMemDataset.InternalSetToRecord(Buffer: PChar);
+procedure TMemDataset.InternalSetToRecord(Buffer: TRecordBuffer);
 
 var
   ReqBookmark: integer;
@@ -775,26 +776,26 @@ begin
   InternalGotoBookmark (@ReqBookmark);
 end;
 
-function TMemDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TMemDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 
 begin
   Result:=PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag;
 end;
 
-procedure TMemDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TMemDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 
 begin
   PRecInfo(Buffer+FRecInfoOffset)^.BookmarkFlag := Value;
 end;
 
-procedure TMemDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TMemDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 
 begin
   if Data<>nil then
     PInteger(Data)^:=PRecInfo(Buffer+FRecInfoOffset)^.Bookmark;
 end;
 
-procedure TMemDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TMemDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 
 begin
   if Data<>nil then
@@ -803,7 +804,7 @@ begin
     PRecInfo(Buffer+FRecInfoOffset)^.Bookmark:=0;
 end;
 
-function TMemDataset.MDSFilterRecord(Buffer: PChar): Boolean;
+function TMemDataset.MDSFilterRecord(Buffer: TRecordBuffer): Boolean;
 
 var
   SaveState: TDatasetState;
@@ -1007,7 +1008,7 @@ begin
     end;
 end;
 
-function TMemDataset.GetCharPointer(p:PChar; Pos:Integer):PChar;
+function TMemDataset.GetRecordBufferPointer(p:TRecordBuffer; Pos:Integer):TRecordBuffer;
 begin
   Result:=p;
   inc(Result, Pos);

+ 39 - 39
packages/fcl-db/src/paradox/paradox.pp

@@ -43,7 +43,7 @@ type
     FPXLibrary : String;
     FCurrRecNo : Integer;
     FDoc       : PPX_Doc;
-    FFilterBuffer : PChar;
+    FFilterBuffer : TRecordBuffer;
     FOffsets   : PInteger;
     FTableName : String;
     FInputEncoding : String;
@@ -54,8 +54,8 @@ type
     function GetTargetEncoding: String;
     procedure OpenBlobFile;
     procedure PXAppendRecord(Buffer: Pointer);
-    function PXFilterRecord(Buffer: PChar): Boolean;
-    function PXGetActiveBuffer(var Buffer: PChar): Boolean;
+    function PXFilterRecord(Buffer: TRecordBuffer): Boolean;
+    function PXGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
     procedure RaiseError(Fmt: String; Args: array of const);
     procedure SetBlobFileName(const AValue: String);
     procedure SetFileName(const AValue: String);
@@ -70,12 +70,12 @@ type
     procedure SetFiltered(Value: Boolean); override; {virtual;}
     procedure ParseFilter(const AFilter: string);
 
-    function  AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function  GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
+    function  AllocRecordBuffer: TRecordBuffer; override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function  GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
     function  GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
-    function  GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    function  GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function  GetRecordSize: Word; override;
     procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
     procedure InternalClose; override;
@@ -83,14 +83,14 @@ type
     procedure InternalFirst; override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
     procedure InternalInitFieldDefs; override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     procedure InternalLast; override;
     procedure InternalOpen; override;
     procedure InternalPost; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     function  IsCursorOpen: Boolean; override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
     procedure SetFieldData(Field: TField; Buffer: Pointer); override;
     procedure DataConvert(aField: TField; aSource, aDest: Pointer; aToNative: Boolean); override;
     function  CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
@@ -276,7 +276,7 @@ begin
   FBlobFileName:=AValue;
 end;
 
-function TParadox.PXFilterRecord(Buffer: PChar): Boolean;
+function TParadox.PXFilterRecord(Buffer: TRecordBuffer): Boolean;
 
 var
   SaveState: TDatasetState;
@@ -299,20 +299,20 @@ end;
 
 {
 
-procedure TParadox.MDSReadRecord(Buffer:PChar;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
+procedure TParadox.MDSReadRecord(Buffer:TRecordBuffer;ARecNo:Integer);   //Reads a Rec from Stream in Buffer
 begin
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.ReadBuffer(Buffer^, FRecSize);
 end;
 
-procedure TParadox.MDSWriteRecord(Buffer:PChar;ARecNo:Integer);  //Writes a Rec from Buffer to Stream
+procedure TParadox.MDSWriteRecord(Buffer:TRecordBuffer;ARecNo:Integer);  //Writes a Rec from Buffer to Stream
 begin
   FStream.Position:=MDSGetRecordOffset(ARecNo);
   FStream.WriteBuffer(Buffer^, FRecSize);
   FFileModified:=True;
 end;
 
-procedure TParadox.MDSAppendRecord(Buffer:PChar);   //Appends a Rec (from Buffer) to Stream
+procedure TParadox.MDSAppendRecord(Buffer:TRecordBuffer);   //Appends a Rec (from Buffer) to Stream
 begin
   FStream.Position:=MDSGetRecordOffset(FRecCount);
   FStream.WriteBuffer(Buffer^, FRecSize);
@@ -320,7 +320,7 @@ begin
 end;
 }
 
-function TParadox.PXGetActiveBuffer(var Buffer: PChar): Boolean;
+function TParadox.PXGetActiveBuffer(var Buffer: TRecordBuffer): Boolean;
 
 begin
  case State of
@@ -390,18 +390,18 @@ end;
 
 
 //Abstract Overrides
-function TParadox.AllocRecordBuffer: PChar;
+function TParadox.AllocRecordBuffer: TRecordBuffer;
 begin
   Result:=Nil;
   GetMem(Result,SizeOf(TPXRecInfo)+GetRecordSize);
 end;
 
-procedure TParadox.FreeRecordBuffer (var Buffer: PChar);
+procedure TParadox.FreeRecordBuffer (var Buffer: TRecordBuffer);
 begin
   FreeMem(Buffer);
 end;
 
-procedure TParadox.InternalInitRecord(Buffer: PChar);
+procedure TParadox.InternalInitRecord(Buffer: TRecordBuffer);
 
 begin
   fillchar((Buffer+DataOffSet)^,GetRecordSize,0);
@@ -579,7 +579,7 @@ begin
   if ((State<>dsEdit) and (State<>dsInsert)) then
     Exit;
   if (State=dsEdit) then
-    PX_put_recordn(FDoc,ActiveBuffer, FCurrRecNo)
+    PX_put_recordn(FDoc,pansichar(ActiveBuffer), FCurrRecNo)
   else
     InternalAddRecord(ActiveBuffer,True);
 end;
@@ -590,7 +590,7 @@ begin
   Result:=(FDoc<>Nil);
 end;
 
-function TParadox.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+function TParadox.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 
 var
   Accepted: Boolean;
@@ -621,7 +621,7 @@ begin
     end;
     if result=grOK then
       begin
-      PX_get_record(Doc,FCurrRecNo,Buffer+DataOffset);
+      PX_get_record(Doc,FCurrRecNo,pansichar(Buffer+DataOffset));
       PPXRecInfo(Buffer)^.Bookmark:=FCurrRecNo;
       PPXRecInfo(Buffer)^.BookmarkFlag:=bfCurrent;
       if (Filtered) then
@@ -637,7 +637,7 @@ end;
 function TParadox.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 
 var
-  Buf          : PChar;
+  Buf          : TRecordbuffer;
   No,pft,flen : integer;
   pxf          : PPx_field;
   Value        : Pchar;
@@ -660,7 +660,7 @@ begin
     Case pft of
       pxfAlpha:
         begin
-        Result:=PX_get_data_alpha(FDoc,Buf,flen,@value)>0;
+        Result:=PX_get_data_alpha(FDoc,pansichar(Buf),flen,@value)>0;
         If result then
           begin
           Move(Value^,Buffer^,flen);
@@ -671,7 +671,7 @@ begin
         end;
       pxfDate:
         begin
-        Result:=PX_get_data_long(FDoc,Buf,flen,@longv)>0;
+        Result:=PX_get_data_long(FDoc,pansichar(Buf),flen,@longv)>0;
         If Result then
           begin
           // 1721425 is the number of the days between the start of the
@@ -683,33 +683,33 @@ begin
         end;
       pxfShort:
         begin
-        Result:=PX_get_data_short(FDoc,Buf, flen, @D)>0;
+        Result:=PX_get_data_short(FDoc,pansichar(Buf), flen, @D)>0;
         If result then
           PSmallInt(Buffer)^:=D;
         end;
       pxfAutoInc,
       pxfLong:
         begin
-        Result:=(PX_get_data_long(FDoc,buf,flen,@longv)>0);
+        Result:=(PX_get_data_long(FDoc,pansichar(buf),flen,@longv)>0);
         If Result then
           PInteger(Buffer)^:=Longv;
         end;
       pxfCurrency,
       pxfNumber:
         begin
-        Result:=(PX_get_data_double(FDoc,Buf,Flen,@R)>0);
+        Result:=(PX_get_data_double(FDoc,pansichar(Buf),Flen,@R)>0);
         If Result then
           PDouble(Buffer)^:=R;
         end;
       pxfLogical:
         begin
-        Result:=(PX_get_data_byte(FDoc,Buf,flen,@C)>0);
+        Result:=(PX_get_data_byte(FDoc,pansichar(Buf),flen,@C)>0);
         If result then
           PWordBool(Buffer)^:=(C<>#0);
         end;
       pxfBytes:
         begin
-        Result:=PX_get_data_bytes(FDoc,Buf,FLen,@Value)>0;
+        Result:=PX_get_data_bytes(FDoc,pansichar(Buf),FLen,@Value)>0;
         If Result then
           begin
           Move(Value^,Buffer^,FLen);
@@ -727,13 +727,13 @@ begin
         end;
       pxfTime:
         begin
-        Result:=(PX_get_data_long(FDoc,Buf,flen,@longv)>0);
+        Result:=(PX_get_data_long(FDoc,pansichar(Buf),flen,@longv)>0);
         If result then
           PDateTime(Buffer)^:=longv/MSecsPerDay;
         end;
       pxfTimestamp:
         begin
-        Result:=(PX_get_data_double(FDoc,buf,flen,@R)>0);
+        Result:=(PX_get_data_double(FDoc,pansichar(buf),flen,@R)>0);
         if Result then
           begin
           R:=R/1000.0;
@@ -761,7 +761,7 @@ end;
 procedure TParadox.SetFieldData(Field: TField; Buffer: Pointer);
 
 var
- DestBuffer: PChar;
+ DestBuffer: TRecordBuffer;
  I: integer;
 
 begin
@@ -848,7 +848,7 @@ begin
     RaiseError(SErrBookMarkNotFound,[ReqBookmark]);
 end;
 
-procedure TParadox.InternalSetToRecord(Buffer: PChar);
+procedure TParadox.InternalSetToRecord(Buffer: TRecordBuffer);
 
 var
   ReqBookmark: integer;
@@ -858,26 +858,26 @@ begin
   InternalGotoBookmark (@ReqBookmark);
 end;
 
-function TParadox.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TParadox.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 
 begin
   Result:=PPXRecInfo(Buffer)^.BookmarkFlag;
 end;
 
-procedure TParadox.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TParadox.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 
 begin
   PPXRecInfo(Buffer)^.BookmarkFlag := Value;
 end;
 
-procedure TParadox.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TParadox.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 
 begin
   if Data<>nil then
     PInteger(Data)^:=PPXRecInfo(Buffer)^.Bookmark;
 end;
 
-procedure TParadox.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TParadox.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 
 begin
   if Data<>nil then

+ 45 - 44
packages/fcl-db/src/sdf/sdfdata.pp

@@ -144,7 +144,7 @@ type
   private
     FSchema             :TStringList;
     FFileName           :TFileName;
-    FFilterBuffer       :PChar;
+    FFilterBuffer       :TRecordBuffer;
     FFileMustExist      :Boolean;
     FReadOnly           :Boolean;
     FLoadfromStream     :Boolean;
@@ -156,8 +156,8 @@ type
     procedure SetReadOnly(Value : Boolean);
     procedure RemoveWhiteLines(List : TStrings; IsFileRecord : Boolean);
     procedure LoadFieldScheme(List : TStrings; MaxSize : Integer);
-    function GetActiveRecBuf(var RecBuf: PChar): Boolean;
-    procedure SetFieldPos(var Buffer : PChar; FieldNo : Integer);
+    function GetActiveRecBuf(var RecBuf: TRecordBuffer): Boolean;
+    procedure SetFieldPos(var Buffer : TRecordBuffer; FieldNo : Integer);
   protected
     FData               :TStringlist;
     FCurRec             :Integer;
@@ -170,8 +170,8 @@ type
     FDefaultRecordLength:Cardinal;
     FDataOffset         : Integer;
   protected
-    function AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
+    function AllocRecordBuffer: TRecordBuffer; override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
     procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
     procedure InternalClose; override;
     procedure InternalDelete; override;
@@ -179,28 +179,28 @@ type
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
     procedure InternalHandleException; override;
     procedure InternalInitFieldDefs; override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     procedure InternalLast; override;
     procedure InternalOpen; override;
     procedure InternalPost; override;
     procedure InternalEdit; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     function IsCursorOpen: Boolean; override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function GetRecordSize: Word; override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
     procedure SetFieldData(Field: TField; Buffer: Pointer); override;
-    procedure ClearCalcFields(Buffer: PChar); override;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); override;
     function GetRecordCount: Integer; override;
     function GetRecNo: Integer; override;
     procedure SetRecNo(Value: Integer); override;
     function GetCanModify: boolean; override;
-    function TxtGetRecord(Buffer : PChar; GetMode: TGetMode): TGetResult;
+    function TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
     function RecordFilter(RecBuf: Pointer; ARecNo: Integer): Boolean;
-    function BufToStore(Buffer: PChar): String; virtual;
+    function BufToStore(Buffer: TRecordBuffer): String; virtual;
     function StoreToBuf(Source: String): String; virtual;
   public
     property DefaultRecordLength: Cardinal read FDefaultRecordLength
@@ -262,9 +262,9 @@ type
     procedure SetDelimiter(Value : Char);
   protected
     procedure InternalInitFieldDefs; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean)
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean)
              : TGetResult; override;
-    function BufToStore(Buffer: PChar): String; override;
+    function BufToStore(Buffer: TRecordBuffer): String; override;
     function StoreToBuf(Source: String): String; override;
   public
     constructor Create(AOwner: TComponent); override;
@@ -447,7 +447,7 @@ begin
 end;
 
 // Record Functions
-function TFixedFormatDataSet.AllocRecordBuffer: PChar;
+function TFixedFormatDataSet.AllocRecordBuffer: TRecordBuffer;
 begin
   if FRecBufSize > 0 then
     Result := AllocMem(FRecBufSize)
@@ -455,23 +455,23 @@ begin
     Result := nil;
 end;
 
-procedure TFixedFormatDataSet.FreeRecordBuffer(var Buffer: PChar);
+procedure TFixedFormatDataSet.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   if Buffer <> nil then
     FreeMem(Buffer);
 end;
 
-procedure TFixedFormatDataSet.InternalInitRecord(Buffer: PChar);
+procedure TFixedFormatDataSet.InternalInitRecord(Buffer: TRecordBuffer);
 begin
   FillChar(Buffer[0], FRecordSize, 0);
 end;
 
-procedure TFixedFormatDataSet.ClearCalcFields(Buffer: PChar);
+procedure TFixedFormatDataSet.ClearCalcFields(Buffer: TRecordBuffer);
 begin
   FillChar(Buffer[RecordSize], CalcFieldsSize, 0);
 end;
 
-function TFixedFormatDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
+function TFixedFormatDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
   DoCheck: Boolean): TGetResult;
 begin
   if (FData.Count < (1+FDataOffset)) then
@@ -500,7 +500,7 @@ end;
 
 function TFixedFormatDataSet.GetRecNo: Longint;
 var
-  BufPtr: PChar;
+  BufPtr: TRecordBuffer;
 begin
   Result := -1;
   if GetActiveRecBuf(BufPtr) then
@@ -524,7 +524,7 @@ begin
   Result := FRecordSize;
 end;
 
-function TFixedFormatDataSet.GetActiveRecBuf(var RecBuf: PChar): Boolean;
+function TFixedFormatDataSet.GetActiveRecBuf(var RecBuf: TRecordBuffer): Boolean;
 begin
   case State of
     dsBrowse: if IsEmpty then RecBuf := nil else RecBuf := ActiveBuffer;
@@ -537,7 +537,7 @@ begin
   Result := RecBuf <> nil;
 end;
 
-function TFixedFormatDataSet.TxtGetRecord(Buffer : PChar; GetMode: TGetMode): TGetResult;
+function TFixedFormatDataSet.TxtGetRecord(Buffer : TRecordBuffer; GetMode: TGetMode): TGetResult;
 var
   Accepted : Boolean;
 begin
@@ -624,15 +624,15 @@ end;
 
 function TFixedFormatDataSet.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 var
-  TempPos, RecBuf: PChar;
+  TempPos, recbuf : PChar;
 begin
-  Result := GetActiveRecBuf(RecBuf);
+  Result := GetActiveRecBuf(TRecordBuffer(RecBuf));
   if Result then
   begin
     if Field.FieldNo > 0 then
     begin
       TempPos := RecBuf;
-      SetFieldPos(RecBuf, Field.FieldNo);
+      SetFieldPos(TRecordBuffer(RecBuf), Field.FieldNo);
       Result := (RecBuf < StrEnd(TempPos));
     end
     else
@@ -661,12 +661,13 @@ end;
 
 procedure TFixedFormatDataSet.SetFieldData(Field: TField; Buffer: Pointer);
 var
-  RecBuf, BufEnd: PChar;
+  RecBuf: PChar;
+  BufEnd: PChar;
   p : Integer;
 begin
   if not (State in dsWriteModes) then
     DatabaseError(SNotEditing, Self);
-  GetActiveRecBuf(RecBuf);
+  GetActiveRecBuf(TRecordBuffer(RecBuf));
   if Field.FieldNo > 0 then
   begin
     if State = dsCalcFields then
@@ -677,8 +678,8 @@ begin
       Field.Validate(Buffer);
     if Field.FieldKind <> fkInternalCalc then
     begin
-      SetFieldPos(RecBuf, Field.FieldNo);
-      BufEnd := StrEnd(ActiveBuffer);  // Fill with blanks when necessary
+      SetFieldPos(TRecordBuffer(RecBuf), Field.FieldNo);
+      BufEnd := StrEnd(pansichar(ActiveBuffer));  // Fill with blanks when necessary
       if BufEnd > RecBuf then
         BufEnd := RecBuf;
       FillChar(BufEnd[0], Field.Size + PtrInt(RecBuf) - PtrInt(BufEnd), Ord(' '));
@@ -697,7 +698,7 @@ begin
     DataEvent(deFieldChange, Ptrint(Field));
 end;
 
-procedure TFixedFormatDataSet.SetFieldPos(var Buffer : PChar; FieldNo : Integer);
+procedure TFixedFormatDataSet.SetFieldPos(var Buffer : TRecordBuffer; FieldNo : Integer);
 var
   i : Integer;
 begin
@@ -770,28 +771,28 @@ begin
     DatabaseError('Bookmark not found');
 end;
 
-procedure TFixedFormatDataSet.InternalSetToRecord(Buffer: PChar);
+procedure TFixedFormatDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   if (State <> dsInsert) then
     InternalGotoBookmark(@PRecInfo(Buffer + FRecInfoOfs)^.RecordNumber);
 end;
 
-function TFixedFormatDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TFixedFormatDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := PRecInfo(Buffer + FRecInfoOfs)^.BookmarkFlag;
 end;
 
-procedure TFixedFormatDataSet.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TFixedFormatDataSet.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   PRecInfo(Buffer + FRecInfoOfs)^.BookmarkFlag := Value;
 end;
 
-procedure TFixedFormatDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TFixedFormatDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   Move(Buffer[FRecInfoOfs], Data^, BookmarkSize);
 end;
 
-procedure TFixedFormatDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TFixedFormatDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   Move(Data^, Buffer[FRecInfoOfs], BookmarkSize);
 end;
@@ -823,7 +824,7 @@ var
   i : Integer;
 begin
   for i := FData.Count -1 downto 0 do
-    FData[i] := BufToStore(PChar(StoreToBuf(FData[i])));
+    FData[i] := BufToStore(trecordbuffer(StoreToBuf(FData[i])));
   FData.SaveToFile(FileName);
 end;
 
@@ -839,9 +840,9 @@ begin
   Result := Source;
 end;
 
-function TFixedFormatDataSet.BufToStore(Buffer: PChar): String;
+function TFixedFormatDataSet.BufToStore(Buffer: TRecordBuffer): String;
 begin
-  Result := Copy(Buffer, 1, FRecordSize);
+  Result := Copy(pansichar(Buffer), 1, FRecordSize);
 end;
 
 //-----------------------------------------------------------------------------
@@ -910,7 +911,7 @@ begin
   inherited;
 end;
 
-function TSdfDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
+function TSdfDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
   DoCheck: Boolean): TGetResult;
 begin
   if FirstLineAsSchema then
@@ -1020,7 +1021,7 @@ begin
   Result := Ret;
 end;
 
-function TSdfDataSet.BufToStore(Buffer: PChar): String;
+function TSdfDataSet.BufToStore(Buffer: TRecordBuffer): String;
 const
  QuoteDelimiter='"';
 var
@@ -1033,7 +1034,7 @@ begin
   QuoteMe:=false;
   for i := 0 to FieldDefs.Count - 1 do
   begin
-    Str := Trim(Copy(Buffer, p, FieldDefs[i].Size));
+    Str := Trim(Copy(pansichar(Buffer), p, FieldDefs[i].Size));
     Inc(p, FieldDefs[i].Size);
     if FFMultiLine=true then
       begin

+ 22 - 10
packages/fcl-db/src/sqldb/mysql/mysqlconn.inc

@@ -55,7 +55,7 @@ Type
     FNeedData : Boolean;
     FStatement : String;
     Row : MYSQL_ROW;
-    Lengths : pculong;                { Lengths of the columns of the current row }
+    Lengths : pculong;                  { Lengths of the columns of the current row }
     RowsAffected : QWord;
     LastInsertID : QWord;
     ParamBinding : TParamBinding;
@@ -870,7 +870,7 @@ var
 begin
   Result := False;
   CreateBlob := False;
-  if Source = Nil then
+  if Source = Nil then // If the pointer is NULL, the field is NULL
     exit;
   SetString(Src, Source, Len);
   case AField^.ftype of
@@ -966,14 +966,26 @@ begin
           end;
       Writeln;
 }
-      // String-fields which can contain more then dsMaxStringSize characters
-      // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
-      if FieldDef.DataType in [ftBlob,ftMemo] then
-        CreateBlob := True
-      else if Src<> '' then
-        Move(Source^, Dest^, FieldDef.Size)
-      else
-        Dest^ := #0;
+      if Len > FieldDef.Size then
+        Len := FieldDef.Size;
+      case FieldDef.DataType of
+        // String-fields which can contain more then dsMaxStringSize characters
+        // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
+        ftBlob, ftMemo:
+          CreateBlob := True;
+        ftVarBytes:
+          begin
+          PWord(Dest)^ := Len;
+          Move(Source^, (Dest+sizeof(Word))^, Len);
+          end;
+        ftBytes:
+          Move(Source^, Dest^, Len);
+        else // ftString, ftFixedChar
+          begin
+          Move(Source^, Dest^, Len);
+          (Dest+Len)^ := #0;
+          end;
+      end;
       end;
     FIELD_TYPE_BLOB:
       CreateBlob := True;

+ 7 - 1
packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp

@@ -641,13 +641,19 @@ begin
       if int1 > 0 then
         move(sqlite3_column_text16(st,fnum)^, buffer^, int1); //Strings returned by sqlite3_column_text() and sqlite3_column_text16(), even empty strings, are always zero terminated.
       end;
+    ftVarBytes,
     ftBytes:
       begin
       int1 := sqlite3_column_bytes(st,fnum);
       if int1 > FieldDef.Size then
         int1 := FieldDef.Size;
+      if FieldDef.DataType = ftVarBytes then
+      begin
+        PWord(buffer)^ := int1;
+        inc(buffer, sizeof(Word));
+      end;
       if int1 > 0 then
-         move(sqlite3_column_blob(st,fnum)^, buffer^, int1);
+        move(sqlite3_column_blob(st,fnum)^, buffer^, int1);
       end;
     ftWideMemo,
     ftMemo,

+ 21 - 21
packages/fcl-db/src/sqlite/customsqliteds.pas

@@ -169,15 +169,15 @@ type
     function GetRowsAffected: Integer; virtual; abstract;
     procedure RetrieveFieldDefs; virtual; abstract;
     //TDataSet overrides
-    function AllocRecordBuffer: PChar; override;
-    procedure ClearCalcFields(Buffer: PChar); override;
+    function AllocRecordBuffer: TRecordBuffer; override;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); override;
     procedure DoBeforeClose; override;
     procedure DoAfterInsert; override;
     procedure DoBeforeInsert; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     function GetRecordCount: Integer; override;
     function GetRecNo: Integer; override;
     function GetRecordSize: Word; override; 
@@ -189,14 +189,14 @@ type
     procedure InternalFirst; override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
     procedure InternalInitFieldDefs; override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     procedure InternalLast; override;
     procedure InternalOpen; override;
     procedure InternalPost; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     function IsCursorOpen: Boolean; override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
     procedure SetExpectedAppends(AValue: Integer);
     procedure SetExpectedUpdates(AValue: Integer);
     procedure SetExpectedDeletes(AValue: Integer);
@@ -428,13 +428,13 @@ end;
  
 // TCustomSqliteDataset override methods
 
-function TCustomSqliteDataset.AllocRecordBuffer: PChar;
+function TCustomSqliteDataset.AllocRecordBuffer: TRecordBuffer;
 begin
   Result := AllocMem(SizeOf(PPDataRecord));
   PDataRecord(Pointer(Result)^) := FBeginItem;
 end;
 
-procedure TCustomSqliteDataset.ClearCalcFields(Buffer: PChar);
+procedure TCustomSqliteDataset.ClearCalcFields(Buffer: TRecordBuffer);
 var
   i: Integer;
   RecordItem: PDataRecord;
@@ -668,17 +668,17 @@ begin
   FreeMem(FCacheItem^.Row, FRowBufferSize);
 end;
 
-procedure TCustomSqliteDataset.FreeRecordBuffer(var Buffer: PChar);
+procedure TCustomSqliteDataset.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   FreeMem(Buffer);
 end;
 
-procedure TCustomSqliteDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomSqliteDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   Pointer(Data^) := PPDataRecord(Buffer)^;
 end;
 
-function TCustomSqliteDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TCustomSqliteDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := PPDataRecord(Buffer)^^.BookmarkFlag;
 end;
@@ -737,7 +737,7 @@ begin
   Result := GetFieldData(Field, Buffer, False);
 end;
 
-function TCustomSqliteDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+function TCustomSqliteDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 begin
   Result := grOk;
   case GetMode of
@@ -936,7 +936,7 @@ begin
   RetrieveFieldDefs;
 end;
 
-procedure TCustomSqliteDataset.InternalInitRecord(Buffer: PChar);
+procedure TCustomSqliteDataset.InternalInitRecord(Buffer: TRecordBuffer);
 var
   TempStr: String;
 begin
@@ -996,7 +996,7 @@ begin
   end;
 end;
 
-procedure TCustomSqliteDataset.InternalSetToRecord(Buffer: PChar);
+procedure TCustomSqliteDataset.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   FCurrentItem := PPDataRecord(Buffer)^;
 end;
@@ -1283,7 +1283,7 @@ begin
   begin
     SaveState := SetTempState(dsInternalCalc);
     try
-      CalculateFields(PChar(@TempItem));
+      CalculateFields(TRecordBuffer(@TempItem));
       Result := FieldByName(ResultFields).Value;
     finally
       RestoreState(SaveState);
@@ -1293,12 +1293,12 @@ begin
     Result := Null;
 end;  
 
-procedure TCustomSqliteDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomSqliteDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   //The BookMarkData is the Buffer itself: no need to set nothing;
 end;
 
-procedure TCustomSqliteDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TCustomSqliteDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   PPDataRecord(Buffer)^^.BookmarkFlag := Value;
 end;

+ 14 - 1
packages/fcl-db/tests/testfieldtypes.pas

@@ -94,6 +94,7 @@ type
     procedure TestFloatParamQuery;
     procedure TestBCDParamQuery;
     procedure TestBytesParamQuery;
+    procedure TestVarBytesParamQuery;
     procedure TestAggregates;
 
     procedure TestStringLargerThen8192;
@@ -150,7 +151,12 @@ const
   );
 
   testBytesValuesCount = 5;
-  testBytesValues : Array[0..testBytesValuesCount-1] of shortstring = (#1#0#1#0#1, #0#0#1#0#1, #0''''#13#0#1, '\'#0'"\'#13, #13#13#0#10#10);
+  testVarBytesValuesCount = 8;
+  testBytesValues : Array[0..testVarBytesValuesCount-1] of shortstring = (
+    #1#0#1#0#1, #0#0#1#0#1, #0''''#13#0#1, '\'#0'"\'#13, #13#13#0#10#10,
+    '', #0, #0#1#2#3#4#5#6#7#8#9
+  );
+
 
 procedure TTestFieldTypes.TestpfInUpdateFlag;
 var ds   : TCustomBufDataset;
@@ -801,6 +807,11 @@ begin
   TestXXParamQuery(ftBytes, FieldtypeDefinitions[ftBytes], testBytesValuesCount, true);
 end;
 
+procedure TTestFieldTypes.TestVarBytesParamQuery;
+begin
+  TestXXParamQuery(ftVarBytes, FieldtypeDefinitions[ftVarBytes], testVarBytesValuesCount);
+end;
+
 procedure TTestFieldTypes.TestStringParamQuery;
 
 begin
@@ -862,6 +873,7 @@ begin
                      Params.ParamByName('field1').Value := StringToByteArray(testBytesValues[i])
                    else
                      Params.ParamByName('field1').AsBlob := testBytesValues[i];
+        ftVarBytes:Params.ParamByName('field1').AsString := testBytesValues[i];
       else
         AssertTrue('no test for paramtype available',False);
       end;
@@ -886,6 +898,7 @@ begin
         ftDate   : AssertEquals(testDateValues[i],DateTimeToStr(FieldByName('FIELD1').AsDateTime, DBConnector.FormatSettings));
         ftDateTime : AssertEquals(testValues[ADataType,i], DateTimeToStr(FieldByName('FIELD1').AsDateTime, DBConnector.FormatSettings));
         ftFMTBcd : AssertEquals(testFmtBCDValues[i], BCDToStr(FieldByName('FIELD1').AsBCD, DBConnector.FormatSettings));
+        ftVarBytes,
         ftBytes  : AssertEquals(testBytesValues[i], shortstring(FieldByName('FIELD1').AsString));
       else
         AssertTrue('no test for paramtype available',False);

+ 3 - 3
packages/ibase/src/ibase60.inc

@@ -2647,9 +2647,9 @@ begin
     end
   else
     begin
-    If (TryInitialiseIBase60(fbembedlib)=0) and 
-       (TryInitialiseIBase60(fbclib)=0) and
-       (TryInitialiseIBase60(gdslib)=0) then
+    If (TryInitialiseIBase60(fbclib)=0) and
+       (TryInitialiseIBase60(gdslib)=0) and
+       (TryInitialiseIBase60(fbembedlib)=0) then
         Raise EInOutError.CreateFmt(SErrDefaultsFailed,[fbembedlib,gdslib,fbclib]);
     end;    
   Result := RefCount;