Skip to content

Commit dce7b19

Browse files
committed
[mssql] Fix some provider methods fail
1 parent 801fce7 commit dce7b19

File tree

2 files changed

+30
-51
lines changed

2 files changed

+30
-51
lines changed

src/providers/mssql/qgsmssqlprovider.cpp

+27-50
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ void QgsMssqlProvider::loadMetadata()
350350
mSRId = 0;
351351
mWkbType = QgsWkbTypes::Unknown;
352352

353-
QSqlQuery query = QSqlQuery( mDatabase );
353+
QSqlQuery query = createQuery();
354354
query.setForwardOnly( true );
355355
if ( !query.exec( QStringLiteral( "select f_geometry_column, srid, geometry_type from geometry_columns where f_table_schema = '%1' and f_table_name = '%2'" ).arg( mSchemaName, mTableName ) ) )
356356
{
@@ -370,6 +370,15 @@ void QgsMssqlProvider::setLastError( const QString &error )
370370
mLastError = error;
371371
}
372372

373+
QSqlQuery QgsMssqlProvider::createQuery() const
374+
{
375+
if ( !mDatabase.isOpen() )
376+
{
377+
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
378+
}
379+
return QSqlQuery( mDatabase );
380+
}
381+
373382
void QgsMssqlProvider::loadFields()
374383
{
375384
bool isIdentity = false;
@@ -378,7 +387,7 @@ void QgsMssqlProvider::loadFields()
378387
mComputedColumns.clear();
379388

380389
// get field spec
381-
QSqlQuery query = QSqlQuery( mDatabase );
390+
QSqlQuery query = createQuery();
382391
query.setForwardOnly( true );
383392

384393
// Get computed columns which need to be ignored on insert or update.
@@ -576,7 +585,8 @@ QVariant QgsMssqlProvider::minimumValue( int index ) const
576585
sql += QStringLiteral( " where (%1)" ).arg( mSqlWhereClause );
577586
}
578587

579-
QSqlQuery query = QSqlQuery( mDatabase );
588+
589+
QSqlQuery query = createQuery();
580590
query.setForwardOnly( true );
581591

582592
if ( !query.exec( sql ) )
@@ -607,7 +617,7 @@ QVariant QgsMssqlProvider::maximumValue( int index ) const
607617
sql += QStringLiteral( " where (%1)" ).arg( mSqlWhereClause );
608618
}
609619

610-
QSqlQuery query = QSqlQuery( mDatabase );
620+
QSqlQuery query = createQuery();
611621
query.setForwardOnly( true );
612622

613623
if ( !query.exec( sql ) )
@@ -647,7 +657,7 @@ QSet<QVariant> QgsMssqlProvider::uniqueValues( int index, int limit ) const
647657
sql += QStringLiteral( " where (%1)" ).arg( mSqlWhereClause );
648658
}
649659

650-
QSqlQuery query = QSqlQuery( mDatabase );
660+
QSqlQuery query = createQuery();
651661
query.setForwardOnly( true );
652662

653663
if ( !query.exec( sql ) )
@@ -676,7 +686,7 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const
676686
// get features to calculate the statistics
677687
QString statement;
678688

679-
QSqlQuery query = QSqlQuery( mDatabase );
689+
QSqlQuery query = createQuery();
680690
query.setForwardOnly( true );
681691

682692
// Get the extents from the spatial index table to speed up load times.
@@ -803,7 +813,7 @@ long QgsMssqlProvider::featureCount() const
803813

804814
// If there is no subset set we can get the count from the system tables.
805815
// Which is faster then doing select count(*)
806-
QSqlQuery query = QSqlQuery( mDatabase );
816+
QSqlQuery query = createQuery();
807817
query.setForwardOnly( true );
808818

809819
QString sql = "SELECT rows"
@@ -844,11 +854,7 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList &flist, Flags flags )
844854
statement = QStringLiteral( "INSERT INTO [%1].[%2] (" ).arg( mSchemaName, mTableName );
845855

846856
bool first = true;
847-
if ( !mDatabase.isOpen() )
848-
{
849-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
850-
}
851-
QSqlQuery query = QSqlQuery( mDatabase );
857+
QSqlQuery query = createQuery();
852858
query.setForwardOnly( true );
853859

854860
QgsAttributes attrs = it->attributes();
@@ -1098,11 +1104,7 @@ bool QgsMssqlProvider::addAttributes( const QList<QgsField> &attributes )
10981104
statement += QStringLiteral( "[%1] %2" ).arg( it->name(), type );
10991105
}
11001106

1101-
if ( !mDatabase.isOpen() )
1102-
{
1103-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1104-
}
1105-
QSqlQuery query = QSqlQuery( mDatabase );
1107+
QSqlQuery query = createQuery();
11061108
query.setForwardOnly( true );
11071109
if ( !query.exec( statement ) )
11081110
{
@@ -1130,12 +1132,7 @@ bool QgsMssqlProvider::deleteAttributes( const QgsAttributeIds &attributes )
11301132
statement += QStringLiteral( "[%1]" ).arg( mAttributeFields.at( *it ).name() );
11311133
}
11321134

1133-
if ( !mDatabase.isOpen() )
1134-
{
1135-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1136-
}
1137-
1138-
QSqlQuery query = QSqlQuery( mDatabase );
1135+
QSqlQuery query = createQuery();
11391136
query.setForwardOnly( true );
11401137

