@@ -406,6 +406,7 @@ QgsSpatiaLiteProvider::createEmptyLayer(
406
406
QgsSpatiaLiteProvider::QgsSpatiaLiteProvider ( QString const &uri )
407
407
: QgsVectorDataProvider( uri )
408
408
, geomType( QGis::WKBUnknown )
409
+ , mGotSpatialiteVersion( false )
409
410
, sqliteHandle( NULL )
410
411
, sqliteStatement( NULL )
411
412
, mSrid( -1 )
@@ -557,6 +558,10 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
557
558
QgsDebugMsg ( " Invalid SpatiaLite layer" );
558
559
return ;
559
560
}
561
+
562
+ // retrieve version information
563
+ spatialiteVersion ();
564
+
560
565
// fill type names into sets
561
566
mNativeTypes
562
567
<< QgsVectorDataProvider::NativeType ( tr ( " Binary object (BLOB)" ), " BLOB" , QVariant::ByteArray )
@@ -618,6 +623,48 @@ void QgsSpatiaLiteProvider::loadFieldsAbstractInterface( gaiaVectorLayerPtr lyr
618
623
}
619
624
#endif
620
625
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
+
621
668
void QgsSpatiaLiteProvider::loadFields ()
622
669
{
623
670
int ret;
@@ -3749,14 +3796,18 @@ QString QgsSpatiaLiteProvider::geomParam() const
3749
3796
break ;
3750
3797
}
3751
3798
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 )
3753
3804
{
3754
3805
geometry += " ST_Multi(" ;
3755
3806
}
3756
3807
3757
3808
geometry += QString ( " GeomFromWKB(?, %2)" ).arg ( mSrid );
3758
3809
3759
- if ( forceMulti )
3810
+ if ( forceMulti && hasMultiFunction )
3760
3811
{
3761
3812
geometry += " )" ;
3762
3813
}
0 commit comments