Skip to content

Commit a2776da

Browse files
minoruamhugent
authored andcommittedAug 6, 2013
OgrProvider: fix query encoding issues
1 parent 113e6fb commit a2776da

File tree

3 files changed

+46
-48
lines changed

3 files changed

+46
-48
lines changed
 

‎src/providers/ogr/qgsogrfeatureiterator.cpp

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

5555
if ( !P->subsetString().isEmpty() )
5656
{
57-
QString sql = QString( "SELECT * FROM %1 WHERE %2" )
58-
.arg( P->quotedIdentifier( FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) ) ) )
59-
.arg( P->subsetString() );
60-
QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
61-
ogrLayer = OGR_DS_ExecuteSQL( ogrDataSource, P->textEncoding()->fromUnicode( sql ).constData(), NULL, NULL );
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 );
6261
mSubsetStringSet = true;
6362
}
6463

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,11 @@ bool QgsOgrProvider::setSubsetString( QString theSQL, bool updateFeatureCount )
398398

399399
if ( !mSubsetString.isEmpty() )
400400
{
401-
QString sql = QString( "SELECT * FROM %1 WHERE %2" )
402-
.arg( quotedIdentifier( FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) ) ) ) )
403-
.arg( mSubsetString );
404-
QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
405-
ogrLayer = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), NULL, NULL );
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 );
406406

407407
if ( !ogrLayer )
408408
{
@@ -1232,14 +1232,14 @@ bool QgsOgrProvider::createSpatialIndex()
12321232

12331233
QgsCPLErrorHandler handler;
12341234

1235-
QString layerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) ) );
1235+
QByteArray layerName = OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) );
12361236

12371237
// run REPACK on shape files
12381238
if ( mDeletedFeatures )
12391239
{
1240-
QString sql = QString( "REPACK %1" ).arg( layerName ); // don't quote the layer name as it works with spaces in the name and won't work if the name is quoted
1241-
QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
1242-
OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), NULL, NULL );
1240+
QByteArray sql = QByteArray( "REPACK " ) + layerName; // don't quote the layer name as it works with spaces in the name and won't work if the name is quoted
1241+
QgsDebugMsg( QString( "SQL: %1" ).arg( FROM8( sql ) ) );
1242+
OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, NULL );
12431243

12441244
if ( mFilePath.endsWith( ".shp", Qt::CaseInsensitive ) || mFilePath.endsWith( ".dbf", Qt::CaseInsensitive ) )
12451245
{
@@ -1284,9 +1284,9 @@ bool QgsOgrProvider::createSpatialIndex()
12841284

12851285
if ( ogrDataSource )
12861286
{
1287-
QString sql = QString( "CREATE SPATIAL INDEX ON %1" ).arg( quotedIdentifier( layerName ) ); // quote the layer name so spaces are handled
1288-
QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
1289-
OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "" );
1287+
QByteArray sql = "CREATE SPATIAL INDEX ON " + quotedIdentifier( layerName ); // quote the layer name so spaces are handled
1288+
QgsDebugMsg( QString( "SQL: %1" ).arg( FROM8( sql ) ) );
1289+
OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "" );
12901290
}
12911291

12921292
QFileInfo fi( mFilePath ); // to get the base name
@@ -1297,11 +1297,11 @@ bool QgsOgrProvider::createSpatialIndex()
12971297

12981298
bool QgsOgrProvider::createAttributeIndex( int field )
12991299
{
1300-
QString layerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) ) );
1301-
QString dropSql = QString( "DROP INDEX ON %1" ).arg( quotedIdentifier( layerName ) );
1302-
OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( dropSql ).constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "SQL" );
1303-
QString createSql = QString( "CREATE INDEX ON %1 USING %2" ).arg( quotedIdentifier( layerName ) ).arg( fields()[field].name() );
1304-
OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( createSql ).constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "SQL" );
1300+
QByteArray quotedLayerName = quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrOrigLayer ) ) );
1301+
QByteArray dropSql = "DROP INDEX ON " + quotedLayerName;
1302+
OGR_DS_ExecuteSQL( ogrDataSource, dropSql.constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "SQL" );
1303+
QByteArray createSql = "CREATE INDEX ON " + quotedLayerName + " USING " + mEncoding->fromUnicode( fields()[field].name() );
1304+
OGR_DS_ExecuteSQL( ogrDataSource, createSql.constData(), OGR_L_GetSpatialFilter( ogrOrigLayer ), "SQL" );
13051305

