Skip to content

Commit c99fdd4

Browse files
committedDec 5, 2012
do not use st_multi when SL < 2.4 (follow 2469c5aa17)
1 parent 1bde6c5 commit c99fdd4

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed
 

‎src/providers/spatialite/qgsspatialiteprovider.cpp

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ QgsSpatiaLiteProvider::createEmptyLayer(
406406
QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
407407
: QgsVectorDataProvider( uri )
408408
, geomType( QGis::WKBUnknown )
409+
, mGotSpatialiteVersion( false )
409410
, sqliteHandle( NULL )
410411
, sqliteStatement( NULL )
411412
, mSrid( -1 )
@@ -557,6 +558,10 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
557558
QgsDebugMsg( "Invalid SpatiaLite layer" );
558559
return;
559560
}
561+
562+
// retrieve version information
563+
spatialiteVersion();
564+
560565
//fill type names into sets
561566
mNativeTypes
562567
<< QgsVectorDataProvider::NativeType( tr( "Binary object (BLOB)" ), "BLOB", QVariant::ByteArray )
@@ -618,6 +623,48 @@ void QgsSpatiaLiteProvider::loadFieldsAbstractInterface( gaiaVectorLayerPtr lyr
618623
}
619624
#endif
620625

626+
QString QgsSpatiaLiteProvider::spatialiteVersion()
627+
{
628+
if ( mGotSpatialiteVersion )
629+
return mSpatialiteVersionInfo;
630+
631+
int ret;
632+
char **results;
633+
int rows;
634+
int columns;
635+
char *errMsg = NULL;
636+
QString sql;
637+
638+
sql = "SELECT spatialite_version()";
639+
ret = sqlite3_get_table( sqliteHandle, sql.toUtf8(), &results, &rows, &columns, &errMsg );
640+
if ( ret != SQLITE_OK || rows != 1 )
641+
{
642+
QgsMessageLog::logMessage( tr( "Retrieval of spatialite version failed" ), tr( "SpatiaLite" ) );
643+
return QString::null;
644+
}
645+
646+
mSpatialiteVersionInfo = QString::fromUtf8( results[( 1 * columns ) + 0] );
647+
sqlite3_free_table( results );
648+
649+
QgsDebugMsg( "SpatiaLite version info: " + mSpatialiteVersionInfo );
650+
651+
QStringList spatialiteParts = mSpatialiteVersionInfo.split( " ", QString::SkipEmptyParts );
652+
653+
// Get major and minor version
654+
QStringList spatialiteVersionParts = spatialiteParts[0].split( ".", QString::SkipEmptyParts );
655+
if ( spatialiteVersionParts.size() < 2 )
656+
{
657+
QgsMessageLog::logMessage( tr( "Could not parse spatialite version string '%1'" ).arg( mSpatialiteVersionInfo ), tr( "SpatiaLite" ) );
658+
return QString::null;
659+
}
660+
661+
mSpatialiteVersionMajor = spatialiteVersionParts[0].toInt();
662+
mSpatialiteVersionMinor = spatialiteVersionParts[1].toInt();
663+
664+
mGotSpatialiteVersion = true;
665+
return mSpatialiteVersionInfo;
666+
}
667+
621668
void QgsSpatiaLiteProvider::loadFields()
622669
{
623670
int ret;
@@ -3749,14 +3796,18 @@ QString QgsSpatiaLiteProvider::geomParam() const
37493796
break;
37503797
}
37513798

3752-
if ( forceMulti )
3799+
// ST_Multi function is available from QGIS >= 2.4
3800+
bool hasMultiFunction = mSpatialiteVersionMajor > 2 ||
3801+
( mSpatialiteVersionMajor == 2 && mSpatialiteVersionMinor >= 4 );
3802+
3803+
if ( forceMulti && hasMultiFunction )
37533804
{
37543805
geometry += "ST_Multi(";
37553806
}
37563807

37573808
geometry += QString( "GeomFromWKB(?, %2)" ).arg( mSrid );
37583809

3759-
if ( forceMulti )
3810+
if ( forceMulti && hasMultiFunction )
37603811
{
37613812
geometry += ")";
37623813
}

‎src/providers/spatialite/qgsspatialiteprovider.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider
288288

289289
QString geomParam() const;
290290

291+
//! get SpatiaLite version string
292+
QString spatialiteVersion();
293+
291294
QgsFieldMap attributeFields;
292295
/**
293296
* Flag indicating if the layer data source is a valid SpatiaLite layer
@@ -398,6 +401,18 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider
398401
/** geometry column index used when fetching geometry */
399402
int mGeomColIdx;
400403

404+
//! SpatiaLite version string
405+
QString mSpatialiteVersionInfo;
406+
407+
//! Are mSpatialiteVersionMajor, mSpatialiteVersionMinor valid?
408+
bool mGotSpatialiteVersion;
409+
410+
//! SpatiaLite major version
411+
int mSpatialiteVersionMajor;
412+
413+
//! SpatiaLite minor version
414+
int mSpatialiteVersionMinor;
415+
401416
/**
402417
* internal utility functions used to handle common SQLite tasks
403418
*/

0 commit comments

Comments
 (0)
Please sign in to comment.