@@ -406,6 +406,7 @@ QgsSpatiaLiteProvider::createEmptyLayer(
406406QgsSpatiaLiteProvider::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+
621668void 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 }
0 commit comments