Skip to content

Commit 7f2d84c

Browse files
committed
Merge pull request #829 from mhugent/ogr_odbc_subset
Fix subset for ODBC ogr layers
2 parents bb798b4 + 8e43791 commit 7f2d84c

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrProvider* p, const QgsFeatur
5454

5555
if ( !P->subsetString().isEmpty() )
5656
{
57-
QByteArray sql = "SELECT * FROM " + P->quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
58-
sql += " WHERE " + P->textEncoding()->fromUnicode( P->subsetString() );
59-
QgsDebugMsg( QString( "SQL: %1" ).arg( P->textEncoding()->toUnicode( sql ) ) );
60-
ogrLayer = OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, NULL );
57+
ogrLayer = P->setSubsetString( ogrLayer, ogrDataSource );
6158
mSubsetStringSet = true;
6259
}
6360

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,12 +398,8 @@ bool QgsOgrProvider::setSubsetString( QString theSQL, bool updateFeatureCount )
398398

399399
if ( !mSubsetString.isEmpty() )
400400
{
401-
QByteArray sql = "SELECT * FROM " + quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) ) );
402-
sql += " WHERE " + mEncoding->fromUnicode( mSubsetString );
403-
404-
QgsDebugMsg( QString( "SQL: %1" ).arg( mEncoding->toUnicode( sql ) ) );
405-
ogrLayer = OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, NULL );
406401

402+
ogrLayer = setSubsetString( ogrOrigLayer, ogrDataSource );
407403
if ( !ogrLayer )
408404
{
409405
pushError( tr( "OGR[%1] error %2: %3" ).arg( CPLGetLastErrorType() ).arg( CPLGetLastErrorNo() ).arg( CPLGetLastErrorMsg() ) );
@@ -2415,6 +2411,26 @@ OGRwkbGeometryType QgsOgrProvider::ogrWkbSingleFlatten( OGRwkbGeometryType type
24152411
}
24162412
}
24172413

2414+
OGRLayerH QgsOgrProvider::setSubsetString( OGRLayerH layer, OGRDataSourceH ds )
2415+
{
2416+
QByteArray layerName = OGR_FD_GetName( OGR_L_GetLayerDefn( layer ) );
2417+
if ( ogrDriverName == "ODBC" ) //the odbc driver does not like schema names for subset
2418+
{
2419+
QString layerNameString = mEncoding->toUnicode( layerName );
2420+
int dotIndex = layerNameString.indexOf( "." );
2421+
if ( dotIndex > 1 )
2422+
{
2423+
QString modifiedLayerName = layerNameString.right( layerNameString.size() - dotIndex - 1 );
2424+
layerName = mEncoding->fromUnicode( modifiedLayerName );
2425+
}
2426+
}
2427+
QByteArray sql = "SELECT * FROM " + quotedIdentifier( layerName );
2428+
sql += " WHERE " + mEncoding->fromUnicode( mSubsetString );
2429+
2430+
QgsDebugMsg( QString( "SQL: %1" ).arg( mEncoding->toUnicode( sql ) ) );
2431+
return OGR_DS_ExecuteSQL( ds, sql.constData(), NULL, NULL );
2432+
}
2433+
24182434
// ---------------------------------------------------------------------------
24192435

24202436
QGISEXTERN QgsVectorLayerImport::ImportError createEmptyLayer(

src/providers/ogr/qgsogrprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
341341
/**Calls OGR_L_SyncToDisk and recreates the spatial index if present*/
342342
bool syncToDisc();
343343

344+
OGRLayerH setSubsetString( OGRLayerH layer, OGRDataSourceH ds );
345+
344346
friend class QgsOgrFeatureIterator;
345347
QSet< QgsOgrFeatureIterator* > mActiveIterators;
346348
};

0 commit comments

Comments
 (0)