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 <sebas...@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 <sebas...@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" <j...@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.furi...@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 _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel