Forum > Database

Is TCSVDataSet fixed?

<< < (2/4) > >>

egsuh:

--- Quote ---Would you please provide a simple, self contained example that shows this leak and report it?
--- End quote ---

Please unzip the attached project, and run it. Following codes are all.


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure TForm1.Button1Click(Sender: TObject);var   AStream: TStream;begin   od1.filter := 'CSV files|*.csv';   if od1.execute then begin      CSVDataSet1.CSVOptions.FirstLineAsFieldNames:= True;      CSVDataSet1.LoadFromCSVFile(od1.filename);      CSVDataSEt1.Open;       AStream:= TMemoryStream.Create;      CSVDataSet1.SaveToCSVStream(AStream);      // CSVDataSet1.SaveToStream(AStream); // this works fine, but following file is not readable.       AStream.Position := 0;      (AStream as TMemoryStream).SaveToFile(ChangeFileExt(od1.filename, '_2.csv'));      AStream.Free;      ShowMessage('Done');   end;end; 

wp:
Here is a simpler version of the test project. It confirms that there is a memory leak. It seems to be in the line with TCSVDataset.SaveToCSVFile - when this is removed the memory leak is gone.

Please file a bug report in the FPC bug tracker and add my test program (along with a simple data file).


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program csvdataset_memleak; uses  db, csvdataset; var  dataset: TCSVDataset;begin  dataset := TCSVDataset.Create(nil);  try    dataset.CSVOptions.FirstLineAsFieldNames:= True;    dataset.LoadFromCSVFile('test.csv');    dataset.SaveToCSVFile('test-2.csv');    WriteLn('done');  finally    dataset.Free;  end;end.

Thaddy:
It seems that the underlying auto-created stream (for SaveToFile) in TCSVDataPacketReader is not free'd.

wp:

--- Quote from: Thaddy on March 01, 2022, 12:19:26 pm ---It seems that the underlying auto-created stream (for SaveToFile) in TCSVDataPacketReader is not free'd.

--- End quote ---
No. It is the internal TCSVBuilder created by TCSVDataPacketReader.StoreFieldDefs. Adding it to TCSVDatapackageReader.Destroy fixes the memory leak:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---destructor TCSVDataPacketReader.Destroy;begin  FreeAndNil(FBuilder);  FreeAndNil(FCreateFieldDefs);  If FOwnsOptions then    FreeAndNil(FOPtions);  FreeAndNil(Fline);  FreeAndNil(FParser);  inherited Destroy;end;
I'll submit this as a patch.

[EDIT]
Done: https://gitlab.com/freepascal.org/fpc/source/-/issues/39607

PascalDragon:

--- Quote from: wp on March 01, 2022, 12:42:01 pm ---Done: https://gitlab.com/freepascal.org/fpc/source/-/issues/39607

--- End quote ---

Thank you.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version