[qgis] 02/04: Include change from 2.8.3 to fix segfauls caused by the deprecated spatialite_init() method.
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Sun Jul 26 16:47:14 UTC 2015
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository qgis.
commit 71edfbaa81bb14c47e9bfef6802ffbfdfe3e36b0
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Sun Jul 26 13:10:08 2015 +0200
Include change from 2.8.3 to fix segfauls caused by the deprecated spatialite_init() method.
---
debian/changelog | 2 +
...patialite-initialization-scheme-via-thin-.patch | 812 +++++++++++++++++++++
debian/patches/series | 1 +
3 files changed, 815 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index eb878d9..9d7f39c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,8 @@ qgis (2.8.2+dfsg-3) UNRELEASED; urgency=medium
* Limit upstream version to 2.8 LTR releases in watch file.
* Disable QwtPolar, embedded copies don't support Qwt > 6.0.
+ * Include change from 2.8.3 to fix segfauls caused by the deprecated
+ spatialite_init() method. (closes: #788101, #791680)
-- Bas Couwenberg <sebastic at debian.org> Sat, 27 Jun 2015 10:38:49 +0200
diff --git a/debian/patches/0001-adopt-new-spatialite-initialization-scheme-via-thin-.patch b/debian/patches/0001-adopt-new-spatialite-initialization-scheme-via-thin-.patch
new file mode 100644
index 0000000..e77da46
--- /dev/null
+++ b/debian/patches/0001-adopt-new-spatialite-initialization-scheme-via-thin-.patch
@@ -0,0 +1,812 @@
+From d7ca190295079957a8d0ef446cd834351020e901 Mon Sep 17 00:00:00 2001
+From: "Juergen E. Fischer" <jef at norbit.de>
+Date: Tue, 26 May 2015 13:27:08 +0200
+Subject: adopt 'new' spatialite initialization scheme via thin wrapper around
+ sqlite3_open and sqlite3_close (fixes #12771)
+Origin: https://github.com/qgis/QGIS/commit/d7ca190295079957a8d0ef446cd834351020e901
+Bug: http://hub.qgis.org/issues/12771
+Bug-Debian: https://bugs.debian.org/788101
+Bug-Debian: https://bugs.debian.org/791680
+
+(cherry picked from commit 252aaab, 23ef9da, d4b72a2, c7cb963 and e255d6c)
+---
+ CMakeLists.txt | 10 +++
+ cmake/FindSPATIALITE.cmake | 1 +
+ python/ext-libs/pyspatialite/src/connection.c | 16 +++-
+ python/ext-libs/pyspatialite/src/connection.h | 3 +-
+ src/analysis/openstreetmap/qgsosmdatabase.cpp | 13 +---
+ src/analysis/openstreetmap/qgsosmimport.cpp | 10 +--
+ src/app/qgsnewspatialitelayerdialog.cpp | 24 +++---
+ src/core/CMakeLists.txt | 1 +
+ src/core/qgsofflineediting.cpp | 13 ++--
+ src/core/qgsslconnect.cpp | 89 ++++++++++++++++++++++
+ src/core/qgsslconnect.h | 39 ++++++++++
+ src/providers/spatialite/CMakeLists.txt | 8 --
+ .../spatialite/qgsspatialiteconnection.cpp | 16 ++--
+ src/providers/spatialite/qgsspatialiteconnection.h | 2 -
+ src/providers/spatialite/qgsspatialiteprovider.cpp | 56 ++++++--------
+ .../spatialite/qspatialite/CMakeLists.txt | 1 +
+ .../spatialite/qspatialite/qsql_spatialite.cpp | 8 +-
+ 17 files changed, 213 insertions(+), 97 deletions(-)
+ create mode 100644 src/core/qgsslconnect.cpp
+ create mode 100644 src/core/qgsslconnect.h
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -199,6 +199,16 @@ ENDIF (WITH_POSTGRESQL)
+
+ FIND_PACKAGE(SPATIALITE REQUIRED)
+
++IF(SPATIALITE_VERSION_GE_4_0_0)
++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_GE_4_0_0")
++ENDIF(SPATIALITE_VERSION_GE_4_0_0)
++IF(SPATIALITE_VERSION_G_4_1_1)
++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_G_4_1_1")
++ENDIF(SPATIALITE_VERSION_G_4_1_1)
++IF(SPATIALITE_HAS_INIT_EX)
++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_HAS_INIT_EX")
++ENDIF(SPATIALITE_HAS_INIT_EX)
++
+ IF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
+ MESSAGE (SEND_ERROR "Some dependencies were not found!")
+ ENDIF (NOT PROJ_FOUND OR NOT GEOS_FOUND OR NOT GDAL_FOUND)
+--- a/cmake/FindSPATIALITE.cmake
++++ b/cmake/FindSPATIALITE.cmake
+@@ -70,6 +70,7 @@ IF (SPATIALITE_FOUND)
+ ENDIF(APPLE)
+ check_library_exists("${SPATIALITE_LIBRARY}" gaiaDropTable "" SPATIALITE_VERSION_GE_4_0_0)
+ check_library_exists("${SPATIALITE_LIBRARY}" gaiaStatisticsInvalidate "" SPATIALITE_VERSION_G_4_1_1)
++ check_library_exists("${SPATIALITE_LIBRARY}" spatialite_init_ex "" SPATIALITE_HAS_INIT_EX)
+
+ ELSE (SPATIALITE_FOUND)
+
+--- a/python/ext-libs/pyspatialite/src/connection.c
++++ b/python/ext-libs/pyspatialite/src/connection.c
+@@ -29,6 +29,7 @@
+ #include "prepare_protocol.h"
+ #include "util.h"
+ #include "sqlitecompat.h"
++#include "spatialite.h"
+
+ #include "pythread.h"
+
+@@ -81,7 +82,6 @@ int pysqlite_connection_init(pysqlite_Co
+ }
+
+ self->initialized = 1;
+- spatialite_init(0);
+ self->begin_statement = NULL;
+
+ self->statement_cache = NULL;
+@@ -106,7 +106,15 @@ int pysqlite_connection_init(pysqlite_Co
+ }
+
+ Py_BEGIN_ALLOW_THREADS
++#if defined(SPATIALITE_HAS_INIT_EX)
++ self->slconn = spatialite_alloc_connection();
++#else
++ spatialite_init( 0 );
++#endif
+ rc = sqlite3_open(PyString_AsString(database_utf8), &self->db);
++#if defined(SPATIALITE_HAS_INIT_EX)
++ spatialite_init_ex( self->db, self->slconn, 0 );
++#endif
+ Py_END_ALLOW_THREADS
+
+ Py_DECREF(database_utf8);
+@@ -272,6 +280,9 @@ void pysqlite_connection_dealloc(pysqlit
+ if (self->db) {
+ Py_BEGIN_ALLOW_THREADS
+ sqlite3_close(self->db);
++#if defined(SPATIALITE_HAS_INIT_EX)
++ spatialite_cleanup_ex( self->slconn );
++#endif
+ Py_END_ALLOW_THREADS
+ } else if (self->apsw_connection) {
+ ret = PyObject_CallMethod(self->apsw_connection, "close", "");
+@@ -372,6 +383,9 @@ PyObject* pysqlite_connection_close(pysq
+ } else {
+ Py_BEGIN_ALLOW_THREADS
+ rc = sqlite3_close(self->db);
++#if defined(SPATIALITE_HAS_INIT_EX)
++ spatialite_cleanup_ex( self->slconn );
++#endif
+ Py_END_ALLOW_THREADS
+
+ if (rc != SQLITE_OK) {
+--- a/python/ext-libs/pyspatialite/src/connection.h
++++ b/python/ext-libs/pyspatialite/src/connection.h
+@@ -33,12 +33,11 @@
+ #include "sqlite3.h"
+ #include "spatialite.h"
+
+-// int spatialite_init(int verbose);
+-
+ typedef struct
+ {
+ PyObject_HEAD
+ sqlite3* db;
++ void *slconn;
+
+ /* 1 if we are currently within a transaction, i. e. if a BEGIN has been
+ * issued */
+--- a/src/analysis/openstreetmap/qgsosmdatabase.cpp
++++ b/src/analysis/openstreetmap/qgsosmdatabase.cpp
+@@ -14,14 +14,11 @@
+ ***************************************************************************/
+
+ #include "qgsosmdatabase.h"
+-
+-#include <spatialite.h>
+-
++#include "qgsslconnect.h"
+ #include "qgsgeometry.h"
+ #include "qgslogger.h"
+
+
+-
+ QgsOSMDatabase::QgsOSMDatabase( const QString& dbFileName )
+ : mDbFileName( dbFileName )
+ , mDatabase( 0 )
+@@ -32,7 +29,6 @@ QgsOSMDatabase::QgsOSMDatabase( const QS
+ , mStmtWayNodePoints( 0 )
+ , mStmtWayTags( 0 )
+ {
+-
+ }
+
+ QgsOSMDatabase::~QgsOSMDatabase()
+@@ -49,11 +45,8 @@ bool QgsOSMDatabase::isOpen() const
+
+ bool QgsOSMDatabase::open()
+ {
+- // load spatialite extension
+- spatialite_init( 0 );
+-
+ // open database
+- int res = sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE, 0 );
++ int res = QgsSLConnect::sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE, 0 );
+ if ( res != SQLITE_OK )
+ {
+ mError = QString( "Failed to open database [%1]: %2" ).arg( res ).arg( mDbFileName );
+@@ -93,7 +86,7 @@ bool QgsOSMDatabase::close()
+ Q_ASSERT( mStmtNode == 0 );
+
+ // close database
+- if ( sqlite3_close( mDatabase ) != SQLITE_OK )
++ if ( QgsSLConnect::sqlite3_close( mDatabase ) != SQLITE_OK )
+ {
+ //mError = ( char * ) "Closing SQLite3 database failed.";
+ //return false;
+--- a/src/analysis/openstreetmap/qgsosmimport.cpp
++++ b/src/analysis/openstreetmap/qgsosmimport.cpp
+@@ -14,8 +14,7 @@
+ ***************************************************************************/
+
+ #include "qgsosmimport.h"
+-
+-#include <spatialite.h>
++#include "qgsslconnect.h"
+
+ #include <QStringList>
+ #include <QXmlStreamReader>
+@@ -57,9 +56,6 @@ bool QgsOSMXmlImport::import()
+ }
+ }
+
+- // load spatialite extension
+- spatialite_init( 0 );
+-
+ if ( !createDatabase() )
+ {
+ // mError is set in createDatabase()
+@@ -137,7 +133,7 @@ bool QgsOSMXmlImport::createDatabase()
+ {
+ char **results;
+ int rows, columns;
+- if ( sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0 ) != SQLITE_OK )
++ if ( QgsSLConnect::sqlite3_open_v2( mDbFileName.toUtf8().data(), &mDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0 ) != SQLITE_OK )
+ return false;
+
+ bool above41 = false;
+@@ -238,7 +234,7 @@ bool QgsOSMXmlImport::closeDatabase()
+
+ Q_ASSERT( mStmtInsertNode == 0 );
+
+- sqlite3_close( mDatabase );
++ QgsSLConnect::sqlite3_close( mDatabase );
+ mDatabase = 0;
+ return true;
+ }
+--- a/src/app/qgsnewspatialitelayerdialog.cpp
++++ b/src/app/qgsnewspatialitelayerdialog.cpp
+@@ -24,10 +24,11 @@
+ #include "qgsapplication.h"
+ #include "qgsproviderregistry.h"
+ #include "qgisapp.h" // <- for theme icons
+-#include <qgsvectorlayer.h>
+-#include <qgsmaplayerregistry.h>
++#include "qgsvectorlayer.h"
++#include "qgsmaplayerregistry.h"
+ #include "qgscoordinatereferencesystem.h"
+ #include "qgsgenericprojectionselector.h"
++#include "qgsslconnect.h"
+
+ #include "qgslogger.h"
+
+@@ -196,14 +197,11 @@ void QgsNewSpatialiteLayerDialog::on_pbn
+ // to build filter for projection selector
+ sqlite3 *db = 0;
+ bool status = true;
+- if ( !db )
++ int rc = sqlite3_open_v2( mDatabaseComboBox->currentText().toUtf8(), &db, SQLITE_OPEN_READONLY, NULL );
++ if ( rc != SQLITE_OK )
+ {
+- int rc = sqlite3_open_v2( mDatabaseComboBox->currentText().toUtf8(), &db, SQLITE_OPEN_READONLY, NULL );
+- if ( rc != SQLITE_OK )
+- {
+- QMessageBox::warning( this, tr( "SpatiaLite Database" ), tr( "Unable to open the database" ) );
+- return;
+- }
++ QMessageBox::warning( this, tr( "SpatiaLite Database" ), tr( "Unable to open the database" ) );
++ return;
+ }
+
+ // load up the srid table
+@@ -213,7 +211,7 @@ void QgsNewSpatialiteLayerDialog::on_pbn
+
+ QSet<QString> myCRSs;
+
+- int rc = sqlite3_prepare( db, sql.toUtf8(), sql.toUtf8().length(), &ppStmt, &pzTail );
++ rc = sqlite3_prepare( db, sql.toUtf8(), sql.toUtf8().length(), &ppStmt, &pzTail );
+ // XXX Need to free memory from the error msg if one is set
+ if ( rc == SQLITE_OK )
+ {
+@@ -381,10 +379,8 @@ bool QgsNewSpatialiteLayerDialog::apply(
+ .arg( quotedValue( leGeometryColumn->text() ) );
+ QgsDebugMsg( sqlCreateIndex ); // OK
+
+- spatialite_init( 0 );
+-
+ sqlite3 *db;
+- int rc = sqlite3_open( mDatabaseComboBox->currentText().toUtf8(), &db );
++ int rc = QgsSLConnect::sqlite3_open( mDatabaseComboBox->currentText().toUtf8(), &db );
+ if ( rc != SQLITE_OK )
+ {
+ QMessageBox::warning( this,
+@@ -447,6 +443,8 @@ bool QgsNewSpatialiteLayerDialog::apply(
+ }
+ }
+ }
++
++ QgsSLConnect::sqlite3_close( db );
+ }
+
+ return false;
+--- a/src/core/CMakeLists.txt
++++ b/src/core/CMakeLists.txt
+@@ -173,6 +173,7 @@ SET(QGIS_CORE_SRCS
+ qgsvectorlayerundocommand.cpp
+ qgsvectorsimplifymethod.cpp
+ qgsxmlutils.cpp
++ qgsslconnect.cpp
+
+ composer/qgsaddremoveitemcommand.cpp
+ composer/qgsaddremovemultiframecommand.cpp
+--- a/src/core/qgsofflineediting.cpp
++++ b/src/core/qgsofflineediting.cpp
+@@ -29,6 +29,7 @@
+ #include "qgsvectordataprovider.h"
+ #include "qgsvectorlayereditbuffer.h"
+ #include "qgsvectorlayerjoinbuffer.h"
++#include "qgsslconnect.h"
+
+ #include <QDir>
+ #include <QDomDocument>
+@@ -74,9 +75,8 @@ bool QgsOfflineEditing::convertToOffline
+ QString dbPath = QDir( offlineDataPath ).absoluteFilePath( offlineDbFile );
+ if ( createSpatialiteDB( dbPath ) )
+ {
+- spatialite_init( 0 );
+ sqlite3* db;
+- int rc = sqlite3_open( dbPath.toUtf8().constData(), &db );
++ int rc = QgsSLConnect::sqlite3_open( dbPath.toUtf8().constData(), &db );
+ if ( rc != SQLITE_OK )
+ {
+ showWarning( tr( "Could not open the spatialite database" ) );
+@@ -156,7 +156,7 @@ bool QgsOfflineEditing::convertToOffline
+
+ emit progressStopped();
+
+- sqlite3_close( db );
++ QgsSLConnect::sqlite3_close( db );
+
+ // save offline project
+ QString projectTitle = QgsProject::instance()->title();
+@@ -380,8 +380,7 @@ bool QgsOfflineEditing::createSpatialite
+
+ // creating/opening the new database
+ QString dbPath = newDb.fileName();
+- spatialite_init( 0 );
+- ret = sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
++ ret = QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
+ if ( ret )
+ {
+ // an error occurred
+@@ -397,13 +396,13 @@ bool QgsOfflineEditing::createSpatialite
+ {
+ showWarning( tr( "Unable to activate FOREIGN_KEY constraints" ) );
+ sqlite3_free( errMsg );
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+ return false;
+ }
+ initializeSpatialMetadata( sqlite_handle );
+
+ // all done: closing the DB connection
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+
+ return true;
+ }
+--- /dev/null
++++ b/src/core/qgsslconnect.cpp
+@@ -0,0 +1,89 @@
++/***************************************************************************
++ qgsslconnect.cpp - thin wrapper class to connect to spatialite databases
++ ----------------------
++ begin : May 2015
++ copyright : (C) 2015 by Jürgen fischer
++ email : jef at norbit dot de
++ ***************************************************************************
++ * *
++ * This program is free software; you can redistribute it and/or modify *
++ * it under the terms of the GNU General Public License as published by *
++ * the Free Software Foundation; either version 2 of the License, or *
++ * (at your option) any later version. *
++ * *
++ ***************************************************************************/
++
++#include "qgsslconnect.h"
++
++#include <sqlite3.h>
++#include <spatialite.h>
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++QHash<sqlite3 *, void *> QgsSLConnect::mSLconns;
++#endif
++
++int QgsSLConnect::sqlite3_open( const char *filename, sqlite3 **ppDb )
++{
++#if defined(SPATIALITE_HAS_INIT_EX)
++ void *conn = spatialite_alloc_connection();
++#else
++ spatialite_init( 0 );
++#endif
++
++ int res = ::sqlite3_open( filename, ppDb );
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++ if ( res == SQLITE_OK )
++ {
++ spatialite_init_ex( *ppDb, conn, 0 );
++ mSLconns.insert( *ppDb, conn );
++ }
++#endif
++
++ return res;
++}
++
++int QgsSLConnect::sqlite3_close( sqlite3 *db )
++{
++ int res = ::sqlite3_close( db );
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++ if ( mSLconns.contains( db ) )
++ spatialite_cleanup_ex( mSLconns.take( db ) );
++#endif
++
++ return res;
++}
++
++int QgsSLConnect::sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const char *zVfs )
++{
++#if defined(SPATIALITE_HAS_INIT_EX)
++ void *conn = spatialite_alloc_connection();
++#else
++ spatialite_init( 0 );
++#endif
++
++ int res = ::sqlite3_open_v2( filename, ppDb, flags, zVfs );
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++ if ( res == SQLITE_OK )
++ {
++ spatialite_init_ex( *ppDb, conn, 0 );
++ mSLconns.insert( *ppDb, conn );
++ }
++#endif
++
++ return res;
++}
++
++int QgsSLConnect::sqlite3_close_v2( sqlite3 *db )
++{
++ int res = ::sqlite3_close( db );
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++ if ( mSLconns.contains( db ) )
++ spatialite_cleanup_ex( mSLconns.take( db ) );
++#endif
++
++ return res;
++}
+--- /dev/null
++++ b/src/core/qgsslconnect.h
+@@ -0,0 +1,39 @@
++/***************************************************************************
++ qgsslconnect.h - thin wrapper class to connect to spatialite databases
++ ----------------------
++ begin : May 2015
++ copyright : (C) 2015 by Jürgen fischer
++ email : jef at norbit dot de
++ ***************************************************************************
++ * *
++ * This program is free software; you can redistribute it and/or modify *
++ * it under the terms of the GNU General Public License as published by *
++ * the Free Software Foundation; either version 2 of the License, or *
++ * (at your option) any later version. *
++ * *
++ ***************************************************************************/
++
++#ifndef QGSSLCONNECT_H
++#define QGSSLCONNECT_H
++
++#include <QHash>
++
++class sqlite3;
++
++class CORE_EXPORT QgsSLConnect
++{
++ public:
++ static int sqlite3_open( const char *filename, sqlite3 **ppDb );
++ static int sqlite3_close( sqlite3* );
++
++ static int sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
++ static int sqlite3_close_v2( sqlite3* );
++
++#if defined(SPATIALITE_HAS_INIT_EX)
++ private:
++ static QHash<sqlite3 *, void *> mSLconns;
++#endif
++};
++
++#endif
++
+--- a/src/providers/spatialite/CMakeLists.txt
++++ b/src/providers/spatialite/CMakeLists.txt
+@@ -30,14 +30,6 @@ SET(SPATIALITE_MOC_HDRS
+
+ QT4_WRAP_CPP(SPATIALITE_MOC_SRCS ${SPATIALITE_MOC_HDRS})
+
+-IF(SPATIALITE_VERSION_GE_4_0_0)
+- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_GE_4_0_0")
+-ENDIF(SPATIALITE_VERSION_GE_4_0_0)
+-IF(SPATIALITE_VERSION_G_4_1_1)
+- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSPATIALITE_VERSION_G_4_1_1")
+-ENDIF(SPATIALITE_VERSION_G_4_1_1)
+-
+-
+ INCLUDE_DIRECTORIES(
+ ${QSCINTILLA_INCLUDE_DIR}
+ ../../core
+--- a/src/providers/spatialite/qgsspatialiteconnection.cpp
++++ b/src/providers/spatialite/qgsspatialiteconnection.cpp
+@@ -13,6 +13,7 @@
+ * *
+ ***************************************************************************/
+ #include "qgsspatialiteconnection.h"
++#include "qgsslconnect.h"
+
+ #include <QFileInfo>
+ #include <QSettings>
+@@ -67,7 +68,7 @@ QgsSpatiaLiteConnection::Error QgsSpatia
+ return NotExists;
+ }
+
+- sqlite3* handle = openSpatiaLiteDb( fi.canonicalFilePath() );
++ sqlite3 *handle = openSpatiaLiteDb( fi.canonicalFilePath() );
+ if ( handle == NULL )
+ {
+ return FailedToOpen;
+@@ -138,11 +139,8 @@ sqlite3 *QgsSpatiaLiteConnection::openSp
+ {
+ sqlite3 *handle = NULL;
+ int ret;
+- // activating the SpatiaLite library
+- spatialite_init( 0 );
+-
+ // trying to open the SQLite DB
+- ret = sqlite3_open_v2( path.toUtf8().constData(), &handle, SQLITE_OPEN_READWRITE, NULL );
++ ret = QgsSLConnect::sqlite3_open_v2( path.toUtf8().constData(), &handle, SQLITE_OPEN_READWRITE, NULL );
+ if ( ret )
+ {
+ // failure
+@@ -155,7 +153,7 @@ sqlite3 *QgsSpatiaLiteConnection::openSp
+ void QgsSpatiaLiteConnection::closeSpatiaLiteDb( sqlite3 * handle )
+ {
+ if ( handle )
+- sqlite3_close( handle );
++ QgsSLConnect::sqlite3_close( handle );
+ }
+
+ int QgsSpatiaLiteConnection::checkHasMetadataTables( sqlite3* handle )
+@@ -745,7 +743,7 @@ QgsSqliteHandle* QgsSqliteHandle::openDb
+ }
+
+ QgsDebugMsg( QString( "New sqlite connection for " ) + dbPath );
+- if ( sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, shared ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX, NULL ) )
++ if ( QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, shared ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY | SQLITE_OPEN_NOMUTEX, NULL ) )
+ {
+ // failure
+ QgsDebugMsg( QString( "Failure while connecting to: %1\n%2" )
+@@ -759,7 +757,7 @@ QgsSqliteHandle* QgsSqliteHandle::openDb
+ {
+ // failure
+ QgsDebugMsg( QString( "Failure while connecting to: %1\n\ninvalid metadata tables" ).arg( dbPath ) );
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+ return NULL;
+ }
+ // activating Foreign Key constraints
+@@ -818,7 +816,7 @@ void QgsSqliteHandle::sqliteClose()
+ {
+ if ( sqlite_handle )
+ {
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+ sqlite_handle = NULL;
+ }
+ }
+--- a/src/providers/spatialite/qgsspatialiteconnection.h
++++ b/src/providers/spatialite/qgsspatialiteconnection.h
+@@ -124,8 +124,6 @@ class QgsSpatiaLiteConnection : public Q
+ QList<TableEntry> mTables;
+ };
+
+-
+-
+ class QgsSqliteHandle
+ {
+ //
+--- a/src/providers/spatialite/qgsspatialiteprovider.cpp
++++ b/src/providers/spatialite/qgsspatialiteprovider.cpp
+@@ -14,24 +14,23 @@ email : a.furieri at lqt.it
+ * *
+ ***************************************************************************/
+
+-#include <qgis.h>
+-#include <qgsapplication.h>
+-#include <qgsfeature.h>
+-#include <qgsfield.h>
+-#include <qgsgeometry.h>
+-#include <qgsmessageoutput.h>
+-#include <qgsrectangle.h>
+-#include <qgscoordinatereferencesystem.h>
++#include "qgis.h"
++#include "qgsapplication.h"
++#include "qgsfeature.h"
++#include "qgsfield.h"
++#include "qgsgeometry.h"
++#include "qgsmessageoutput.h"
++#include "qgsrectangle.h"
++#include "qgscoordinatereferencesystem.h"
+ #include "qgslogger.h"
+ #include "qgsmessagelog.h"
+ #include "qgsvectorlayerimport.h"
+-
+-#include <QMessageBox>
+-
++#include "qgsslconnect.h"
+ #include "qgsspatialiteprovider.h"
+ #include "qgsspatialiteconnpool.h"
+ #include "qgsspatialitefeatureiterator.h"
+
++#include <QMessageBox>
+ #include <QFileInfo>
+ #include <QDir>
+
+@@ -43,8 +42,6 @@ const QString SPATIALITE_KEY = "spatiali
+ const QString SPATIALITE_DESCRIPTION = "SpatiaLite data provider";
+
+
+-
+-
+ bool QgsSpatiaLiteProvider::convertField( QgsField &field )
+ {
+ QString fieldType = "TEXT"; //default to string
+@@ -96,6 +93,7 @@ bool QgsSpatiaLiteProvider::convertField
+ return true;
+ }
+
++
+ QgsVectorLayerImport::ImportError
+ QgsSpatiaLiteProvider::createEmptyLayer(
+ const QString& uri,
+@@ -133,9 +131,8 @@ QgsSpatiaLiteProvider::createEmptyLayer(
+ QString sql;
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( sqlitePath );
+- if ( handle == NULL )
++ if ( !handle )
+ {
+ QgsDebugMsg( "Connection to database failed. Import of layer aborted." );
+ if ( errorMessage )
+@@ -182,12 +179,13 @@ QgsSpatiaLiteProvider::createEmptyLayer(
+ if ( primaryKeyType.isEmpty() )
+ {
+ primaryKeyType = "INTEGER";
+- /* TODO
++#if 0 // TODO
+ // check the feature count to choose if create a bigint pk field
+ if ( layer->featureCount() > 0xFFFFFF )
+ {
+ primaryKeyType = "BIGINT";
+- }*/
++ }
++#endif
+ }
+
+ try
+@@ -408,7 +406,6 @@ QgsSpatiaLiteProvider::createEmptyLayer(
+ }
+
+
+-
+ QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
+ : QgsVectorDataProvider( uri )
+ , valid( false )
+@@ -439,9 +436,8 @@ QgsSpatiaLiteProvider::QgsSpatiaLiteProv
+ mQuery = mTableName;
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( mSqlitePath );
+- if ( handle == NULL )
++ if ( !handle )
+ {
+ return;
+ }
+@@ -5058,15 +5054,14 @@ QGISEXTERN bool createDb( const QString&
+ QDir().mkpath( path.absolutePath() );
+
+ // creating/opening the new database
+- spatialite_init( 0 );
+ sqlite3 *sqlite_handle;
+- int ret = sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
++ int ret = QgsSLConnect::sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL );
+ if ( ret )
+ {
+ // an error occurred
+ errCause = QObject::tr( "Could not create a new database\n" );
+ errCause += QString::fromUtf8( sqlite3_errmsg( sqlite_handle ) );
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+ return false;
+ }
+ // activating Foreign Key constraints
+@@ -5076,13 +5071,13 @@ QGISEXTERN bool createDb( const QString&
+ {
+ errCause = QObject::tr( "Unable to activate FOREIGN_KEY constraints [%1]" ).arg( errMsg );
+ sqlite3_free( errMsg );
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+ return false;
+ }
+ bool init_res = ::initializeSpatialMetadata( sqlite_handle, errCause );
+
+ // all done: closing the DB connection
+- sqlite3_close( sqlite_handle );
++ QgsSLConnect::sqlite3_close( sqlite_handle );
+
+ return init_res;
+ }
+@@ -5093,7 +5088,6 @@ QGISEXTERN bool deleteLayer( const QStri
+ {
+ QgsDebugMsg( "deleting layer " + tableName );
+
+- spatialite_init( 0 );
+ QgsSqliteHandle* hndl = QgsSqliteHandle::openDb( dbPath );
+ if ( !hndl )
+ {
+@@ -5174,9 +5168,8 @@ QGISEXTERN bool saveStyle( const QString
+ QgsDebugMsg( "Database is: " + sqlitePath );
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( sqlitePath );
+- if ( NULL == handle )
++ if ( !handle )
+ {
+ QgsDebugMsg( "Connection to database failed. Save style aborted." );
+ errCause = QObject::tr( "Connection to database failed" );
+@@ -5364,9 +5357,8 @@ QGISEXTERN QString loadStyle( const QStr
+ QgsDebugMsg( "Database is: " + sqlitePath );
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( sqlitePath );
+- if ( NULL == handle )
++ if ( !handle )
+ {
+ QgsDebugMsg( "Connection to database failed. Save style aborted." );
+ errCause = QObject::tr( "Connection to database failed" );
+@@ -5420,7 +5412,6 @@ QGISEXTERN int listStyles( const QString
+ QgsDebugMsg( "Database is: " + sqlitePath );
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( sqlitePath );
+ if ( NULL == handle )
+ {
+@@ -5533,9 +5524,8 @@ QGISEXTERN QString getStyleById( const Q
+ QgsDebugMsg( "Database is: " + sqlitePath );
+
+ // trying to open the SQLite DB
+- spatialite_init( 0 );
+ handle = QgsSqliteHandle::openDb( sqlitePath );
+- if ( NULL == handle )
++ if ( !handle )
+ {
+ QgsDebugMsg( "Connection to database failed. Save style aborted." );
+ errCause = QObject::tr( "Connection to database failed" );
+--- a/src/providers/spatialite/qspatialite/CMakeLists.txt
++++ b/src/providers/spatialite/qspatialite/CMakeLists.txt
+@@ -17,6 +17,7 @@ TARGET_LINK_LIBRARIES(qsqlspatialite
+ ${QT_QTSQL_LIBRARY}
+ ${SQLITE3_LIBRARY}
+ ${SPATIALITE_LIBRARY}
++ qgis_core
+ )
+
+ INSTALL(TARGETS qsqlspatialite
+--- a/src/providers/spatialite/qspatialite/qsql_spatialite.cpp
++++ b/src/providers/spatialite/qspatialite/qsql_spatialite.cpp
+@@ -58,7 +58,7 @@
+ #endif
+
+ #include <sqlite3.h>
+-#include <spatialite.h>
++#include <qgsslconnect.h>
+
+ Q_DECLARE_METATYPE(sqlite3*)
+ Q_DECLARE_METATYPE(sqlite3_stmt*)
+@@ -548,8 +548,6 @@ bool QSpatiaLiteDriver::open(const QStri
+ if (db.isEmpty())
+ return false;
+
+- spatialite_init(0);
+-
+ bool sharedCache = false;
+ int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000;
+ QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';'));
+@@ -568,7 +566,7 @@ bool QSpatiaLiteDriver::open(const QStri
+
+ sqlite3_enable_shared_cache(sharedCache);
+
+- if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
++ if (QgsSLConnect::sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
+ sqlite3_busy_timeout(d->access, timeOut);
+ setOpen(true);
+ setOpenError(false);
+@@ -587,7 +585,7 @@ void QSpatiaLiteDriver::close()
+ foreach (QSpatiaLiteResult *result, d->results)
+ result->d->finalize();
+
+- if (sqlite3_close(d->access) != SQLITE_OK)
++ if (QgsSLConnect::sqlite3_close(d->access) != SQLITE_OK)
+ setLastError(qMakeError(d->access, tr("Error closing database"),
+ QSqlError::ConnectionError));
+ d->access = 0;
diff --git a/debian/patches/series b/debian/patches/series
index 42ae00f..9ecb18e 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -5,3 +5,4 @@ developersmap-use-debian-package.patch
exclude-dxf2shp-plugin.patch
exclude-elvensword-resources.patch
0001-fix-arm-build.patch
+0001-adopt-new-spatialite-initialization-scheme-via-thin-.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/qgis.git
More information about the Pkg-grass-devel
mailing list