11411138
if ( !query.exec( statement ) )
@@ -1173,11 +1170,7 @@ bool QgsMssqlProvider::changeAttributeValues( const QgsChangedAttributesMap &att
11731170
QString statement = QStringLiteral( "UPDATE [%1].[%2] SET " ).arg( mSchemaName, mTableName );
11741171

11751172
bool first = true;
1176-
if ( !mDatabase.isOpen() )
1177-
{
1178-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1179-
}
1180-
QSqlQuery query = QSqlQuery( mDatabase );
1173+
QSqlQuery query = createQuery();
11811174
query.setForwardOnly( true );
11821175

11831176
for ( QgsAttributeMap::const_iterator it2 = attrs.begin(); it2 != attrs.end(); ++it2 )
@@ -1306,11 +1299,7 @@ bool QgsMssqlProvider::changeGeometryValues( const QgsGeometryMap &geometry_map
13061299
QString statement;
13071300
statement = QStringLiteral( "UPDATE [%1].[%2] SET " ).arg( mSchemaName, mTableName );
13081301

1309-
if ( !mDatabase.isOpen() )
1310-
{
1311-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1312-
}
1313-
QSqlQuery query = QSqlQuery( mDatabase );
1302+
QSqlQuery query = createQuery();
13141303
query.setForwardOnly( true );
13151304

13161305
if ( mGeometryColType == QLatin1String( "geometry" ) )
@@ -1380,11 +1369,7 @@ bool QgsMssqlProvider::deleteFeatures( const QgsFeatureIds &id )
13801369
featureIds += ',' + FID_TO_STRING( *it );
13811370
}
13821371

1383-
if ( !mDatabase.isOpen() )
1384-
{
1385-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1386-
}
1387-
QSqlQuery query = QSqlQuery( mDatabase );
1372+
QSqlQuery query = createQuery();
13881373
query.setForwardOnly( true );
13891374
QString statement;
13901375
statement = QStringLiteral( "DELETE FROM [%1].[%2] WHERE [%3] IN (%4)" ).arg( mSchemaName,
@@ -1426,11 +1411,7 @@ bool QgsMssqlProvider::createSpatialIndex()
14261411
if ( mUseEstimatedMetadata )
14271412
UpdateStatistics( false );
14281413

1429-
if ( !mDatabase.isOpen() )
1430-
{
1431-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1432-
}
1433-
QSqlQuery query = QSqlQuery( mDatabase );
1414+
QSqlQuery query = createQuery();
14341415
query.setForwardOnly( true );
14351416
QString statement;
14361417
statement = QStringLiteral( "CREATE SPATIAL INDEX [qgs_%1_sidx] ON [%2].[%3] ( [%4] )" ).arg(
@@ -1458,11 +1439,7 @@ bool QgsMssqlProvider::createSpatialIndex()
14581439

14591440
bool QgsMssqlProvider::createAttributeIndex( int field )
14601441
{
1461-
if ( !mDatabase.isOpen() )
1462-
{
1463-
mDatabase = GetDatabase( mService, mHost, mDatabaseName, mUserName, mPassword );
1464-
}
1465-
QSqlQuery query = QSqlQuery( mDatabase );
1442+
QSqlQuery query = createQuery();
14661443
query.setForwardOnly( true );
14671444
QString statement;
14681445

@@ -1493,7 +1470,7 @@ QgsCoordinateReferenceSystem QgsMssqlProvider::crs() const
14931470
return mCrs;
14941471

14951472
// try to load crs from the database tables as a fallback
1496-
QSqlQuery query = QSqlQuery( mDatabase );
1473+
QSqlQuery query = createQuery();
14971474
query.setForwardOnly( true );
14981475
bool execOk = query.exec( QStringLiteral( "select srtext from spatial_ref_sys where srid = %1" ).arg( QString::number( mSRId ) ) );
14991476
if ( execOk && query.isActive() )
@@ -1555,7 +1532,7 @@ bool QgsMssqlProvider::setSubsetString( const QString &theSQL, bool )
15551532
sql += QStringLiteral( " where %1" ).arg( mSqlWhereClause );
15561533
}
15571534

1558-
QSqlQuery query = QSqlQuery( mDatabase );
1535+
QSqlQuery query = createQuery();
15591536
query.setForwardOnly( true );
15601537
if ( !query.exec( sql ) )
15611538
{

src/providers/mssql/qgsmssqlprovider.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class QgsMssqlProvider : public QgsVectorDataProvider
184184
mutable QgsWkbTypes::Type mWkbType = QgsWkbTypes::Unknown;
185185

186186
// The database object
187-
QSqlDatabase mDatabase;
187+
mutable QSqlDatabase mDatabase;
188188

189189
// The current sql query
190190
QSqlQuery mQuery;
@@ -214,6 +214,8 @@ class QgsMssqlProvider : public QgsVectorDataProvider
214214
// Sets the error messages
215215
void setLastError( const QString &error );
216216

217+
QSqlQuery createQuery() const;
218+
217219
static void mssqlWkbTypeAndDimension( QgsWkbTypes::Type wkbType, QString &geometryType, int &dim );
218220
static QgsWkbTypes::Type getWkbType( const QString &wkbType );
219221

0 commit comments

Comments
 (0)