Skip to content

Commit

Permalink
Merge pull request #38641 from domi4484/mssqldefaultvalues
Browse files Browse the repository at this point in the history
Implemented method QgsMssqlProvider::defaultValue
  • Loading branch information
m-kuhn committed Sep 17, 2020
2 parents 44fb4f5 + 8609a72 commit 9e654ca
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 2 deletions.
47 changes: 46 additions & 1 deletion src/providers/mssql/qgsmssqlprovider.cpp
Expand Up @@ -544,7 +544,52 @@ QString QgsMssqlProvider::quotedIdentifier( const QString &value )

QString QgsMssqlProvider::defaultValueClause( int fieldId ) const
{
return mDefaultValues.value( fieldId, QString() );
const QString defVal = mDefaultValues.value( fieldId, QString() );

if ( defVal.isEmpty() )
return QString();

// NOTE: If EvaluateDefaultValues is activated it is impossible to get the defaultValueClause.
// This also apply to QgsPostgresProvider::defaultValueClause.
if ( !providerProperty( EvaluateDefaultValues, false ).toBool() )
return defVal;

return QString();
}

QVariant QgsMssqlProvider::defaultValue( int fieldId ) const
{
const QString defVal = mDefaultValues.value( fieldId, QString() );

if ( defVal.isEmpty() )
return QVariant();

if ( !providerProperty( EvaluateDefaultValues, false ).toBool() )
return QVariant();

QString sql = QStringLiteral( "select %1" )
.arg( defVal );

QSqlQuery query = createQuery();
query.setForwardOnly( true );

if ( !query.exec( sql ) )
{
const QString errorMessage( tr( "Could not execute query: %1" ).arg( query.lastError().text() ) );
QgsDebugMsg( errorMessage );
pushError( errorMessage );
return QVariant();
}

if ( !query.next() )
{
const QString errorMessage( tr( "Could not fetch next query value: %1" ).arg( query.lastError().text() ) );
QgsDebugMsg( errorMessage );
pushError( errorMessage );
return QVariant();
}

return query.value( 0 );
}

QString QgsMssqlProvider::storageType() const
Expand Down
1 change: 1 addition & 0 deletions src/providers/mssql/qgsmssqlprovider.h
Expand Up @@ -141,6 +141,7 @@ class QgsMssqlProvider final: public QgsVectorDataProvider
static QString quotedIdentifier( const QString &value );

QString defaultValueClause( int fieldId ) const override;
QVariant defaultValue( int fieldId ) const override;

//! Convert time value
static QVariant convertTimeValue( const QVariant &value );
Expand Down
16 changes: 15 additions & 1 deletion tests/src/python/test_provider_mssql.py
Expand Up @@ -25,7 +25,8 @@
QgsProviderRegistry,
NULL,
QgsVectorLayerExporter,
QgsCoordinateReferenceSystem)
QgsCoordinateReferenceSystem,
QgsDataProvider)

from qgis.PyQt.QtCore import QDate, QTime, QDateTime, QVariant
from utilities import unitTestDataPath
Expand Down Expand Up @@ -515,6 +516,19 @@ def testInvalidGeometries(self):
self.assertTrue(vl.isValid())
self.assertEqual(vl.dataProvider().extent().toString(1), 'Empty')

def testEvaluateDefaultValueClause(self):

vl = QgsVectorLayer(
'%s table="qgis_test"."someData" sql=' %
(self.dbconn), "testdatetimes", "mssql")

# Activate EvaluateDefaultValues
vl.dataProvider().setProviderProperty(QgsDataProvider.EvaluateDefaultValues, True)

name_index = vl.fields().lookupField('name')
defaultValue = vl.dataProvider().defaultValue(name_index)
self.assertEqual(defaultValue, 'qgis')

def testPktComposite(self):
"""
Check that tables with PKs composed of many fields of different types are correctly read and written to
Expand Down

0 comments on commit 9e654ca

Please sign in to comment.