Bladeren bron

* Merging revisions 43648 from trunk:
------------------------------------------------------------------------
r43648 | michael | 2019-12-05 17:16:08 +0100 (Thu, 05 Dec 2019) | 1 line

* Make sure open/close use same options in CSV close/open writing
------------------------------------------------------------------------

git-svn-id: branches/fixes_3_2@43649 -

michael 5 jaren geleden
bovenliggende
commit
f96857ba2c

+ 8 - 2
packages/fcl-db/src/base/bufdataset.pas

@@ -567,6 +567,7 @@ type
     class function DefaultReadFileFormat : TDataPacketFormat; virtual;
     class function DefaultWriteFileFormat : TDataPacketFormat; virtual;
     class function DefaultPacketClass : TDataPacketReaderClass ; virtual;
+    function CreateDefaultPacketReader(aStream : TStream): TDataPacketReader ; virtual;
     procedure SetPacketRecords(aValue : integer); virtual;
     procedure SetRecNo(Value: Longint); override;
     function  GetRecNo: Longint; override;
@@ -2268,6 +2269,11 @@ begin
   Result:=TFpcBinaryDatapacketReader;
 end;
 
+function TCustomBufDataset.CreateDefaultPacketReader(aStream : TStream): TDataPacketReader;
+begin
+  Result:=DefaultPacketClass.Create(Self,aStream);
+end;
+
 
 procedure TCustomBufDataset.SetIndexFieldNames(const AValue: String);
 
@@ -3075,7 +3081,7 @@ begin
   if (Fmt=dfDefault) then
     fmt:=DefaultReadFileFormat;
   if fmt=dfDefault then
-    APacketReader := DefaultPacketClass.Create(Self, AStream)
+    APacketReader := CreateDefaultPacketReader(AStream)
   else if GetRegisterDatapacketReader(AStream, fmt, APacketReaderReg) then
     APacketReader := APacketReaderReg.ReaderClass.Create(Self, AStream)
   else if TFpcBinaryDatapacketReader.RecognizeStream(AStream) then
@@ -3456,7 +3462,7 @@ begin
   if Fmt=dfDefault then
     fmt:=DefaultWriteFileFormat;
   if fmt=dfDefault then
-    APacketWriter := DefaultPacketClass.Create(Self, AStream)
+    APacketWriter := CreateDefaultPacketReader(AStream)
   else if GetRegisterDatapacketReader(Nil,fmt,APacketReaderReg) then
     APacketWriter := APacketReaderReg.ReaderClass.Create(Self, AStream)
   else if fmt = dfBinary then

+ 9 - 1
packages/fcl-db/src/base/csvdataset.pp

@@ -98,6 +98,7 @@ Type
     class function DefaultReadFileFormat : TDataPacketFormat; override;
     class function DefaultWriteFileFormat : TDataPacketFormat; override;
     class function DefaultPacketClass : TDataPacketReaderClass ; override;
+    function CreateDefaultPacketReader(aStream : TStream): TDataPacketReader ; override;
     function GetPacketReader(const Format: TDataPacketFormat; const AStream: TStream): TDataPacketReader; override;
     procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); override;
     procedure InternalInitFieldDefs; override;
@@ -323,11 +324,16 @@ begin
   Result:=TCSVDataPacketReader;
 end;
 
+function TCustomCSVDataset.CreateDefaultPacketReader(aStream: TStream): TDataPacketReader;
+begin
+  Result:=TCSVDataPacketReader.Create(Self,AStream,FCSVOptions)
+end;
+
 function TCustomCSVDataset.GetPacketReader(const Format: TDataPacketFormat;
   const AStream: TStream): TDataPacketReader;
 begin
   If (Format in [dfAny,dfDefault]) then
-    Result:=TCSVDataPacketReader.Create(Self,AStream,FCSVOptions)
+    Result:=CreateDefaultPacketReader(AStream)
   else
     Result:=Inherited GetPacketReader(Format,AStream);
 end;
