TParadoxDataset: Add bookmark support.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6907 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-05-11 16:05:27 +00:00
parent 9675c3955d
commit 6c5a594a90

View File

@ -190,7 +190,7 @@ type
procedure InternalEdit; override; procedure InternalEdit; override;
procedure InternalFirst; override; procedure InternalFirst; override;
procedure InternalGotoBookmark(ABookmark: Pointer); override; procedure InternalGotoBookmark(ABookmark: Pointer); override;
procedure InternalHandleException; override; // procedure InternalHandleException; override;
procedure InternalInitFieldDefs; override; procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override; procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalLast; override; procedure InternalLast; override;
@ -203,6 +203,8 @@ type
procedure SetRecNo(Value: Integer); override; procedure SetRecNo(Value: Integer); override;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
function BookmarkValid(ABookmark: TBookmark): Boolean; override;
function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; override;
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override; function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
procedure SetFieldData({%H-}Field: TField; {%H-}Buffer: Pointer); override; procedure SetFieldData({%H-}Field: TField; {%H-}Buffer: Pointer); override;
@ -242,10 +244,8 @@ type
// property OnPostError; // property OnPostError;
end; end;
implementation
uses implementation
Forms;
{ TParadoxDataset } { TParadoxDataset }
@ -255,6 +255,7 @@ begin
FHeader := nil; FHeader := nil;
FTargetEncoding := Uppercase(EncodingUTF8); FTargetEncoding := Uppercase(EncodingUTF8);
FInputEncoding := ''; FInputEncoding := '';
BookmarkSize := SizeOf(LongInt);
end; end;
function TParadoxDataset.AllocRecordBuffer: PChar; function TParadoxDataset.AllocRecordBuffer: PChar;
@ -265,6 +266,26 @@ begin
Result := nil; Result := nil;
end; end;
function TParadoxDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
begin
Result := Assigned(ABookmark) and (Length(ABookMark) <> 0);
end;
function TParadoxDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;
var
idx1, idx2: LongWord;
begin
idx1 := PLongWord(Bookmark1)^;
idx2 := PLongWord(Bookmark2)^;
if idx1 > idx2 then
Result := +1
else
if idx1 = idx2 then
Result := 0
else
Result := -1
end;
function TParadoxDataset.CreateBlobStream(Field: TField; function TParadoxDataset.CreateBlobStream(Field: TField;
Mode: TBlobStreamMode): TStream; Mode: TBlobStreamMode): TStream;
var var
@ -344,7 +365,12 @@ end;
procedure TParadoxDataset.GetBookmarkData(Buffer: PChar; Data: Pointer); procedure TParadoxDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
begin begin
//TODO PLongWord(Data)^ := PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber;
end;
function TParadoxDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
begin
Result := PRecInfo(Buffer + FHeader^.RecordSize)^.BookmarkFlag;
end; end;
function TParadoxDataset.GetCanModify: Boolean; function TParadoxDataset.GetCanModify: Boolean;
@ -577,14 +603,16 @@ end;
procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer); procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer);
begin begin
SetRecNo(PLongWord(ABookmark)^); if BookmarkValid(ABookmark) then
SetRecNo(PLongWord(ABookmark)^);
end; end;
{
procedure TParadoxDataset.InternalHandleException; procedure TParadoxDataset.InternalHandleException;
begin begin
Application.HandleException(Self); Application.HandleException(Self);
end; end;
}
procedure TParadoxDataset.InternalInitFieldDefs; procedure TParadoxDataset.InternalInitFieldDefs;
var var
i: integer; i: integer;
@ -769,12 +797,13 @@ end;
procedure TParadoxDataset.SetBookmarkData(Buffer: PChar; Data: Pointer); procedure TParadoxDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
begin begin
//TODO // The BookMarkData is the RecNo: no need to set nothing;
end; {
if Data <> nil then
function TParadoxDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber := PLongWord(Data)^
begin else
Result := PRecInfo(Buffer + FHeader^.RecordSize)^.BookmarkFlag; PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber := 0;
}
end; end;
procedure TParadoxDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); procedure TParadoxDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);