diff --git a/src/core/qgsauxiliarystorage.cpp b/src/core/qgsauxiliarystorage.cpp index 3740473c1e39..fd42cf367330 100644 --- a/src/core/qgsauxiliarystorage.cpp +++ b/src/core/qgsauxiliarystorage.cpp @@ -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; } @@ -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; } diff --git a/src/core/qgsauxiliarystorage.h b/src/core/qgsauxiliarystorage.h index c04d50f9af44..c139342adaf2 100644 --- a/src/core/qgsauxiliarystorage.h +++ b/src/core/qgsauxiliarystorage.h @@ -413,10 +413,10 @@ 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 ); @@ -424,7 +424,7 @@ class CORE_EXPORT QgsAuxiliaryStorage QString mFileName; // original filename QString mTmpFileName; // temporary filename used in copy mode bool mCopy = false; - QString mErrorString; + mutable QString mErrorString; }; #endif diff --git a/src/gui/qgsnewauxiliarylayerdialog.cpp b/src/gui/qgsnewauxiliarylayerdialog.cpp index b697a6da22be..2895b209bf0b 100644 --- a/src/gui/qgsnewauxiliarylayerdialog.cpp +++ b/src/gui/qgsnewauxiliarylayerdialog.cpp @@ -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(); } diff --git a/tests/src/python/test_qgsauxiliarystorage.py b/tests/src/python/test_qgsauxiliarystorage.py index 472489545404..f4081ae516e3 100644 --- a/tests/src/python/test_qgsauxiliarystorage.py +++ b/tests/src/python/test_qgsauxiliarystorage.py @@ -26,6 +26,7 @@ QgsPalLayerSettings, QgsSymbolLayer, QgsVectorLayerSimpleLabeling, + QgsField, NULL) from qgis.testing import start_app, unittest from utilities import unitTestDataPath, writeShape @@ -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()