13061306
QFileInfo fi( mFilePath ); // to get the base name
13071307
//find out, if the .idm file is there
@@ -2197,23 +2197,23 @@ void QgsOgrProvider::uniqueValues( int index, QList<QVariant> &uniqueValues, int
21972197
// avoid GDAL #4509
21982198
return QgsVectorDataProvider::uniqueValues( index, uniqueValues, limit );
21992199
#else
2200-
QString theLayerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
2201-
2202-
QString sql = QString( "SELECT DISTINCT %1 FROM %2" )
2203-
.arg( quotedIdentifier( fld.name() ) )
2204-
.arg( quotedIdentifier( theLayerName ) );
2200+
QByteArray sql = "SELECT DISTINCT " + quotedIdentifier( mEncoding->fromUnicode( fld.name() ) );
2201+
sql += " FROM " + quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
22052202

22062203
if ( !mSubsetString.isEmpty() )
22072204
{
2208-
sql += QString( " WHERE %1" ).arg( mSubsetString );
2205+
sql += " WHERE " + mEncoding->fromUnicode( mSubsetString );
22092206
}
22102207

2211-
sql += QString( " ORDER BY %1 ASC" ).arg( fld.name() ); // quoting of fieldname produces a syntax error
2208+
sql += " ORDER BY " + mEncoding->fromUnicode( fld.name() ) + " ASC"; // quoting of fieldname produces a syntax error
22122209

2213-
QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
2214-
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), NULL, "SQL" );
2210+
QgsDebugMsg( QString( "SQL: %1" ).arg( mEncoding->toUnicode( sql ) ) );
2211+
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, "SQL" );
22152212
if ( l == 0 )
2213+
{
2214+
QgsDebugMsg( "Failed to execute SQL" );
22162215
return QgsVectorDataProvider::uniqueValues( index, uniqueValues, limit );
2216+
}
22172217

22182218
OGRFeatureH f;
22192219
while ( 0 != ( f = OGR_L_GetNextFeature( l ) ) )
@@ -2237,21 +2237,20 @@ QVariant QgsOgrProvider::minimumValue( int index )
22372237
}
22382238
const QgsField& fld = mAttributeFields[index];
22392239

2240-
QString theLayerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
2241-
2242-
QString sql = QString( "SELECT MIN(%1) FROM %2" )
2243-
.arg( quotedIdentifier( fld.name() ) )
2244-
.arg( quotedIdentifier( theLayerName ) );
2240+
QByteArray sql = "SELECT MIN(" + quotedIdentifier( mEncoding->fromUnicode( fld.name() ) );
2241+
sql += ") FROM " + quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
22452242

22462243
if ( !mSubsetString.isEmpty() )
22472244
{
2248-
sql += QString( " WHERE %1" ).arg( mSubsetString );
2245+
sql += " WHERE " + mEncoding->fromUnicode( mSubsetString );
22492246
}
22502247

2251-
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), NULL, "SQL" );
2252-
2248+
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, "SQL" );
22532249
if ( l == 0 )
2250+
{
2251+
QgsDebugMsg( QString( "Failed to execute SQL: %1" ).arg( mEncoding->toUnicode( sql ) ) );
22542252
return QgsVectorDataProvider::minimumValue( index );
2253+
}
22552254

22562255
OGRFeatureH f = OGR_L_GetNextFeature( l );
22572256
if ( f == 0 )
@@ -2276,20 +2275,20 @@ QVariant QgsOgrProvider::maximumValue( int index )
22762275
}
22772276
const QgsField& fld = mAttributeFields[index];
22782277

2279-
QString theLayerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
2280-
2281-
QString sql = QString( "SELECT MAX(%1) FROM %2" )
2282-
.arg( quotedIdentifier( fld.name() ) )
2283-
.arg( quotedIdentifier( theLayerName ) );
2278+
QByteArray sql = "SELECT MAX(" + quotedIdentifier( mEncoding->fromUnicode( fld.name() ) );
2279+
sql += ") FROM " + quotedIdentifier( OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) ) );
22842280

22852281
if ( !mSubsetString.isEmpty() )
22862282
{
2287-
sql += QString( " WHERE %1" ).arg( mSubsetString );
2283+
sql += " WHERE " + mEncoding->fromUnicode( mSubsetString );
22882284
}
22892285

2290-
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).constData(), NULL, "SQL" );
2286+
OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, sql.constData(), NULL, "SQL" );
22912287
if ( l == 0 )
2288+
{
2289+
QgsDebugMsg( QString( "Failed to execute SQL: %1" ).arg( mEncoding->toUnicode( sql ) ) );
22922290
return QgsVectorDataProvider::maximumValue( index );
2291+
}
22932292

22942293
OGRFeatureH f = OGR_L_GetNextFeature( l );
22952294
if ( f == 0 )
@@ -2306,7 +2305,7 @@ QVariant QgsOgrProvider::maximumValue( int index )
23062305
return value;
23072306
}
23082307

2309-
QString QgsOgrProvider::quotedIdentifier( QString field )
2308+
QByteArray QgsOgrProvider::quotedIdentifier( QByteArray field )
23102309
{
23112310
if ( ogrDriverName == "MySQL" )
23122311
{

‎src/providers/ogr/qgsogrprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
260260

261261
QTextCodec* textEncoding() { return mEncoding; }
262262

263-
QString quotedIdentifier( QString field );
263+
QByteArray quotedIdentifier( QByteArray field );
264264

265265
protected:
266266
/** loads fields from input file to member attributeFields */

0 commit comments

Comments
 (0)
Please sign in to comment.