Browse Source

fcl-db: csvdataset: take into account Delimiter when saving, open file with fmCreate when saving + tests; bug #33432

git-svn-id: trunk@39009 -
lacak 7 years ago
parent
commit
77dc0597e9
2 changed files with 59 additions and 23 deletions
  1. 3 2
      packages/fcl-db/src/base/csvdataset.pp
  2. 56 21
      packages/fcl-db/tests/tccsvdataset.pp

+ 3 - 2
packages/fcl-db/src/base/csvdataset.pp

@@ -217,6 +217,7 @@ Var
 
 
 begin
 begin
   FBuilder:=TCSVBuilder.Create;
   FBuilder:=TCSVBuilder.Create;
+  FBuilder.Assign(FOptions);
   FBuilder.SetOutput(Stream);
   FBuilder.SetOutput(Stream);
   if FOptions.FirstLineAsFieldNames then
   if FOptions.FirstLineAsFieldNames then
     begin
     begin
@@ -375,7 +376,7 @@ Var
 begin
 begin
   First;
   First;
   MergeChangeLog;
   MergeChangeLog;
-  P:=TCSVDataPacketReader.Create(Self,AStream,FCSVOPtions);
+  P:=TCSVDataPacketReader.Create(Self,AStream,FCSVOptions);
   try
   try
     GetDatasetPacket(P);
     GetDatasetPacket(P);
   finally
   finally
@@ -388,7 +389,7 @@ Var
   F : TFileStream;
   F : TFileStream;
 
 
 begin
 begin
-  F:=TFileStream.Create(AFileName,fmOpenRead or fmShareDenyWrite);
+  F:=TFileStream.Create(AFileName, fmCreate);
   try
   try
     SaveToCSVStream(F);
     SaveToCSVStream(F);
   finally
   finally

+ 56 - 21
packages/fcl-db/tests/tccsvdataset.pp

@@ -32,12 +32,14 @@ type
     Procedure TestLoad2fieldsFirstLineAsNames;
     Procedure TestLoad2fieldsFirstLineAsNames;
     Procedure TestLoad2fields;
     Procedure TestLoad2fields;
     Procedure TestLoad2Records2fields;
     Procedure TestLoad2Records2fields;
+    Procedure TestLoad2Records2fieldsTabDelim;
     Procedure TestSaveEmptyDefault;
     Procedure TestSaveEmptyDefault;
     Procedure TestSaveEmptyFirstLineAsNames;
     Procedure TestSaveEmptyFirstLineAsNames;
     Procedure TestSaveOneRecordDefault;
     Procedure TestSaveOneRecordDefault;
     Procedure TestSaveOneRecordFirstLineAsNames;
     Procedure TestSaveOneRecordFirstLineAsNames;
     Procedure TestSaveTwoRecordsDefault;
     Procedure TestSaveTwoRecordsDefault;
     Procedure TestSaveTwoRecordsFirstLineAsNames;
     Procedure TestSaveTwoRecordsFirstLineAsNames;
+    Procedure TestSaveTwoRecordsFirstLineAsNamesTabDelim;
     Procedure TestSaveOneRecord2FieldsDefault;
     Procedure TestSaveOneRecord2FieldsDefault;
     Procedure TestSaveOneRecord2FieldsFirstLineAsNames;
     Procedure TestSaveOneRecord2FieldsFirstLineAsNames;
     Procedure TestLoadPriorFieldDefs;
     Procedure TestLoadPriorFieldDefs;
@@ -72,7 +74,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-Procedure TTestCSVDataset.LoadFromLines(Const Lines : Array of string);
+procedure TTestCSVDataset.LoadFromLines(const Lines: array of string);
 
 
 Var
 Var
   L : TStringList;
   L : TStringList;
@@ -90,7 +92,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-Procedure TTestCSVDataset.SaveToLines(Const Lines: TStrings);
+procedure TTestCSVDataset.SaveToLines(const Lines: TStrings);
 
 
 Var
 Var
   S : TStringStream;
   S : TStringStream;
