mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 19:05:54 +02:00
* Renamed TBufDatasetReader to TDataPacketReader
* Start of TFpcBinaryDatapacketReader * Implemented TBufDataset.SetDatasetPacket, GetDatasetPacket, LoadFromStream and SaveToStream git-svn-id: trunk@11783 -
This commit is contained in:
parent
2439dbd5a6
commit
af30329348
@ -300,9 +300,13 @@ type
|
|||||||
|
|
||||||
|
|
||||||
type
|
type
|
||||||
TBufDatasetReader = class(TObject)
|
|
||||||
|
{ TDataPacketReader }
|
||||||
|
|
||||||
|
TDataPacketReader = class(TObject)
|
||||||
|
FStream : TStream;
|
||||||
public
|
public
|
||||||
constructor create; virtual;
|
constructor create(AStream : TStream); virtual;
|
||||||
|
|
||||||
procedure LoadFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
|
procedure LoadFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
|
||||||
procedure StoreFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
|
procedure StoreFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
|
||||||
@ -312,14 +316,15 @@ type
|
|||||||
procedure GotoNextRecord; virtual; abstract;
|
procedure GotoNextRecord; virtual; abstract;
|
||||||
function GetCurrentElement : pointer; virtual; abstract;
|
function GetCurrentElement : pointer; virtual; abstract;
|
||||||
procedure GotoElement(const AnElement : pointer); virtual; abstract;
|
procedure GotoElement(const AnElement : pointer); virtual; abstract;
|
||||||
procedure RestoreRecord(ADataset : TDataset); virtual; abstract;
|
procedure RestoreRecord(ADataset : TBufDataset); virtual; abstract;
|
||||||
procedure StoreRecord(ADataset : TDataset; RowState : TRowState); virtual; abstract;
|
procedure StoreRecord(ADataset : TBufDataset; RowState : TRowState); virtual; abstract;
|
||||||
procedure InitLoadRecords(var AChangeLog : TChangeLogEntryArr); virtual; abstract;
|
procedure InitLoadRecords(var AChangeLog : TChangeLogEntryArr); virtual; abstract;
|
||||||
|
property Stream: TStream read FStream;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TXMLBufDatasetReader }
|
{ TXMLBufDatasetReader }
|
||||||
|
|
||||||
TXMLBufDatasetReader = class(TBufDatasetReader)
|
TXMLDatapacketReader = class(TDataPacketReader)
|
||||||
FFileName : String;
|
FFileName : String;
|
||||||
|
|
||||||
XMLDocument : TXMLDocument;
|
XMLDocument : TXMLDocument;
|
||||||
@ -333,7 +338,6 @@ type
|
|||||||
FRecordNode : TDOMNode;
|
FRecordNode : TDOMNode;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor create(AFileName : string); overload; virtual;
|
|
||||||
destructor destroy; override;
|
destructor destroy; override;
|
||||||
procedure LoadFieldDefs(AFieldDefs : TFieldDefs); override;
|
procedure LoadFieldDefs(AFieldDefs : TFieldDefs); override;
|
||||||
procedure StoreFieldDefs(AFieldDefs : TFieldDefs); override;
|
procedure StoreFieldDefs(AFieldDefs : TFieldDefs); override;
|
||||||
@ -345,17 +349,38 @@ type
|
|||||||
procedure GotoElement(const AnElement : pointer); override;
|
procedure GotoElement(const AnElement : pointer); override;
|
||||||
procedure InitLoadRecords(var AChangeLog : TChangeLogEntryArr); override;
|
procedure InitLoadRecords(var AChangeLog : TChangeLogEntryArr); override;
|
||||||
function GetCurrentElement: pointer; override;
|
function GetCurrentElement: pointer; override;
|
||||||
procedure RestoreRecord(ADataset : TDataset); override;
|
procedure RestoreRecord(ADataset : TBufDataset); override;
|
||||||
procedure StoreRecord(ADataset : TDataset; RowState : TRowState); override;
|
procedure StoreRecord(ADataset : TBufDataset; RowState : TRowState); override;
|
||||||
|
|
||||||
|
// property FileName : string read FFileName write FFileName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TFpcBinaryBufDatasetReader }
|
||||||
|
|
||||||
|
TFpcBinaryDatapacketReader = class(TDataPacketReader)
|
||||||
|
FFileName : String;
|
||||||
|
public
|
||||||
|
procedure LoadFieldDefs(AFieldDefs : TFieldDefs); override;
|
||||||
|
procedure StoreFieldDefs(AFieldDefs : TFieldDefs); override;
|
||||||
|
procedure GetRecordUpdState(var AIsUpdate, AAddRecordBuffer,
|
||||||
|
AIsFirstEntry: boolean); override;
|
||||||
|
procedure EndStoreRecord(const AChangeLog : TChangeLogEntryArr); override;
|
||||||
|
function GetCurrentRecord : boolean; override;
|
||||||
|
procedure GotoNextRecord; override;
|
||||||
|
procedure GotoElement(const AnElement : pointer); override;
|
||||||
|
procedure InitLoadRecords(var AChangeLog : TChangeLogEntryArr); override;
|
||||||
|
function GetCurrentElement: pointer; override;
|
||||||
|
procedure RestoreRecord(ADataset : TBufDataset); override;
|
||||||
|
procedure StoreRecord(ADataset : TBufDataset; RowState : TRowState); override;
|
||||||
|
|
||||||
property FileName : string read FFileName write FFileName;
|
property FileName : string read FFileName write FFileName;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
TBufDataset = class(TDBDataSet)
|
TBufDataset = class(TDBDataSet)
|
||||||
private
|
private
|
||||||
FFileName: string;
|
FFileName: string;
|
||||||
FDatasetReader : TBufDatasetReader;
|
FFileStream : TFileStream;
|
||||||
|
FDatasetReader : TDataPacketReader;
|
||||||
FIndexes : array of TBufIndex;
|
FIndexes : array of TBufIndex;
|
||||||
FMaxIndexesCount: integer;
|
FMaxIndexesCount: integer;
|
||||||
|
|
||||||
@ -447,6 +472,7 @@ type
|
|||||||
function Fetch : boolean; virtual;
|
function Fetch : boolean; virtual;
|
||||||
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
|
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual;
|
||||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); virtual; abstract;
|
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); virtual; abstract;
|
||||||
|
function IsReadFromPacket : Boolean;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
@ -465,8 +491,13 @@ type
|
|||||||
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
|
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
|
||||||
procedure AddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string = '';
|
procedure AddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string = '';
|
||||||
const ACaseInsFields: string = ''); virtual;
|
const ACaseInsFields: string = ''); virtual;
|
||||||
procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = dfBinary);
|
|
||||||
|
procedure SetDatasetPacket(AReader : TDataPacketReader);
|
||||||
|
procedure GetDatasetPacket(AWriter : TDataPacketReader);
|
||||||
|
procedure LoadFromStream(AStream : TStream);
|
||||||
|
procedure SaveToStream(AStream : TStream; Format: TDataPacketFormat = dfBinary);
|
||||||
procedure LoadFromFile(const AFileName: string = '');
|
procedure LoadFromFile(const AFileName: string = '');
|
||||||
|
procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = dfBinary);
|
||||||
procedure CreateDataset;
|
procedure CreateDataset;
|
||||||
|
|
||||||
property ChangeCount : Integer read GetChangeCount;
|
property ChangeCount : Integer read GetChangeCount;
|
||||||
@ -875,7 +906,10 @@ var IndexNr : integer;
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
if not Assigned(FDatasetReader) and (FileName<>'') then
|
if not Assigned(FDatasetReader) and (FileName<>'') then
|
||||||
FDatasetReader := TXMLBufDatasetReader.Create(FFileName); // <-- MEM-LEAK
|
begin
|
||||||
|
FFileStream := TFileStream.Create(FileName,fmOpenRead);
|
||||||
|
FDatasetReader := TFpcBinaryDatapacketReader.Create(FFileStream);
|
||||||
|
end;
|
||||||
if assigned(FDatasetReader) then IntLoadFielddefsFromFile(FFileName);
|
if assigned(FDatasetReader) then IntLoadFielddefsFromFile(FFileName);
|
||||||
CalcRecordSize;
|
CalcRecordSize;
|
||||||
|
|
||||||
@ -2308,7 +2342,27 @@ const
|
|||||||
|
|
||||||
procedure TBufDataset.SaveToFile(const FileName: string;
|
procedure TBufDataset.SaveToFile(const FileName: string;
|
||||||
Format: TDataPacketFormat);
|
Format: TDataPacketFormat);
|
||||||
|
var AFileStream : TFileStream;
|
||||||
|
begin
|
||||||
|
AFileStream := TFileStream.Create(FileName,fmCreate);
|
||||||
|
try
|
||||||
|
SaveToStream(AFileStream, Format);
|
||||||
|
finally
|
||||||
|
AFileStream.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBufDataset.SetDatasetPacket(AReader: TDataPacketReader);
|
||||||
|
begin
|
||||||
|
FDatasetReader := AReader;
|
||||||
|
try
|
||||||
|
Open;
|
||||||
|
finally
|
||||||
|
FDatasetReader := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBufDataset.GetDatasetPacket(AWriter: TDataPacketReader);
|
||||||
var i : integer;
|
var i : integer;
|
||||||
ScrollResult : TGetResult;
|
ScrollResult : TGetResult;
|
||||||
StoreDSState : TDataSetState;
|
StoreDSState : TDataSetState;
|
||||||
@ -2320,101 +2374,127 @@ var RowState : TRowState;
|
|||||||
RecUpdBuf: integer;
|
RecUpdBuf: integer;
|
||||||
EntryNr : integer;
|
EntryNr : integer;
|
||||||
ChangeLogStr : String;
|
ChangeLogStr : String;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
FDatasetReader := TXMLBufDatasetReader.Create(FileName);
|
FDatasetReader := AWriter;
|
||||||
try
|
try
|
||||||
|
|
||||||
// CheckActive;
|
// CheckActive;
|
||||||
ABookMark:=@ATBookmark;
|
ABookMark:=@ATBookmark;
|
||||||
FDatasetReader.StoreFieldDefs(FieldDefs);
|
FDatasetReader.StoreFieldDefs(FieldDefs);
|
||||||
|
|
||||||
SetLength(ChangeLog,length(FUpdateBuffer));
|
SetLength(ChangeLog,length(FUpdateBuffer));
|
||||||
EntryNr:=1;
|
EntryNr:=1;
|
||||||
|
|
||||||
StoreDSState:=State;
|
StoreDSState:=State;
|
||||||
SetTempState(dsFilter);
|
SetTempState(dsFilter);
|
||||||
ScrollResult:=FCurrentIndex.ScrollFirst;
|
ScrollResult:=FCurrentIndex.ScrollFirst;
|
||||||
while ScrollResult=grOK do
|
while ScrollResult=grOK do
|
||||||
begin
|
|
||||||
FCurrentIndex.StoreCurrentRecIntoBookmark(ABookmark);
|
|
||||||
if GetRecordUpdateBuffer(ABookmark^) and (FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind <> ukDelete) then
|
|
||||||
begin
|
begin
|
||||||
if FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind = ukInsert then
|
FCurrentIndex.StoreCurrentRecIntoBookmark(ABookmark);
|
||||||
|
if GetRecordUpdateBuffer(ABookmark^) and (FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind <> ukDelete) then
|
||||||
begin
|
begin
|
||||||
RowState:=[rsvInserted];
|
if FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind = ukInsert then
|
||||||
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
|
||||||
with ChangeLog[FCurrentUpdateBuffer] do
|
|
||||||
begin
|
begin
|
||||||
OrigEntry:=0;
|
RowState:=[rsvInserted];
|
||||||
NewEntry:=EntryNr;
|
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
||||||
UpdateKind:=ukInsert;
|
with ChangeLog[FCurrentUpdateBuffer] do
|
||||||
|
begin
|
||||||
|
OrigEntry:=0;
|
||||||
|
NewEntry:=EntryNr;
|
||||||
|
UpdateKind:=ukInsert;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else // This is always ukModified
|
||||||
|
begin
|
||||||
|
RowState:=[rsvOriginal];
|
||||||
|
FFilterBuffer:=FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer;
|
||||||
|
ChangeLog[FCurrentUpdateBuffer].OrigEntry:=EntryNr;
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else // This is always ukModified
|
else
|
||||||
begin
|
begin
|
||||||
RowState:=[rsvOriginal];
|
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
||||||
FFilterBuffer:=FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer;
|
RowState:=[];
|
||||||
ChangeLog[FCurrentUpdateBuffer].OrigEntry:=EntryNr;
|
|
||||||
end;
|
end;
|
||||||
end
|
|
||||||
else
|
FDatasetReader.StoreRecord(Self,RowState);
|
||||||
begin
|
inc(EntryNr);
|
||||||
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
ScrollResult:=FCurrentIndex.ScrollForward;
|
||||||
RowState:=[];
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
FDatasetReader.StoreRecord(Self,RowState);
|
for RecUpdBuf:=0 to length(FUpdateBuffer)-1 do with FUpdateBuffer[RecUpdBuf] do
|
||||||
inc(EntryNr);
|
|
||||||
ScrollResult:=FCurrentIndex.ScrollForward;
|
|
||||||
end;
|
|
||||||
|
|
||||||
for RecUpdBuf:=0 to length(FUpdateBuffer)-1 do with FUpdateBuffer[RecUpdBuf] do
|
|
||||||
begin
|
|
||||||
if UpdateKind = ukDelete then
|
|
||||||
begin
|
begin
|
||||||
RowState:=[rsvDeleted];
|
if UpdateKind = ukDelete then
|
||||||
FFilterBuffer:=FUpdateBuffer[RecUpdBuf].OldValuesBuffer;
|
|
||||||
FDatasetReader.StoreRecord(Self, RowState);
|
|
||||||
with ChangeLog[RecUpdBuf] do
|
|
||||||
begin
|
begin
|
||||||
NewEntry:=EntryNr;
|
RowState:=[rsvDeleted];
|
||||||
UpdateKind:=ukDelete;
|
FFilterBuffer:=FUpdateBuffer[RecUpdBuf].OldValuesBuffer;
|
||||||
end;
|
FDatasetReader.StoreRecord(Self, RowState);
|
||||||
inc(EntryNr);
|
with ChangeLog[RecUpdBuf] do
|
||||||
end
|
begin
|
||||||
else if UpdateKind = ukModify then
|
NewEntry:=EntryNr;
|
||||||
begin
|
UpdateKind:=ukDelete;
|
||||||
RowState:=[rsvUpdated];
|
end;
|
||||||
FCurrentIndex.GotoBookmark(@BookmarkData);
|
inc(EntryNr);
|
||||||
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
end
|
||||||
FDatasetReader.StoreRecord(Self, RowState);
|
else if UpdateKind = ukModify then
|
||||||
with ChangeLog[RecUpdBuf] do
|
|
||||||
begin
|
begin
|
||||||
NewEntry:=EntryNr;
|
RowState:=[rsvUpdated];
|
||||||
UpdateKind:=ukModify;
|
FCurrentIndex.GotoBookmark(@BookmarkData);
|
||||||
|
FFilterBuffer:=FCurrentIndex.CurrentBuffer;
|
||||||
|
FDatasetReader.StoreRecord(Self, RowState);
|
||||||
|
with ChangeLog[RecUpdBuf] do
|
||||||
|
begin
|
||||||
|
NewEntry:=EntryNr;
|
||||||
|
UpdateKind:=ukModify;
|
||||||
|
end;
|
||||||
|
inc(EntryNr);
|
||||||
end;
|
end;
|
||||||
inc(EntryNr);
|
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
|
|
||||||
RestoreState(StoreDSState);
|
RestoreState(StoreDSState);
|
||||||
|
|
||||||
FDatasetReader.EndStoreRecord(ChangeLog);
|
FDatasetReader.EndStoreRecord(ChangeLog);
|
||||||
SetLength(ChangeLog,0);
|
SetLength(ChangeLog,0);
|
||||||
|
|
||||||
finally
|
finally
|
||||||
FDatasetReader.Free;
|
FDatasetReader := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBufDataset.LoadFromStream(AStream: TStream);
|
||||||
|
var APacketReader : TDataPacketReader;
|
||||||
|
begin
|
||||||
|
APacketReader := TFpcBinaryDatapacketReader.create(AStream);
|
||||||
|
try
|
||||||
|
SetDatasetPacket(APacketReader);
|
||||||
|
finally
|
||||||
|
APacketReader.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBufDataset.SaveToStream(AStream: TStream; Format: TDataPacketFormat);
|
||||||
|
var APacketWriter : TDataPacketReader;
|
||||||
|
begin
|
||||||
|
case Format of
|
||||||
|
dfBinary : APacketWriter := TFpcBinaryDatapacketReader.create(AStream);
|
||||||
|
dfXML : APacketWriter := TXMLDatapacketReader.create(AStream);
|
||||||
|
end;
|
||||||
|
try
|
||||||
|
GetDatasetPacket(APacketWriter);
|
||||||
|
finally
|
||||||
|
APacketWriter.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TBufDataset.LoadFromFile(const AFileName: string);
|
procedure TBufDataset.LoadFromFile(const AFileName: string);
|
||||||
|
var AFileStream : TFileStream;
|
||||||
begin
|
begin
|
||||||
FDatasetReader := TXMLBufDatasetReader.Create(AFileName);
|
AFileStream := TFileStream.Create(AFileName,fmOpenRead);
|
||||||
try
|
try
|
||||||
Open;
|
LoadFromStream(AFileStream);
|
||||||
finally
|
finally
|
||||||
FDatasetReader.Free;
|
AFileStream.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2518,6 +2598,11 @@ begin
|
|||||||
RestoreState(StoreState);
|
RestoreState(StoreState);
|
||||||
FIndexes[0].SetToFirstRecord;
|
FIndexes[0].SetToFirstRecord;
|
||||||
FAllPacketsFetched:=True;
|
FAllPacketsFetched:=True;
|
||||||
|
if assigned(FFileStream) then
|
||||||
|
begin
|
||||||
|
FreeAndNil(FFileStream);
|
||||||
|
FreeAndNil(FDatasetReader);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TBufDataset.InternalAddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string;
|
procedure TBufDataset.InternalAddIndex(const AName, AFields : string; AOptions : TIndexOptions; const ADescFields: string;
|
||||||
@ -2611,6 +2696,11 @@ begin
|
|||||||
Result := False;
|
Result := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TBufDataset.IsReadFromPacket: Boolean;
|
||||||
|
begin
|
||||||
|
Result := (FDatasetReader<>nil) or (FFileName<>'');
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TBufDataset.ParseFilter(const AFilter: string);
|
procedure TBufDataset.ParseFilter(const AFilter: string);
|
||||||
begin
|
begin
|
||||||
// parser created?
|
// parser created?
|
||||||
@ -2933,30 +3023,25 @@ begin
|
|||||||
// inherited EndUpdate;
|
// inherited EndUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TBufDatasetReader }
|
{ TDataPacketReader }
|
||||||
|
|
||||||
constructor TBufDatasetReader.create;
|
constructor TDataPacketReader.create(AStream: TStream);
|
||||||
begin
|
begin
|
||||||
inherited;
|
FStream := AStream;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TXMLBufDatasetReader }
|
{ TXMLDatapacketReader }
|
||||||
|
|
||||||
constructor TXMLBufDatasetReader.create(AFileName: string);
|
destructor TXMLDatapacketReader.destroy;
|
||||||
begin
|
|
||||||
inherited create;
|
|
||||||
FFileName:=AFileName;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TXMLBufDatasetReader.destroy;
|
|
||||||
begin
|
begin
|
||||||
FieldsNode.Free;
|
FieldsNode.Free;
|
||||||
MetaDataNode.Free;
|
MetaDataNode.Free;
|
||||||
DataPacketNode.Free;
|
DataPacketNode.Free;
|
||||||
XMLDocument.Free;
|
XMLDocument.Free;
|
||||||
|
inherited destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.LoadFieldDefs(AFieldDefs : TFieldDefs);
|
procedure TXMLDatapacketReader.LoadFieldDefs(AFieldDefs : TFieldDefs);
|
||||||
|
|
||||||
function GetNodeAttribute(const aNode : TDOMNode; AttName : String) : string;
|
function GetNodeAttribute(const aNode : TDOMNode; AttName : String) : string;
|
||||||
var AnAttr : TDomNode;
|
var AnAttr : TDomNode;
|
||||||
@ -2973,7 +3058,7 @@ var i : integer;
|
|||||||
AFieldNode : TDOMNode;
|
AFieldNode : TDOMNode;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
ReadXMLFile(XMLDocument,FileName);
|
ReadXMLFile(XMLDocument,Stream);
|
||||||
DataPacketNode := XMLDocument.FindNode('DATAPACKET') as TDOMElement;
|
DataPacketNode := XMLDocument.FindNode('DATAPACKET') as TDOMElement;
|
||||||
if not assigned(DataPacketNode) then DatabaseError('Onbekend formaat');
|
if not assigned(DataPacketNode) then DatabaseError('Onbekend formaat');
|
||||||
|
|
||||||
@ -3013,7 +3098,7 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.StoreFieldDefs(AFieldDefs: TFieldDefs);
|
procedure TXMLDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs);
|
||||||
|
|
||||||
var i : integer;
|
var i : integer;
|
||||||
AFieldNode : TDOMElement;
|
AFieldNode : TDOMElement;
|
||||||
@ -3060,7 +3145,7 @@ begin
|
|||||||
FRowDataNode := XMLDocument.CreateElement('ROWDATA');
|
FRowDataNode := XMLDocument.CreateElement('ROWDATA');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.GetRecordUpdState(var AIsUpdate,
|
procedure TXMLDatapacketReader.GetRecordUpdState(var AIsUpdate,
|
||||||
AAddRecordBuffer, AIsFirstEntry: boolean);
|
AAddRecordBuffer, AIsFirstEntry: boolean);
|
||||||
var ARowStateNode : TDOmNode;
|
var ARowStateNode : TDOmNode;
|
||||||
ARowState : integer;
|
ARowState : integer;
|
||||||
@ -3083,7 +3168,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.EndStoreRecord(const AChangeLog : TChangeLogEntryArr);
|
procedure TXMLDatapacketReader.EndStoreRecord(const AChangeLog : TChangeLogEntryArr);
|
||||||
var ChangeLogStr : String;
|
var ChangeLogStr : String;
|
||||||
i : integer;
|
i : integer;
|
||||||
begin
|
begin
|
||||||
@ -3101,15 +3186,16 @@ begin
|
|||||||
|
|
||||||
DataPacketNode.AppendChild(FRowDataNode);
|
DataPacketNode.AppendChild(FRowDataNode);
|
||||||
XMLDocument.AppendChild(DataPacketNode);
|
XMLDocument.AppendChild(DataPacketNode);
|
||||||
WriteXML(XMLDocument,FileName);
|
|
||||||
|
WriteXML(XMLDocument,Stream);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TXMLBufDatasetReader.GetCurrentRecord: boolean;
|
function TXMLDatapacketReader.GetCurrentRecord: boolean;
|
||||||
begin
|
begin
|
||||||
Result := assigned(FRecordNode);
|
Result := assigned(FRecordNode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.InitLoadRecords(
|
procedure TXMLDatapacketReader.InitLoadRecords(
|
||||||
var AChangeLog: TChangeLogEntryArr);
|
var AChangeLog: TChangeLogEntryArr);
|
||||||
|
|
||||||
var ChangeLogStr : String;
|
var ChangeLogStr : String;
|
||||||
@ -3151,12 +3237,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TXMLBufDatasetReader.GetCurrentElement: pointer;
|
function TXMLDatapacketReader.GetCurrentElement: pointer;
|
||||||
begin
|
begin
|
||||||
Result:=FRecordNode;
|
Result:=FRecordNode;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.RestoreRecord(ADataset : TDataset);
|
procedure TXMLDatapacketReader.RestoreRecord(ADataset : TBufDataset);
|
||||||
var FieldNr : integer;
|
var FieldNr : integer;
|
||||||
AFieldNode : TDomNode;
|
AFieldNode : TDomNode;
|
||||||
begin
|
begin
|
||||||
@ -3170,7 +3256,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.StoreRecord(ADataset: TDataset;
|
procedure TXMLDatapacketReader.StoreRecord(ADataset: TBufDataset;
|
||||||
RowState: TRowState);
|
RowState: TRowState);
|
||||||
var FieldNr : Integer;
|
var FieldNr : Integer;
|
||||||
RowStateInt : Integer;
|
RowStateInt : Integer;
|
||||||
@ -3191,17 +3277,119 @@ begin
|
|||||||
FRowDataNode.AppendChild(ARecordNode);
|
FRowDataNode.AppendChild(ARecordNode);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.GotoNextRecord;
|
procedure TXMLDatapacketReader.GotoNextRecord;
|
||||||
begin
|
begin
|
||||||
FRecordNode := FRecordNode.NextSibling;
|
FRecordNode := FRecordNode.NextSibling;
|
||||||
while assigned(FRecordNode) and (FRecordNode.CompareName('ROW')<>0) do
|
while assigned(FRecordNode) and (FRecordNode.CompareName('ROW')<>0) do
|
||||||
FRecordNode := FRecordNode.NextSibling;
|
FRecordNode := FRecordNode.NextSibling;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TXMLBufDatasetReader.GotoElement(const AnElement: pointer);
|
procedure TXMLDatapacketReader.GotoElement(const AnElement: pointer);
|
||||||
begin
|
begin
|
||||||
FRecordNode:=TDomNode(AnElement);
|
FRecordNode:=TDomNode(AnElement);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TFpcBinaryDatapacketReader }
|
||||||
|
|
||||||
|
const FpcBinaryIdent = 'BinBufDataset';
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.LoadFieldDefs(AFieldDefs: TFieldDefs);
|
||||||
|
|
||||||
|
var s : string;
|
||||||
|
FldCount : word;
|
||||||
|
i : integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
setlength(s,sizeof(FpcBinaryIdent));
|
||||||
|
Stream.Read(s[1],length(FpcBinaryIdent));
|
||||||
|
if s <> FpcBinaryIdent then
|
||||||
|
DatabaseError('Not a TFpdBinaryBufDatasetReader file:' + s);
|
||||||
|
|
||||||
|
FldCount:=Stream.ReadWord;
|
||||||
|
for i := 0 to FldCount -1 do with TFieldDef.create(AFieldDefs) do
|
||||||
|
begin
|
||||||
|
Name := Stream.ReadAnsiString;
|
||||||
|
Displayname := Stream.ReadAnsiString;
|
||||||
|
Size := Stream.ReadWord;
|
||||||
|
DataType := TFieldType(Stream.ReadWord);
|
||||||
|
|
||||||
|
if Stream.ReadByte = 1 then
|
||||||
|
Attributes := Attributes + [faReadonly];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs);
|
||||||
|
var i : integer;
|
||||||
|
begin
|
||||||
|
Stream.Write(FpcBinaryIdent[1],length(FpcBinaryIdent));
|
||||||
|
|
||||||
|
Stream.WriteWord(AFieldDefs.Count);
|
||||||
|
for i := 0 to AFieldDefs.Count -1 do with AFieldDefs[i] do
|
||||||
|
begin
|
||||||
|
Stream.WriteAnsiString(Name);
|
||||||
|
Stream.WriteAnsiString(DisplayName);
|
||||||
|
Stream.WriteWord(size);
|
||||||
|
Stream.WriteWord(ord(DataType));
|
||||||
|
|
||||||
|
if faReadonly in Attributes then
|
||||||
|
Stream.WriteByte(1)
|
||||||
|
else
|
||||||
|
Stream.WriteByte(0);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.GetRecordUpdState(var AIsUpdate,
|
||||||
|
AAddRecordBuffer, AIsFirstEntry: boolean);
|
||||||
|
begin
|
||||||
|
AIsUpdate:=False;
|
||||||
|
AAddRecordBuffer:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.EndStoreRecord(
|
||||||
|
const AChangeLog: TChangeLogEntryArr);
|
||||||
|
begin
|
||||||
|
// inherited EndStoreRecord(AChangeLog);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFpcBinaryDatapacketReader.GetCurrentRecord: boolean;
|
||||||
|
var Buf : byte;
|
||||||
|
begin
|
||||||
|
Result := (Stream.Read(Buf,1)=1) and (Buf=$fe);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.GotoNextRecord;
|
||||||
|
begin
|
||||||
|
// Do Nothing
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.GotoElement(const AnElement: pointer);
|
||||||
|
begin
|
||||||
|
// inherited GotoElement(AnElement);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.InitLoadRecords(
|
||||||
|
var AChangeLog: TChangeLogEntryArr);
|
||||||
|
begin
|
||||||
|
SetLength(AChangeLog,0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFpcBinaryDatapacketReader.GetCurrentElement: pointer;
|
||||||
|
begin
|
||||||
|
// Result:=inherited GetCurrentElement;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.RestoreRecord(ADataset: TBufDataset);
|
||||||
|
begin
|
||||||
|
Stream.ReadBuffer(ADataset.GetCurrentBuffer^,ADataset.FRecordSize);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TFpcBinaryDatapacketReader.StoreRecord(ADataset: TBufDataset;
|
||||||
|
RowState: TRowState);
|
||||||
|
begin
|
||||||
|
// Ugly because private members of ADataset are used...
|
||||||
|
Stream.WriteByte($fe);
|
||||||
|
Stream.WriteBuffer(ADataset.GetCurrentBuffer^,ADataset.FRecordSize);
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user