[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