@@ -110,7 +112,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-Procedure TTestCSVDataset.AssertLines(Const Lines: Array of string);
+procedure TTestCSVDataset.AssertLines(const Lines: array of string);
 
 
 Var
 Var
   L : TStrings;
   L : TStrings;
@@ -127,7 +129,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadEmptyDefault;
+procedure TTestCSVDataset.TestLoadEmptyDefault;
 begin
 begin
   LoadFromLines(['a']);
   LoadFromLines(['a']);
   AssertEquals('Active',True,CSVDataset.Active);
   AssertEquals('Active',True,CSVDataset.Active);
@@ -138,7 +140,7 @@ begin
   AssertEquals('field contents','a',CSVDataset.Fields[0].AsString);
   AssertEquals('field contents','a',CSVDataset.Fields[0].AsString);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadEmptyFirstLineAsNames;
+procedure TTestCSVDataset.TestLoadEmptyFirstLineAsNames;
 
 
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
@@ -151,7 +153,7 @@ begin
   AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
   AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoad2fieldsFirstLineAsNames;
+procedure TTestCSVDataset.TestLoad2fieldsFirstLineAsNames;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
@@ -165,7 +167,7 @@ begin
   AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
   AssertEquals('Empty',True,CSVDataset.EOF and CSVDataset.BOF);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoad2fields;
+procedure TTestCSVDataset.TestLoad2fields;
 
 
 begin
 begin
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
@@ -182,7 +184,7 @@ begin
   AssertEquals('field 1 contents','b',CSVDataset.Fields[1].AsString);
   AssertEquals('field 1 contents','b',CSVDataset.Fields[1].AsString);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoad2Records2fields;
+procedure TTestCSVDataset.TestLoad2Records2fields;
 begin
 begin
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
   CSVDataset.CSVOptions.DefaultFieldLength:=128;
   LoadFromLines(['a,b','c,d']);
   LoadFromLines(['a,b','c,d']);
@@ -204,14 +206,35 @@ begin
   AssertEquals('At EOF',True,CSVDataset.EOF);
   AssertEquals('At EOF',True,CSVDataset.EOF);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveEmptyDefault;
+procedure TTestCSVDataset.TestLoad2Records2fieldsTabDelim;
+begin
+  CSVDataset.CSVOptions.Delimiter:=#9;
+  CSVDataset.CSVOptions.DefaultFieldLength:=10;
+  CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
+  LoadFromLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
+  AssertEquals('Active',True,CSVDataset.Active);
+  AssertEquals('field count',2,CSVDataset.FieldDefs.Count);
+  AssertEquals('field 0 name','f_a',CSVDataset.FieldDefs[0].Name);
+  AssertEquals('field 0 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[0].Size);
+  AssertEquals('field 1 name','f_b',CSVDataset.FieldDefs[1].Name);
+  AssertEquals('field 1 size',CSVDataset.CSVOptions.DefaultFieldLength,CSVDataset.FieldDefs[1].Size);
+  AssertEquals('field 0 contents','a1',CSVDataset.Fields[0].AsString);
+  AssertEquals('field 1 contents','b1',CSVDataset.Fields[1].AsString);
+  CSVDataset.Next;
+  AssertEquals('field 0 contents','a2',CSVDataset.Fields[0].AsString);
+  AssertEquals('field 1 contents','b2',CSVDataset.Fields[1].AsString);
+  CSVDataset.Next;
+  AssertEquals('At EOF',True,CSVDataset.EOF);
+end;
+
+procedure TTestCSVDataset.TestSaveEmptyDefault;
 begin
 begin
   CSVDataset.FieldDefs.Add('a',ftString);
   CSVDataset.FieldDefs.Add('a',ftString);
   CSVDataset.CreateDataset;
   CSVDataset.CreateDataset;
   AssertLines([]);
   AssertLines([]);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveEmptyFirstLineAsNames;
+procedure TTestCSVDataset.TestSaveEmptyFirstLineAsNames;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString);
   CSVDataset.FieldDefs.Add('a',ftString);
