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