Skip to content

Commit

Permalink
An error message is displayed when an auxiliary layer cannot be created
Browse files Browse the repository at this point in the history
  • Loading branch information
pblottiere authored and nyalldawson committed Jun 18, 2021
1 parent c7beb55 commit 1962879
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 11 deletions.
15 changes: 7 additions & 8 deletions src/core/qgsauxiliarystorage.cpp
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
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
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
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()

0 comments on commit 1962879

Please sign in to comment.