Forum > Database
Is TCSVDataSet fixed?
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