@@ -219,7 +242,7 @@ begin
   AssertLines(['a']);
   AssertLines(['a']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveOneRecordDefault;
+procedure TTestCSVDataset.TestSaveOneRecordDefault;
 begin
 begin
 //  CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
 //  CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
@@ -230,7 +253,7 @@ begin
   AssertLines(['b']);
   AssertLines(['b']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveOneRecordFirstLineAsNames;
+procedure TTestCSVDataset.TestSaveOneRecordFirstLineAsNames;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
@@ -241,7 +264,7 @@ begin
   AssertLines(['a','b']);
   AssertLines(['a','b']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveTwoRecordsDefault;
+procedure TTestCSVDataset.TestSaveTwoRecordsDefault;
 begin
 begin
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.CreateDataset;
   CSVDataset.CreateDataset;
@@ -254,7 +277,7 @@ begin
   AssertLines(['b','c']);
   AssertLines(['b','c']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNames;
+procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNames;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
@@ -268,7 +291,19 @@ begin
   AssertLines(['a','b','c']);
   AssertLines(['a','b','c']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveOneRecord2FieldsDefault;
+procedure TTestCSVDataset.TestSaveTwoRecordsFirstLineAsNamesTabDelim;
+begin
+  CSVDataset.CSVOptions.Delimiter:=#9;
+  CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
+  CSVDataset.FieldDefs.Add('f_a',ftString,2);
+  CSVDataset.FieldDefs.Add('f_b',ftString,2);
+  CSVDataset.CreateDataset;
+  CSVDataset.InsertRecord(['a2','b2']);
+  CSVDataset.InsertRecord(['a1','b1']);
+  AssertLines(['f_a'#9'f_b','a1'#9'b1','a2'#9'b2']);
+end;
+
+procedure TTestCSVDataset.TestSaveOneRecord2FieldsDefault;
 begin
 begin
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('b',ftString,20);
   CSVDataset.FieldDefs.Add('b',ftString,20);
@@ -280,7 +315,7 @@ begin
   AssertLines(['c,d']);
   AssertLines(['c,d']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestSaveOneRecord2FieldsFirstLineAsNames;
+procedure TTestCSVDataset.TestSaveOneRecord2FieldsFirstLineAsNames;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
@@ -293,7 +328,7 @@ begin
   AssertLines(['a,b','c,d']);
   AssertLines(['a,b','c,d']);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadPriorFieldDefs;
+procedure TTestCSVDataset.TestLoadPriorFieldDefs;
 begin
 begin
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.CSVOptions.FirstLineAsFieldNames:=True;
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
@@ -310,7 +345,7 @@ begin
   AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
   AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNames;
+procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNames;
 begin
 begin
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('a',ftString,20);
   CSVDataset.FieldDefs.Add('b',ftInteger,4);
   CSVDataset.FieldDefs.Add('b',ftInteger,4);
@@ -326,7 +361,7 @@ begin
   AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
   AssertEquals('field 1 contents',2,CSVDataset.Fields[1].AsInteger);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNamesWrongCount;
+procedure TTestCSVDataset.TestLoadPriorFieldDefsNoFieldNamesWrongCount;
 
 
 Var
 Var
   OK : Boolean;
   OK : Boolean;
@@ -343,7 +378,7 @@ begin
     Fail('Expected exception, but none raised');
     Fail('Expected exception, but none raised');
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongCount;
+procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongCount;
 
 
 const
 const
   EM = 'DS : CSV File Field count (1) does not match dataset field count (2).';
   EM = 'DS : CSV File Field count (1) does not match dataset field count (2).';
@@ -365,7 +400,7 @@ begin
     Fail(OK);
     Fail(OK);
 end;
 end;
 
 
-Procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongNames;
+procedure TTestCSVDataset.TestLoadPriorFieldDefsFieldNamesWrongNames;
 const
 const
   EM = 'DS : CSV File field 1: name "c" does not match dataset field name "b".';
   EM = 'DS : CSV File field 1: name "c" does not match dataset field name "b".';
 Var
 Var