@@ -351,6 +357,8 @@ end;
 
 destructor TCustomCSVDataset.Destroy;
 begin
+  // We must close here, before freeing the options.
+  Active:=False;
   FreeAndNil(FCSVOptions);
   inherited Destroy;
 end;

+ 31 - 7
packages/fcl-db/tests/tccsvdataset.pp

@@ -15,7 +15,7 @@ type
   private
     FCSVDataset: TCSVDataset;
     // Load CSVDataset from CSV stream containing lines
-    procedure DoOpenClose;
+    procedure DoOpenClose(FieldNames: Boolean);
     Procedure LoadFromLines(Const Lines: Array of string);
     // Save CSVDataset to CSV stream, transform to lines
     Procedure SaveToLines(Const Lines: TStrings);
@@ -48,7 +48,8 @@ type
     Procedure TestLoadPriorFieldDefsNoFieldNamesWrongCount;
     Procedure TestLoadPriorFieldDefsFieldNamesWrongCount;
     Procedure TestLoadPriorFieldDefsFieldNamesWrongNames;
-    Procedure TestOpenCloseCycle;
+    Procedure TestOpenCloseCycle1;
+    Procedure TestOpenCloseCycle2;
   end;
 
 implementation
@@ -426,13 +427,13 @@ end;
 const
   FILENAME = 'test.dat';
 
-procedure TTestCSVDataset.DoOpenClose;
+procedure TTestCSVDataset.DoOpenClose(FieldNames : Boolean);
 
 begin
   CSVDataset.FileName := FILENAME;
   With CSVDataset do
      begin
-     CSVOptions.FirstLineAsFieldNames := True;
+     CSVOptions.FirstLineAsFieldNames := FieldNames;
      CSVOptions.DefaultFieldLength := 255;
      CSVOptions.Delimiter := ',';
      CSVOptions.QuoteChar := '"';
@@ -482,22 +483,24 @@ begin
       FieldbyName('Birthdate').AsDateTime := EncodeDate(1982, 12, 17);
       Post;
       end;
+  // Would be 4 if first line misinterpreted
+  AssertEquals('RecordCount',3,CSVDataset.RecordCount);
   // This will write the file;
   CSVDataset.Close;
 end;
 
-procedure TTestCSVDataset.TestOpenCloseCycle;
+procedure TTestCSVDataset.TestOpenCloseCycle1;
 begin
   if FileExists(FileName) then
     AssertTrue('Delete before',DeleteFile(FileName));
   try
     // This will create the file
-    DoOpenClose;
+    DoOpenClose(True);
     // Recreate to be sure
     FreeAndNil(FCSVDataset);
     FCSVDataset:=TCSVDataset.Create(Nil);
     FCSVDataset.Name:='DS';
-    DoOpenClose;
+    DoOpenClose(True);
   except
     On E : Exception do
       Fail('Failed using exception %s : %s',[E.ClassName,E.Message]);
@@ -506,6 +509,27 @@ begin
     AssertTrue('Delete after',DeleteFile(FileName));
 end;
 
+procedure TTestCSVDataset.TestOpenCloseCycle2;
+begin
+  if FileExists(FileName) then
+    AssertTrue('Delete before',DeleteFile(FileName));
+  try
+    // This will create the file
+    DoOpenClose(False);
+    // Recreate to be sure
+    FreeAndNil(FCSVDataset);
+    FCSVDataset:=TCSVDataset.Create(Nil);
+    FCSVDataset.Name:='DS';
+    DoOpenClose(False);
+  except
+    On E : Exception do
+      Fail('Failed using exception %s : %s',[E.ClassName,E.Message]);
+  end;
+  if FileExists(FileName) then
+    AssertTrue('Delete after',DeleteFile(FileName));
+end;
+
+
 procedure TTestCSVDataset.SetUp;
 begin
   FCSVDataset:=TCSVDataset.Create(Nil);