Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An error message is displayed when an auxiliary layer cannot be created (3.16 backport) #43773

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions src/core/qgsauxiliarystorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ QgsAuxiliaryLayer *QgsAuxiliaryStorage::createAuxiliaryLayer( const QgsField &fi

if ( !tableExists( table, database.get() ) )
{
if ( !createTable( field.typeName(), table, database.get() ) )
if ( !createTable( field.typeName(), table, database.get(), mErrorString ) )
{
return alayer;
}
Expand Down Expand Up @@ -702,25 +702,24 @@ bool QgsAuxiliaryStorage::exec( const QString &sql, sqlite3 *handler )
return rc;
}

void QgsAuxiliaryStorage::debugMsg( const QString &sql, sqlite3 *handler )
QString QgsAuxiliaryStorage::debugMsg( const QString &sql, sqlite3 *handler )
{
#ifdef QGISDEBUG
const QString err = QString::fromUtf8( sqlite3_errmsg( handler ) );
const QString msg = QObject::tr( "Unable to execute" );
const QString errMsg = QObject::tr( "%1 '%2': %3" ).arg( msg, sql, err );
QgsDebugMsg( errMsg );
#else
Q_UNUSED( sql )
Q_UNUSED( handler )
#endif
return errMsg;
}

bool QgsAuxiliaryStorage::createTable( const QString &type, const QString &table, sqlite3 *handler )
bool QgsAuxiliaryStorage::createTable( const QString &type, const QString &table, sqlite3 *handler, QString &errorMsg )
{
const QString sql = QStringLiteral( "CREATE TABLE IF NOT EXISTS '%1' ( '%2' %3 )" ).arg( table, AS_JOINFIELD, type );

if ( !exec( sql, handler ) )
{
errorMsg = QgsAuxiliaryStorage::debugMsg( sql, handler );
return false;
}

return true;
}
Expand Down
6 changes: 3 additions & 3 deletions src/core/qgsauxiliarystorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -413,18 +413,18 @@ class CORE_EXPORT QgsAuxiliaryStorage
static spatialite_database_unique_ptr createDB( const QString &filename );
static spatialite_database_unique_ptr openDB( const QString &filename );
static bool tableExists( const QString &table, sqlite3 *handler );
static bool createTable( const QString &type, const QString &table, sqlite3 *handler );
static bool createTable( const QString &type, const QString &table, sqlite3 *handler, QString &errorMsg );

static bool exec( const QString &sql, sqlite3 *handler );
static void debugMsg( const QString &sql, sqlite3 *handler );
static QString debugMsg( const QString &sql, sqlite3 *handler );

static QgsDataSourceUri parseOgrUri( const QgsDataSourceUri &uri );

bool mValid = false;
QString mFileName; // original filename
QString mTmpFileName; // temporary filename used in copy mode
bool mCopy = false;
QString mErrorString;
mutable QString mErrorString;
};

#endif
7 changes: 7 additions & 0 deletions src/gui/qgsnewauxiliarylayerdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ void QgsNewAuxiliaryLayerDialog::accept()
mLayer->setAuxiliaryLayer( alayer );
}
}
else
{
QDialog::close();
const QString errMsg = QgsProject::instance()->auxiliaryStorage()->errorString();
QMessageBox::critical( this, tr( "New Auxiliary Layer" ), errMsg );
return;
}

QDialog::accept();
}
22 changes: 22 additions & 0 deletions tests/src/python/test_qgsauxiliarystorage.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
QgsPalLayerSettings,
QgsSymbolLayer,
QgsVectorLayerSimpleLabeling,
QgsField,
NULL)
from qgis.testing import start_app, unittest
from utilities import unitTestDataPath, writeShape
Expand Down Expand Up @@ -477,6 +478,27 @@ def testQgdCreation(self):
qgd = newpath + '.qgd'
self.assertTrue(os.path.exists(qgd))

def testInvalidPrimaryKey(self):
# create layer
vl = QgsVectorLayer(
'Point?crs=epsg:4326&field=pk:integer&key=pk',
'test', 'memory')
assert (vl.isValid())

# add a field with an invalid typename
field = QgsField(name="invalid_pk", type=QVariant.Int, typeName="xsd:int")
vl.startEditing()
vl.addAttribute(field)
vl.commitChanges()

# create auxiliary storage based on the invalid field
s = QgsAuxiliaryStorage()
pkf = vl.fields().field(vl.fields().indexOf('invalid_pk'))
al = s.createAuxiliaryLayer(pkf, vl)

self.assertEqual(al, None)
self.assertTrue("CREATE TABLE IF NOT EXISTS" in s.errorString())


if __name__ == '__main__':
unittest.main()