From 7842e9f823d61fb360ddea61e9fda6d1b274b62f Mon Sep 17 00:00:00 2001 From: lacak Date: Tue, 24 Sep 2013 07:07:05 +0000 Subject: [PATCH] fcl-db: datapacketreader: change of interface methods. Pass reference to TCustomBufDataset only once in constructor of TDatapacketReader, so instance of datapacketreader will know about BufDataset for which it was created and there is no need to pass this reference on "every" call to methods of TDataPacketReader. It brings simplicity and more flexibility IMHO. DO NOT BACKPORT THIS TO 2.6.3 git-svn-id: trunk@25542 - --- packages/fcl-db/src/base/bufdataset.pas | 85 ++++++++++--------- .../fcl-db/src/base/xmldatapacketreader.pp | 28 +++--- 2 files changed, 58 insertions(+), 55 deletions(-) diff --git a/packages/fcl-db/src/base/bufdataset.pas b/packages/fcl-db/src/base/bufdataset.pas index 11bb9cbcf9..b17ad0a602 100644 --- a/packages/fcl-db/src/base/bufdataset.pas +++ b/packages/fcl-db/src/base/bufdataset.pas @@ -350,15 +350,17 @@ type TDatapacketReaderClass = class of TDatapacketReader; TDataPacketReader = class(TObject) FStream : TStream; + FDataSet: TCustomBufDataset; protected class function RowStateToByte(const ARowState : TRowState) : byte; class function ByteToRowState(const AByte : Byte) : TRowState; - class procedure RestoreBlobField(ADataset: TCustomBufDataset; AField: TField; ASource: pointer; ASize: integer); + procedure RestoreBlobField(AField: TField; ASource: pointer; ASize: integer); + property DataSet: TCustomBufDataset read FDataSet; public - constructor create(AStream : TStream); virtual; + constructor Create(ADataSet: TCustomBufDataset; AStream : TStream); virtual; // Load a dataset from stream: // Load the field definitions from a stream. - procedure LoadFieldDefs(AFieldDefs : TFieldDefs; var AnAutoIncValue : integer); virtual; abstract; + procedure LoadFieldDefs(var AnAutoIncValue : integer); virtual; abstract; // Is called before the records are loaded procedure InitLoadRecords; virtual; abstract; // Returns if there is at least one more record available in the stream @@ -366,15 +368,15 @@ type // Return the RowState of the current record, and the order of the update function GetRecordRowState(out AUpdOrder : Integer) : TRowState; virtual; abstract; // Store a record from stream in the current record buffer - procedure RestoreRecord(ADataset : TCustomBufDataset); virtual; abstract; + procedure RestoreRecord; virtual; abstract; // Move the stream to the next record procedure GotoNextRecord; virtual; abstract; // Store a dataset to stream: // Save the field definitions to a stream. - procedure StoreFieldDefs(AFieldDefs : TFieldDefs; AnAutoIncValue : integer); virtual; abstract; + procedure StoreFieldDefs(AnAutoIncValue : integer); virtual; abstract; // Save a record from the current record buffer to the stream - procedure StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0); virtual; abstract; + procedure StoreRecord(ARowState : TRowState; AUpdOrder : integer = 0); virtual; abstract; // Is called after all records are stored procedure FinalizeStoreRecords; virtual; abstract; // Checks if the provided stream is of the right format for this class @@ -417,15 +419,15 @@ type var FVersion: byte; public - constructor Create(AStream : TStream); override; - procedure LoadFieldDefs(AFieldDefs : TFieldDefs; var AnAutoIncValue : integer); override; - procedure StoreFieldDefs(AFieldDefs : TFieldDefs; AnAutoIncValue : integer); override; + constructor Create(ADataSet: TCustomBufDataset; AStream : TStream); override; + procedure LoadFieldDefs(var AnAutoIncValue : integer); override; + procedure StoreFieldDefs(AnAutoIncValue : integer); override; procedure InitLoadRecords; override; function GetCurrentRecord : boolean; override; function GetRecordRowState(out AUpdOrder : Integer) : TRowState; override; - procedure RestoreRecord(ADataset : TCustomBufDataset); override; + procedure RestoreRecord; override; procedure GotoNextRecord; override; - procedure StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0); override; + procedure StoreRecord(ARowState : TRowState; AUpdOrder : integer = 0); override; procedure FinalizeStoreRecords; override; class function RecognizeStream(AStream : TStream) : boolean; override; end; @@ -2485,11 +2487,11 @@ var APacketReader: TDataPacketReader; begin if GetRegisterDatapacketReader(AStream, format, APacketReaderReg) then - APacketReader := APacketReaderReg.ReaderClass.create(AStream) + APacketReader := APacketReaderReg.ReaderClass.Create(Self, AStream) else if TFpcBinaryDatapacketReader.RecognizeStream(AStream) then begin AStream.Seek(0, soFromBeginning); - APacketReader := TFpcBinaryDatapacketReader.create(AStream) + APacketReader := TFpcBinaryDatapacketReader.Create(Self, AStream) end else DatabaseError(SStreamNotRecognised); @@ -2761,7 +2763,7 @@ procedure TCustomBufDataset.GetDatasetPacket(AWriter: TDataPacketReader); FFilterBuffer:=AUpdBuffer.OldValuesBuffer; // OldValuesBuffer is nil if the record is either inserted or inserted and then deleted if assigned(FFilterBuffer) then - FDatasetReader.StoreRecord(Self,AThisRowState,FCurrentUpdateBuffer); + FDatasetReader.StoreRecord(AThisRowState,FCurrentUpdateBuffer); end; procedure HandleUpdateBuffersFromRecord(AFirstCall : boolean;ARecBookmark : TBufBookmark; var ARowState: TRowState); @@ -2798,7 +2800,7 @@ begin try // CheckActive; ABookMark:=@ATBookmark; - FDatasetReader.StoreFieldDefs(FieldDefs,FAutoIncValue); + FDatasetReader.StoreFieldDefs(FAutoIncValue); StoreDSState:=SetTempState(dsFilter); ScrollResult:=FCurrentIndex.ScrollFirst; @@ -2809,9 +2811,9 @@ begin HandleUpdateBuffersFromRecord(True,ABookmark^,RowState); FFilterBuffer:=FCurrentIndex.CurrentBuffer; if RowState=[] then - FDatasetReader.StoreRecord(Self,[]) + FDatasetReader.StoreRecord([]) else - FDatasetReader.StoreRecord(Self,RowState,FCurrentUpdateBuffer); + FDatasetReader.StoreRecord(RowState,FCurrentUpdateBuffer); ScrollResult:=FCurrentIndex.ScrollForward; if ScrollResult<>grOK then @@ -2850,9 +2852,9 @@ var APacketReaderReg : TDatapacketReaderRegistration; begin CheckBiDirectional; if GetRegisterDatapacketReader(Nil,format,APacketReaderReg) then - APacketWriter := APacketReaderReg.ReaderClass.create(AStream) + APacketWriter := APacketReaderReg.ReaderClass.Create(Self, AStream) else if Format = dfBinary then - APacketWriter := TFpcBinaryDatapacketReader.create(AStream) + APacketWriter := TFpcBinaryDatapacketReader.Create(Self, AStream) else DatabaseError(SNoReaderClassRegistered); try @@ -2932,7 +2934,7 @@ procedure TCustomBufDataset.IntLoadFielddefsFromFile; begin FieldDefs.Clear; - FDatasetReader.LoadFielddefs(FieldDefs, FAutoIncValue); + FDatasetReader.LoadFieldDefs(FAutoIncValue); if DefaultFields then CreateFields else @@ -2965,7 +2967,7 @@ begin FFilterBuffer:=IntAllocRecordBuffer; fillchar(FFilterBuffer^,FNullmaskSize,0); FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer := FFilterBuffer; - FDatasetReader.RestoreRecord(self); + FDatasetReader.RestoreRecord; FDatasetReader.GotoNextRecord; if not FDatasetReader.GetCurrentRecord then @@ -2980,7 +2982,7 @@ begin FIndexes[0].StoreSpareRecIntoBookmark(@FUpdateBuffer[FCurrentUpdateBuffer].BookmarkData); fillchar(FFilterBuffer^,FNullmaskSize,0); - FDatasetReader.RestoreRecord(self); + FDatasetReader.RestoreRecord; FIndexes[0].AddRecord; inc(FBRecordCount); @@ -2998,7 +3000,7 @@ begin fillchar(FFilterBuffer^,FNullmaskSize,0); FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer := FFilterBuffer; - FDatasetReader.RestoreRecord(self); + FDatasetReader.RestoreRecord; FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind:= ukDelete; FIndexes[0].StoreSpareRecIntoBookmark(@FUpdateBuffer[FCurrentUpdateBuffer].BookmarkData); @@ -3020,7 +3022,7 @@ begin FFilterBuffer:=FIndexes[0].SpareBuffer; fillchar(FFilterBuffer^,FNullmaskSize,0); - FDatasetReader.RestoreRecord(self); + FDatasetReader.RestoreRecord; if rsvInserted in ARowState then begin @@ -3496,6 +3498,7 @@ begin // inherited EndUpdate; end; + { TDataPacketReader } class function TDataPacketReader.RowStateToByte(const ARowState: TRowState @@ -3519,32 +3522,33 @@ begin if (AByte and 8)=8 then Result := Result+[rsvUpdated]; end; -class procedure TDataPacketReader.RestoreBlobField(ADataset: TCustomBufDataset; AField: TField; ASource: pointer; ASize: integer); +procedure TDataPacketReader.RestoreBlobField(AField: TField; ASource: pointer; ASize: integer); var ABufBlobField: TBufBlobField; begin - ABufBlobField.BlobBuffer:=ADataset.GetNewBlobBuffer; + ABufBlobField.BlobBuffer:=FDataSet.GetNewBlobBuffer; ABufBlobField.BlobBuffer^.Size:=ASize; ReAllocMem(ABufBlobField.BlobBuffer^.Buffer, ASize); move(ASource^, ABufBlobField.BlobBuffer^.Buffer^, ASize); AField.SetData(@ABufBlobField); end; -constructor TDataPacketReader.create(AStream: TStream); +constructor TDataPacketReader.Create(ADataSet: TCustomBufDataset; AStream: TStream); begin + FDataSet := ADataSet; FStream := AStream; end; { TFpcBinaryDatapacketReader } -constructor TFpcBinaryDatapacketReader.Create(AStream: TStream); +constructor TFpcBinaryDatapacketReader.Create(ADataSet: TCustomBufDataset; AStream: TStream); begin inherited; FVersion := 20; // default version 2.0 end; -procedure TFpcBinaryDatapacketReader.LoadFieldDefs(AFieldDefs: TFieldDefs; var AnAutoIncValue: integer); +procedure TFpcBinaryDatapacketReader.LoadFieldDefs(var AnAutoIncValue: integer); var FldCount : word; i : integer; @@ -3565,8 +3569,8 @@ begin // Read FieldDefs FldCount := Stream.ReadWord; - AFieldDefs.Clear; - for i := 0 to FldCount - 1 do with TFieldDef.Create(AFieldDefs) do + DataSet.FieldDefs.Clear; + for i := 0 to FldCount - 1 do with TFieldDef.Create(DataSet.FieldDefs) do begin Name := Stream.ReadAnsiString; Displayname := Stream.ReadAnsiString; @@ -3583,14 +3587,14 @@ begin SetLength(FNullBitmap, FNullBitmapSize); end; -procedure TFpcBinaryDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs; AnAutoIncValue: integer); +procedure TFpcBinaryDatapacketReader.StoreFieldDefs(AnAutoIncValue: integer); var i : integer; begin Stream.Write(FpcBinaryIdent2[1], length(FpcBinaryIdent2)); Stream.WriteByte(FVersion); - Stream.WriteWord(AFieldDefs.Count); - for i := 0 to AFieldDefs.Count -1 do with AFieldDefs[i] do + Stream.WriteWord(DataSet.FieldDefs.Count); + for i := 0 to DataSet.FieldDefs.Count - 1 do with DataSet.FieldDefs[i] do begin Stream.WriteAnsiString(Name); Stream.WriteAnsiString(DisplayName); @@ -3605,7 +3609,7 @@ begin i := AnAutoIncValue; Stream.WriteBuffer(i,sizeof(i)); - FNullBitmapSize := (AFieldDefs.Count + 7) div 8; + FNullBitmapSize := (DataSet.FieldDefs.Count + 7) div 8; SetLength(FNullBitmap, FNullBitmapSize); end; @@ -3636,14 +3640,14 @@ begin // Do Nothing end; -procedure TFpcBinaryDatapacketReader.RestoreRecord(ADataset: TCustomBufDataset); +procedure TFpcBinaryDatapacketReader.RestoreRecord; var AField: TField; i: integer; L: cardinal; B: TBytes; begin - with ADataset do + with DataSet do case FVersion of 10: Stream.ReadBuffer(GetCurrentBuffer^, FRecordSize); // Ugly because private members of ADataset are used... @@ -3670,7 +3674,7 @@ begin if L > 0 then Stream.ReadBuffer(B[0], L); if AField.DataType in BlobFieldTypes then - RestoreBlobField(ADataset, AField, @B[0], L) + RestoreBlobField(AField, @B[0], L) else AField.SetData(@B[0], False); // set it to the FilterBuffer end; @@ -3679,8 +3683,7 @@ begin end; end; -procedure TFpcBinaryDatapacketReader.StoreRecord(ADataset: TCustomBufDataset; - ARowState: TRowState; AUpdOrder : integer); +procedure TFpcBinaryDatapacketReader.StoreRecord(ARowState: TRowState; AUpdOrder : integer); var AField: TField; i: integer; @@ -3694,7 +3697,7 @@ begin Stream.WriteBuffer(AUpdOrder,sizeof(integer)); // Record data - with ADataset do + with DataSet do case FVersion of 10: Stream.WriteBuffer(GetCurrentBuffer^, FRecordSize); // Old 1.0 version diff --git a/packages/fcl-db/src/base/xmldatapacketreader.pp b/packages/fcl-db/src/base/xmldatapacketreader.pp index 950161cc99..698dd3e09e 100644 --- a/packages/fcl-db/src/base/xmldatapacketreader.pp +++ b/packages/fcl-db/src/base/xmldatapacketreader.pp @@ -48,14 +48,14 @@ type FLastChange : integer; public destructor destroy; override; - procedure StoreFieldDefs(AFieldDefs : TFieldDefs; AnAutoIncValue : integer); override; - procedure StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0); override; + procedure StoreFieldDefs(AnAutoIncValue : integer); override; + procedure StoreRecord(ARowState : TRowState; AUpdOrder : integer = 0); override; procedure FinalizeStoreRecords; override; - procedure LoadFieldDefs(AFieldDefs : TFieldDefs; var AnAutoIncValue : integer); override; + procedure LoadFieldDefs(var AnAutoIncValue : integer); override; procedure InitLoadRecords; override; function GetCurrentRecord : boolean; override; function GetRecordRowState(out AUpdOrder : Integer) : TRowState; override; - procedure RestoreRecord(ADataset : TCustomBufDataset); override; + procedure RestoreRecord; override; procedure GotoNextRecord; override; class function RecognizeStream(AStream : TStream) : boolean; override; end; @@ -123,7 +123,7 @@ begin inherited destroy; end; -procedure TXMLDatapacketReader.LoadFieldDefs(AFieldDefs: TFieldDefs; var AnAutoIncValue: integer); +procedure TXMLDatapacketReader.LoadFieldDefs(var AnAutoIncValue: integer); function GetNodeAttribute(const aNode : TDOMNode; AttName : String) : string; var AnAttr : TDomNode; @@ -157,7 +157,7 @@ begin AFieldNode := item[i]; if AFieldNode.CompareName('FIELD')=0 then begin - AFieldDef := TFieldDef.create(AFieldDefs); + AFieldDef := TFieldDef.Create(DataSet.FieldDefs); AFieldDef.DisplayName:=GetNodeAttribute(AFieldNode,'fieldname'); AFieldDef.Name:=GetNodeAttribute(AFieldNode,'attrname'); AFieldDef.Size:=StrToIntDef(GetNodeAttribute(AFieldNode,'width'),0); @@ -189,7 +189,7 @@ begin FRecordNode := nil; end; -procedure TXMLDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs; AnAutoIncValue: integer); +procedure TXMLDatapacketReader.StoreFieldDefs(AnAutoIncValue: integer); var i,p : integer; AFieldNode : TDOMElement; @@ -203,7 +203,7 @@ begin MetaDataNode := XMLDocument.CreateElement('METADATA'); FieldsNode := XMLDocument.CreateElement('FIELDS'); - for i := 0 to AFieldDefs.Count -1 do with AFieldDefs[i] do + for i := 0 to DataSet.FieldDefs.Count - 1 do with DataSet.FieldDefs[i] do begin AFieldNode := XMLDocument.CreateElement('FIELD'); if Name <> '' then AFieldNode.SetAttribute('fieldname',Name); @@ -335,7 +335,7 @@ begin end; end; -procedure TXMLDatapacketReader.RestoreRecord(ADataset : TCustomBufDataset); +procedure TXMLDatapacketReader.RestoreRecord; var FieldNr : integer; AFieldNode : TDomNode; ABufBlobField: TBufBlobField; @@ -343,7 +343,7 @@ var FieldNr : integer; s: string; ws: widestring; begin - with ADataset do for FieldNr:=0 to FieldDefs.Count-1 do + with DataSet do for FieldNr:=0 to FieldDefs.Count-1 do begin AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo); AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name); @@ -354,11 +354,11 @@ begin s := DecodeStringBase64(s); case FieldDefs[FieldNr].DataType of ftBlob, ftMemo: - RestoreBlobField(ADataset, AField, @s[1], length(s)); + RestoreBlobField(AField, @s[1], length(s)); ftWideMemo: begin ws := s; - RestoreBlobField(ADataset, AField, @ws[1], length(ws)*sizeof(WideChar)); + RestoreBlobField(AField, @ws[1], length(ws)*sizeof(WideChar)); end else; AField.AsString := s; // set it to the filterbuffer @@ -369,7 +369,7 @@ begin end; end; -procedure TXMLDatapacketReader.StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0); +procedure TXMLDatapacketReader.StoreRecord(ARowState : TRowState; AUpdOrder : integer = 0); var FieldNr : Integer; AFieldDef: TFieldDef; AField: TField; @@ -377,7 +377,7 @@ var FieldNr : Integer; begin inc(FEntryNr); ARecordNode := XMLDocument.CreateElement('ROW'); - with ADataset do for FieldNr := 0 to FieldDefs.Count-1 do + with DataSet do for FieldNr := 0 to FieldDefs.Count-1 do begin AFieldDef := FieldDefs[FieldNr]; AField := Fields.FieldByNumber(AFieldDef.FieldNo);