Merge pull request #60663 from hxbb00/fix-csv-file-not-release-after-close-ds-dialog

fix: Data Source Manager doesn't release CSV file after closing dialog
This commit is contained in:
Julien Cabieces 2025-02-20 08:55:45 +01:00 committed by GitHub
commit 31c4399650
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 27 additions and 27 deletions

View File

@ -37,7 +37,6 @@ const int MAX_SAMPLE_LENGTH = 200;
QgsDelimitedTextSourceSelect::QgsDelimitedTextSourceSelect( QWidget *parent, Qt::WindowFlags fl, QgsProviderRegistry::WidgetMode theWidgetMode )
: QgsAbstractDataSourceWidget( parent, fl, theWidgetMode )
, mFile( std::make_unique<QgsDelimitedTextFile>() )
, mSettingsKey( QStringLiteral( "/Plugin-DelimitedText" ) )
{
setupUi( this );
@ -137,7 +136,8 @@ void QgsDelimitedTextSourceSelect::addButtonClicked()
return;
}
}
if ( !mFile->isValid() )
QgsDelimitedTextFile mFile;
if ( !loadDelimitedFileDefinition( mFile ) )
{
QMessageBox::warning( this, tr( "Invalid delimited text file" ), tr( "Please enter a valid file and delimiter" ) );
return;
@ -146,7 +146,7 @@ void QgsDelimitedTextSourceSelect::addButtonClicked()
cancelScanTask();
//Build the delimited text URI from the user provided information
const QString datasourceUrl { url() };
const QString datasourceUrl { url( mFile ) };
// store the settings
saveSettings();
@ -341,28 +341,28 @@ void QgsDelimitedTextSourceSelect::saveSettingsForFile( const QString &filename
}
bool QgsDelimitedTextSourceSelect::loadDelimitedFileDefinition()
bool QgsDelimitedTextSourceSelect::loadDelimitedFileDefinition( QgsDelimitedTextFile &file )
{
mFile->setFileName( mFileWidget->filePath() );
mFile->setEncoding( cmbEncoding->currentText() );
file.setFileName( mFileWidget->filePath() );
file.setEncoding( cmbEncoding->currentText() );
if ( delimiterChars->isChecked() )
{
mFile->setTypeCSV( selectedChars(), txtQuoteChars->text(), txtEscapeChars->text() );
file.setTypeCSV( selectedChars(), txtQuoteChars->text(), txtEscapeChars->text() );
}
else if ( delimiterRegexp->isChecked() )
{
mFile->setTypeRegexp( txtDelimiterRegexp->text() );
file.setTypeRegexp( txtDelimiterRegexp->text() );
}
else
{
mFile->setTypeCSV();
file.setTypeCSV();
}
mFile->setSkipLines( rowCounter->value() );
mFile->setUseHeader( cbxUseHeader->isChecked() );
mFile->setDiscardEmptyFields( cbxSkipEmptyFields->isChecked() );
mFile->setTrimFields( cbxTrimFields->isChecked() );
mFile->setMaxFields( mMaxFields );
return mFile->isValid();
file.setSkipLines( rowCounter->value() );
file.setUseHeader( cbxUseHeader->isChecked() );
file.setDiscardEmptyFields( cbxSkipEmptyFields->isChecked() );
file.setTrimFields( cbxTrimFields->isChecked() );
file.setMaxFields( mMaxFields );
return file.isValid();
}
@ -395,8 +395,8 @@ void QgsDelimitedTextSourceSelect::updateFieldLists()
tblSample->clear();
tblSample->setColumnCount( 0 );
tblSample->setRowCount( 0 );
if ( !loadDelimitedFileDefinition() )
QgsDelimitedTextFile mFile;
if ( !loadDelimitedFileDefinition( mFile ) )
return;
// Put a sample set of records into the sample box. Also while scanning assess suitability of
@ -413,7 +413,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists()
while ( counter < mExampleRowCount )
{
const QgsDelimitedTextFile::Status status = mFile->nextRecord( values );
const QgsDelimitedTextFile::Status status = mFile.nextRecord( values );
if ( status == QgsDelimitedTextFile::RecordEOF )
break;
if ( status != QgsDelimitedTextFile::RecordOk )
@ -488,7 +488,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists()
}
QStringList fieldList = mFile->fieldNames();
QStringList fieldList = mFile.fieldNames();
if ( isEmpty.size() < fieldList.size() )
{
@ -537,7 +537,7 @@ void QgsDelimitedTextSourceSelect::updateFieldLists()
// Run the scan in a separate thread
cancelScanTask();
mScanTask = new QgsDelimitedTextFileScanTask( url( /* skip overridden types */ true ) );
mScanTask = new QgsDelimitedTextFileScanTask( url( mFile, /* skip overridden types */ true ) );
mCancelButton->show();
connect( mScanTask, &QgsDelimitedTextFileScanTask::scanCompleted, this, [=]( const QgsFields &fields ) {
updateFieldTypes( fields );
@ -745,6 +745,7 @@ bool QgsDelimitedTextSourceSelect::validate()
message = tr( "At least one delimiter character must be specified" );
}
QgsDelimitedTextFile mFile;
if ( message.isEmpty() && delimiterRegexp->isChecked() )
{
const QRegularExpression re( txtDelimiterRegexp->text() );
@ -763,7 +764,7 @@ bool QgsDelimitedTextSourceSelect::validate()
// continue...
}
// Hopefully won't hit this none-specific message, but just in case ...
else if ( !mFile->isValid() )
else if ( !loadDelimitedFileDefinition( mFile ) )
{
message = tr( "Definition of filename and delimiters is not valid" );
}
@ -860,9 +861,9 @@ void QgsDelimitedTextSourceSelect::updateCrsWidgetVisibility()
textLabelCrs->setVisible( !geomTypeNone->isChecked() );
}
QString QgsDelimitedTextSourceSelect::url( bool skipOverriddenTypes )
QString QgsDelimitedTextSourceSelect::url( QgsDelimitedTextFile &file, bool skipOverriddenTypes )
{
QUrl url = mFile->url();
QUrl url = file.url();
QUrlQuery query( url );
query.addQueryItem( QStringLiteral( "detectTypes" ), cbxDetectTypes->isChecked() ? QStringLiteral( "yes" ) : QStringLiteral( "no" ) );
@ -968,7 +969,7 @@ void QgsDelimitedTextSourceSelect::cancelScanTask()
if ( mScanTask )
{
mScanTask->cancel();
mScanTask = nullptr;
mScanTask.clear();
}
}

View File

@ -91,7 +91,7 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private
QgsDelimitedTextSourceSelect( QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags, QgsProviderRegistry::WidgetMode widgetMode = QgsProviderRegistry::WidgetMode::Standalone );
private:
bool loadDelimitedFileDefinition();
bool loadDelimitedFileDefinition( QgsDelimitedTextFile &file );
void updateFieldLists();
QString selectedChars();
void setSelectedChars( const QString &delimiters );
@ -102,7 +102,6 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private
bool trySetXYField( QStringList &fields, QList<bool> &isValidNumber, const QString &xname, const QString &yname );
private:
std::unique_ptr<QgsDelimitedTextFile> mFile;
int mExampleRowCount = 20;
int mBadRowCount = 0;
QgsFields mFields; //!< Stores the fields as returned by the provider to determine if their types were overridden
@ -116,7 +115,7 @@ class QgsDelimitedTextSourceSelect : public QgsAbstractDataSourceWidget, private
QButtonGroup *bgGeomType = nullptr;
void showHelp();
void updateCrsWidgetVisibility();
QString url( bool skipOverriddenTypes = false );
QString url( QgsDelimitedTextFile &file, bool skipOverriddenTypes = false );
public slots:
void addButtonClicked() override;