[QGIS Commit] r13250 - in trunk/qgis: debian python/core src/app
src/core src/providers/spatialite src/ui
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Mon Apr 5 13:16:27 EDT 2010
Author: jef
Date: 2010-04-05 13:16:25 -0400 (Mon, 05 Apr 2010)
New Revision: 13250
Modified:
trunk/qgis/debian/control.sid
trunk/qgis/python/core/qgsapplication.sip
trunk/qgis/src/app/qgisapp.cpp
trunk/qgis/src/app/qgsnewspatialitelayerdialog.cpp
trunk/qgis/src/app/qgsnewspatialitelayerdialog.h
trunk/qgis/src/app/qgsspatialitesourceselect.cpp
trunk/qgis/src/app/qgsspatialitesridsdialog.cpp
trunk/qgis/src/app/qgsspatialitesridsdialog.h
trunk/qgis/src/core/qgsapplication.h
trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.cpp
trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.h
trunk/qgis/src/ui/qgsnewspatialitelayerdialogbase.ui
Log:
spatialite improvements:
- support geometry column name
- remove unnecessary id field
- fix windows build
- better identifier quoting and utf-8 support
- update python binding
- fix some translation strings
Modified: trunk/qgis/debian/control.sid
===================================================================
--- trunk/qgis/debian/control.sid 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/debian/control.sid 2010-04-05 17:16:25 UTC (rev 13250)
@@ -8,7 +8,7 @@
sharutils, sip4 (>= 4.5), libqt4-core (>=4.4.0), libqt4-dev (>=4.4.0), libqt4-gui (>=4.4.0),
libqt4-sql (>=4.4.0), python-qt4 (>=4.1.0), python-qt4-dev (>=4.1.0),
python-sip4-dev (>= 4.5.0), libfontconfig1-dev, libxi-dev, libxrandr-dev, libxrender-dev, libice-dev,
- libsm-dev, pyqt4-dev-tools, libqwt5-qt4-dev
+ libsm-dev, pyqt4-dev-tools, libqwt5-qt4-dev, libspatialite-dev
Build-Conflicts: libqgis-dev, qgis-dev
Standards-Version: 3.8.4
XS-Python-Version: current
Modified: trunk/qgis/python/core/qgsapplication.sip
===================================================================
--- trunk/qgis/python/core/qgsapplication.sip 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/python/core/qgsapplication.sip 2010-04-05 17:16:25 UTC (rev 13250)
@@ -133,6 +133,10 @@
//! Returns the path to the master qgis.db file.
static const QString qgisMasterDbFilePath();
+ //! Returns the path to the spatialite template db file.
+ //! @note added in 1.5
+ static const QString qgisSpatialiteDbTemplatePath();
+
//! Returns the path to the settings directory in user's home dir
static const QString qgisSettingsDirPath();
Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgisapp.cpp 2010-04-05 17:16:25 UTC (rev 13250)
@@ -213,6 +213,11 @@
#include "postgres/qgspgsourceselect.h"
#endif
#ifdef HAVE_SPATIALITE
+extern "C"
+{
+#include <sqlite3.h>
+#include <spatialite.h>
+}
#include "qgsspatialitesourceselect.h"
#include "qgsnewspatialitelayerdialog.h"
#endif
@@ -937,15 +942,15 @@
// Layer Menu Items
- mActionNewVectorLayer = new QAction( getThemeIcon( "mActionNewVectorLayer.png" ), tr( "New Vector Layer (shapefile)..." ), this );
- shortcuts->registerAction( mActionNewVectorLayer, tr( "Ctrl+Shift+N", "Create a New Vector Layer (shapefile)" ) );
- mActionNewVectorLayer->setStatusTip( tr( "Create a New Vector Layer (shapefile)" ) );
+ mActionNewVectorLayer = new QAction( getThemeIcon( "mActionNewVectorLayer.png" ), tr( "New Shapefile Layer..." ), this );
+ shortcuts->registerAction( mActionNewVectorLayer, tr( "Ctrl+Shift+N", "Create a New Shapefile layer" ) );
+ mActionNewVectorLayer->setStatusTip( tr( "Create a New Shapefile layer" ) );
connect( mActionNewVectorLayer, SIGNAL( triggered() ), this, SLOT( newVectorLayer() ) );
#ifdef HAVE_SPATIALITE
- mActionNewSpatialiteLayer = new QAction( getThemeIcon( "mActionNewVectorLayer.png" ), tr( "New Spatialite Layer ..." ), this );
- shortcuts->registerAction( mActionNewSpatialiteLayer, tr( "Ctrl+Shift+S", "Create a New Spatialite Layer " ) );
- mActionNewSpatialiteLayer->setStatusTip( tr( "Create a New Spatialite Layer " ) );
+ mActionNewSpatialiteLayer = new QAction( getThemeIcon( "mActionNewVectorLayer.png" ), tr( "New SpatiaLite Layer ..." ), this );
+ shortcuts->registerAction( mActionNewSpatialiteLayer, tr( "Ctrl+Shift+S", "Create a New SpatiaLite Layer " ) );
+ mActionNewSpatialiteLayer->setStatusTip( tr( "Create a New SpatiaLite Layer " ) );
connect( mActionNewSpatialiteLayer, SIGNAL( triggered() ), this, SLOT( newSpatialiteLayer() ) );
#endif
@@ -1420,13 +1425,13 @@
mLayerMenu = menuBar()->addMenu( tr( "&Layer" ) );
#ifdef HAVE_SPATIALITE
- QMenu *newLayerMenu = mLayerMenu->addMenu( tr( "New ") );
+ QMenu *newLayerMenu = mLayerMenu->addMenu( tr( "New" ) );
newLayerMenu->addAction( mActionNewVectorLayer );
newLayerMenu->addAction( mActionNewSpatialiteLayer );
#else
mLayerMenu->addAction( mActionNewVectorLayer );
#endif
-
+
mLayerMenu->addAction( mActionAddOgrLayer );
mLayerMenu->addAction( mActionAddRasterLayer );
#ifdef HAVE_POSTGRESQL
@@ -3097,6 +3102,18 @@
addVectorLayers( fileNames, enc, "file" );
}
+static QString quotedIdentifier( QString id )
+{
+ id.replace( "\"", "\"\"" );
+ return id.prepend( "\"" ).append( "\"" );
+}
+
+static QString quotedValue( QString value )
+{
+ value.replace( "'", "''" );
+ return value.prepend( "'" ).append( "'" );
+}
+
void QgisApp::newSpatialiteLayer()
{
if ( mMapCanvas && mMapCanvas->isDrawing() )
@@ -3115,6 +3132,7 @@
QString crsId = spatialiteDialog.selectedCrsId();
QString databaseName = spatialiteDialog.databaseName();
QString newLayerName = spatialiteDialog.layerName();
+ QString newGeometryColumn = spatialiteDialog.geometryColumn();
//QgsDebugMsg( QString( "New file format will be: %1" ).arg( fileformat ) );
// Get the list containing the name/type pairs for each attribute
@@ -3122,188 +3140,95 @@
// Build up the sql statement for creating the table
//
- QString sql = QString("create table %1 (id integer primary key autoincrement").arg(newLayerName);
+ QString sql = QString( "create table %1(" ).arg( quotedIdentifier( newLayerName ) );
// iterate through the field names and add them to the create statement
// (use indexed access since this is just as fast as iterators
- for ( int i = 0; i < items->size(); ++i )
+ for ( int i = 0; i < items->size(); ++i )
{
- QStringList field = items->at(i);
- sql += QString(", %1 %2").arg(field.at(0)).arg(field.at(1));
+ QStringList field = items->at( i );
+ if ( i > 0 )
+ sql += ",";
+ sql += QString( "%1 %2" ).arg( quotedIdentifier( field.at( 0 ) ) ).arg( field.at( 1 ) );
}
// complete the create table statement
sql += ")";
- std::cout << "Creating table in database " << databaseName.toUtf8().data() << std::endl;
- std::cout << sql.toUtf8().data() << std::endl; // OK
+ QgsDebugMsg( QString( "Creating table in database %1" ).arg( databaseName ) );
+ QgsDebugMsg( sql ); // OK
- QString sqlAddGeom = QString("select AddGeometryColumn('%1', 'geom', %2, '%3', 2)").arg(newLayerName).arg(crsId).arg(geometrytype);
- std::cout << sqlAddGeom.toUtf8().data() << std::endl; // OK
- QString sqlCreateIndex = QString("select CreateSpatialIndex('%1', 'geom')").arg(newLayerName);
- std::cout << sqlCreateIndex.toUtf8().data() << std::endl; // OK
+ QString sqlAddGeom = QString( "select AddGeometryColumn(%1,%2,%3,%4,2)" )
+ .arg( quotedValue( newLayerName ) )
+ .arg( quotedValue( newGeometryColumn ) )
+ .arg( crsId )
+ .arg( quotedValue( geometrytype ) );
+ QgsDebugMsg( sqlAddGeom ); // OK
+ QString sqlCreateIndex = QString( "select CreateSpatialIndex(%1,%2)" ).arg( quotedValue( newLayerName ) ).arg( quotedValue( newGeometryColumn ) );
+ QgsDebugMsg( sqlCreateIndex ); // OK
+
+ spatialite_init( 0 );
+
sqlite3 *db;
int rc = sqlite3_open( databaseName.toUtf8(), &db );
if ( rc != SQLITE_OK )
{
- QMessageBox::warning( this, "Spatialite Database", tr( "Unable to open the database: %1").arg(databaseName ) );
+ QMessageBox::warning( this,
+ tr( "SpatiaLite Database" ),
+ tr( "Unable to open the database: %1" ).arg( databaseName ) );
}
else
{
char * errmsg;
- rc = sqlite3_exec( db, sql.toUtf8(), NULL, NULL, &errmsg);
+ rc = sqlite3_exec( db, sql.toUtf8(), NULL, NULL, &errmsg );
if ( rc != SQLITE_OK )
{
- QMessageBox::warning( this, tr( "Error deleting bookmark" ),
- tr( "Failed to create the Spatialite table %1. The database returned:\n%2" ).arg( newLayerName ).arg( errmsg ) );
+ QMessageBox::warning( this,
+ tr( "Error Creating SpatiaLite Table" ),
+ tr( "Failed to create the SpatiaLite table %1. The database returned:\n%2" ).arg( newLayerName ).arg( errmsg ) );
sqlite3_free( errmsg );
}
else
{
// create the geometry column and the spatial index
- rc = sqlite3_exec( db, sqlAddGeom.toUtf8(), NULL, NULL, &errmsg);
+ rc = sqlite3_exec( db, sqlAddGeom.toUtf8(), NULL, NULL, &errmsg );
if ( rc != SQLITE_OK )
{
- QMessageBox::warning( this, tr( "Error Creating Geometry Column" ),
- tr( "Failed to create the geometry column. The database returned:\n%1" ).arg( errmsg ) );
+ QMessageBox::warning( this,
+ tr( "Error Creating Geometry Column" ),
+ tr( "Failed to create the geometry column. The database returned:\n%1" ).arg( errmsg ) );
sqlite3_free( errmsg );
}
else
{
- // create the spatial index
- rc = sqlite3_exec( db, sqlCreateIndex.toUtf8(), NULL, NULL, &errmsg);
- if ( rc != SQLITE_OK )
- {
- QMessageBox::warning( this, tr( "Error Creating Spatial Index" ),
- tr( "Failed to create the spatial index. The database returned:\n%1" ).arg( errmsg ) );
- sqlite3_free( errmsg );
- }
- }
- }
+ // create the spatial index
+ rc = sqlite3_exec( db, sqlCreateIndex.toUtf8(), NULL, NULL, &errmsg );
+ if ( rc != SQLITE_OK )
+ {
+ QMessageBox::warning( this,
+ tr( "Error Creating Spatial Index" ),
+ tr( "Failed to create the spatial index. The database returned:\n%1" ).arg( errmsg ) );
+ sqlite3_free( errmsg );
+ }
-
- }
-
-
- /*
- bool haveLastUsedFilter = false; // by default, there is no last
- // used filter
- QString enc;
- QString fileName;
-
- QSettings settings; // where we keep last used filter in
- // persistent state
-
- haveLastUsedFilter = settings.contains( "/UI/lastVectorFileFilter" );
- QString lastUsedFilter = settings.value( "/UI/lastVectorFileFilter",
- QVariant( QString::null ) ).toString();
-
- QString lastUsedDir = settings.value( "/UI/lastVectorFileFilterDir",
- "." ).toString();
-
- QgsDebugMsg( "Saving vector file dialog without filters: " );
-
- QgsEncodingFileDialog* openFileDialog = new QgsEncodingFileDialog( this,
- tr( "Save As" ), lastUsedDir, "", QString( "" ) );
-
- // allow for selection of more than one file
- openFileDialog->setFileMode( QFileDialog::AnyFile );
- openFileDialog->setAcceptMode( QFileDialog::AcceptSave );
- openFileDialog->setConfirmOverwrite( true );
-
- if ( haveLastUsedFilter ) // set the filter to the last one used
- {
- openFileDialog->selectFilter( lastUsedFilter );
- }
-
- int res;
- while (( res = openFileDialog->exec() ) == QDialog::Accepted )
- {
- fileName = openFileDialog->selectedFiles().first();
-
- if ( fileformat == "ESRI Shapefile" )
- {
- if ( !isValidShapeFileName( fileName ) )
- {
- fileName += ".shp";
+ QgsVectorLayer *layer = new QgsVectorLayer( QString( "dbname=%1 table=%2(%3) sql=" )
+ .arg( databaseName )
+ .arg( newLayerName )
+ .arg( newGeometryColumn ), newLayerName, "spatialite" );
+ if ( layer->isValid() )
+ {
+ // register this layer with the central layers registry
+ QgsMapLayerRegistry::instance()->addMapLayer( layer );
+ }
+ else
+ {
+ QgsDebugMsg( newLayerName + " is an invalid layer - not loaded" );
+ QMessageBox::critical( this, tr( "Invalid Layer" ), tr( "%1 is an invalid layer and cannot be loaded." ).arg( newLayerName ) );
+ delete layer;
+ }
}
-
- if ( !isValidShapeFileName( fileName ) )
- {
- QMessageBox::information( this,
- tr( "New Shapefile" ),
- tr( "Shapefiles must end on .shp" ) );
- continue;
- }
}
-
- break;
}
-
- if ( res == QDialog::Rejected )
- {
- delete openFileDialog;
- return;
- }
-
- enc = openFileDialog->encoding();
-
- // If the file exists, delete it otherwise we'll end up loading that
- // file, which can cause problems (e.g., if the file contains
- // linestrings, but we're wanting to create points, we'll end up
- // with a linestring file).
- if ( fileformat == "ESRI Shapefile" )
- {
- QgsVectorFileWriter::deleteShapeFile( fileName );
- }
- else
- {
- QFile::remove( fileName );
- }
-
- settings.setValue( "/UI/lastVectorFileFilter", openFileDialog->selectedFilter() );
-
- settings.setValue( "/UI/lastVectorFileFilterDir", openFileDialog->directory().absolutePath() );
-
- delete openFileDialog;
-
- //try to create the new layer with OGRProvider instead of QgsVectorFileWriter
- QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
- QString ogrlib = pReg->library( "ogr" );
- // load the data provider
- QLibrary* myLib = new QLibrary( ogrlib );
- bool loaded = myLib->load();
- if ( loaded )
- {
- QgsDebugMsg( "ogr provider loaded" );
-
- typedef bool ( *createEmptyDataSourceProc )( const QString&, const QString&, const QString&, QGis::WkbType,
- const std::list<std::pair<QString, QString> >&, const QgsCoordinateReferenceSystem * );
- createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc ) cast_to_fptr( myLib->resolve( "createEmptyDataSource" ) );
- if ( createEmptyDataSource )
- {
- if ( geometrytype != QGis::WKBUnknown )
- {
- QgsCoordinateReferenceSystem srs( crsId, QgsCoordinateReferenceSystem::InternalCrsId );
- createEmptyDataSource( fileName, fileformat, enc, geometrytype, attributes, &srs );
- }
- else
- {
- QgsDebugMsg( "geometry type not recognised" );
- return;
- }
- }
- else
- {
- QgsDebugMsg( "Resolving newEmptyDataSource(...) failed" );
- }
- }
-
- //then add the layer to the view
- QStringList fileNames;
- fileNames.append( fileName );
- //todo: the last parameter will change accordingly to layer type
- addVectorLayers( fileNames, enc, "file" );
- */
}
+
void QgisApp::fileOpen()
{
if ( mMapCanvas && mMapCanvas->isDrawing() )
@@ -5026,6 +4951,7 @@
mActionPluginSeparator2 = mPluginMenu->addSeparator();
mPluginMenu->addAction( mActionShowPythonDialog );
std::cout << "Python support ENABLED :-) " << std::endl; // OK
+
}
}
Modified: trunk/qgis/src/app/qgsnewspatialitelayerdialog.cpp
===================================================================
--- trunk/qgis/src/app/qgsnewspatialitelayerdialog.cpp 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgsnewspatialitelayerdialog.cpp 2010-04-05 17:16:25 UTC (rev 13250)
@@ -18,20 +18,14 @@
***************************************************************************/
/* $Id$ */
-/*
-extern "C"
-{
-#include <spatialite/sqlite3.h>
-#include <spatialite/gaiageo.h>
-#include <spatialite.h>
-}
-*/
+
#include "qgsnewspatialitelayerdialog.h"
+
#include "qgsspatialitesridsdialog.h"
#include "qgsapplication.h"
#include "qgisapp.h" // <- for theme icons
#include "qgslogger.h"
-//#include <sqlite3.h>
+
#include <QPushButton>
#include <QSettings>
#include <QLineEdit>
@@ -66,10 +60,9 @@
++it;
}
settings.endGroup();
- mApplyButton = buttonBox->button( QDialogButtonBox::Apply );
- mApplyButton->setEnabled( false );
- mApplyButton->setDefault( true );
- connect( buttonBox->button( QDialogButtonBox::Apply ), SIGNAL( clicked() ), this, SLOT( apply() ) );
+ mOkButton = buttonBox->button( QDialogButtonBox::Ok );
+ mOkButton->setEnabled( false );
+ mOkButton->setDefault( true );
// Set the SRID box to a default of WGS84
leSRID->setText( "4326" );
@@ -85,17 +78,17 @@
void QgsNewSpatialiteLayerDialog::createNewDb()
{
// QMessageBox::information( 0, tr( "Spatialite Layer" ), tr( "Create new db clicked" ) );
- QString fileName = QFileDialog::getSaveFileName(this, tr("New Spatialite Database File"),
- ".",
- tr("Spatialite (*.sqlite *.db )"));
+ QString fileName = QFileDialog::getSaveFileName( this, tr( "New SpatiaLite Database File" ),
+ ".",
+ tr( "SpatiaLite (*.sqlite *.db )" ) );
if ( !fileName.isEmpty() )
{
mDatabaseComboBox->insertItem( 0, fileName );
- mDatabaseComboBox->setCurrentIndex(0);
+ mDatabaseComboBox->setCurrentIndex( 0 );
createDb();
needNewDb = true;
- }
+ }
}
void QgsNewSpatialiteLayerDialog::on_mTypeBox_currentIndexChanged( int index )
{
@@ -136,6 +129,9 @@
{
return "MULTIPOLYGON";
}
+
+ Q_ASSERT( "no type selected" == 0 );
+ return "";
}
QString QgsNewSpatialiteLayerDialog::selectedCrsId() const
@@ -143,67 +139,11 @@
return leSRID->text();
}
-void QgsNewSpatialiteLayerDialog::apply()
-{
- // Check to see if the db exists and if not create it
- createDb();
-
- // Init spatialite
- spatialite_init( 0 );
- QString newLayerName = leLayerName->text();
- int rc = sqlite3_open_v2( mDatabaseComboBox->currentText().toUtf8(), &db, SQLITE_OPEN_READWRITE, NULL );
- if ( rc != SQLITE_OK )
- {
- QMessageBox::warning( this, "Spatialite Database", tr( "Unable to open the database"));
- }
- else
- {
- char * errmsg;
- QString sql = QString("CREATE TABLE %1 (id integer primary key autoincrement, name text)").arg( newLayerName );
- rc = sqlite3_exec( db, sql.toUtf8(), NULL, NULL, &errmsg);
- if ( rc != SQLITE_OK )
- {
- QMessageBox::warning( this, tr( "Error Creating Table" ),
- tr( "Failed to create the Spatialite table. The database returned:\n%1" ).arg( errmsg ) );
- sqlite3_free( errmsg );
- }
- else
- {
- // get the geometry type
- QString geomType = selectedType();
- // create the geometry column and the spatial index
- sql = QString("select AddGeometryColumn('%1', 'geom', %2, '%3', 2)").arg( newLayerName ).arg( leSRID->text() ).arg( geomType );
- rc = sqlite3_exec( db, sql.toUtf8(), NULL, NULL, &errmsg);
- if ( rc != SQLITE_OK )
- {
- QMessageBox::warning( this, tr( "Error Creating Geometry Column" ),
- tr( "Failed to create the geometry column. The database returned:\n%1" ).arg( errmsg ) );
- sqlite3_free( errmsg );
- }
- else
- {
- // create the spatial index
- sql = QString("select CreateSpatialIndex('%1', 'geom')").arg( newLayerName );
- rc = sqlite3_exec( db, sql.toUtf8(), NULL, NULL, &errmsg);
- if ( rc != SQLITE_OK )
- {
- QMessageBox::warning( this, tr( "Error Creating Spatial Index" ),
- tr( "Failed to create the spatial index. The database returned:\n%1" ).arg( errmsg ) );
- sqlite3_free( errmsg );
- }
- else
- {
- QMessageBox::information( 0, tr( "Spatialite Layer" ), tr( "Layer created" ) );
- }
- }
- }
- }
-}
void QgsNewSpatialiteLayerDialog::on_leLayerName_textChanged( QString text )
{
- if ( leLayerName->text().length() > 0 && mAttributeView->topLevelItemCount() > 0)
+ if ( leLayerName->text().length() > 0 && mAttributeView->topLevelItemCount() > 0 )
{
- mApplyButton->setEnabled( true );
+ mOkButton->setEnabled( true );
}
}
@@ -214,10 +154,10 @@
QString myName = mNameEdit->text();
//use userrole to avoid translated type string
QString myType = mTypeBox->itemData( mTypeBox->currentIndex(), Qt::UserRole ).toString();
- mAttributeView->addTopLevelItem( new QTreeWidgetItem( QStringList() << myName << myType ) );
+ mAttributeView->addTopLevelItem( new QTreeWidgetItem( QStringList() << myName << myType ) );
if ( mAttributeView->topLevelItemCount() > 0 && leLayerName->text().length() > 0 )
{
- mApplyButton->setEnabled( true );
+ mOkButton->setEnabled( true );
}
mNameEdit->clear();
}
@@ -228,7 +168,7 @@
delete mAttributeView->currentItem();
if ( mAttributeView->topLevelItemCount() == 0 )
{
- mApplyButton->setEnabled( false );
+ mOkButton->setEnabled( false );
}
}
@@ -238,11 +178,11 @@
int rc = sqlite3_open( mDatabaseComboBox->currentText().toUtf8().data(), &db );
if ( rc != SQLITE_OK )
{
- QMessageBox::warning( this, "Spatialite Database", tr( "Unable to open the database: %1").arg(mDatabaseComboBox->currentText() ) );
+ QMessageBox::warning( this, tr( "Spatialite Database" ), tr( "Unable to open the database: %1").arg(mDatabaseComboBox->currentText() ) );
}
*/
// set the SRID from a list returned from the selected Spatialite database
- QgsSpatialiteSridsDialog *sridDlg = new QgsSpatialiteSridsDialog(this);
+ QgsSpatialiteSridsDialog *sridDlg = new QgsSpatialiteSridsDialog( this );
if ( sridDlg->load( mDatabaseComboBox->currentText() ) )
{
if ( sridDlg->exec() )
@@ -255,7 +195,7 @@
}
}
-// Create a QList of QStringList objects that define the layer attributes.
+// Create a QList of QStringList objects that define the layer attributes.
// Each QStringList contains the field name and its type.
QList<QStringList> * QgsNewSpatialiteLayerDialog::attributes() const
{
@@ -267,8 +207,8 @@
QStringList items;
items << item->text( 0 );
items << item->text( 1 );
- list->append(items);
-
+ list->append( items );
+
//QString type = QString( "%1;%2;%3" ).arg( item->text( 1 ) ).arg( item->text( 2 ) ).arg( item->text( 3 ) );
//at.push_back( std::make_pair( item->text( 0 ), type ) );
//QgsDebugMsg( QString( "appending %1//%2" ).arg( item->text( 0 ) ).arg( type ) );
@@ -286,6 +226,12 @@
{
return leLayerName->text();
}
+
+QString QgsNewSpatialiteLayerDialog::geometryColumn() const
+{
+ return leGeometryColumn->text();
+}
+
bool QgsNewSpatialiteLayerDialog::createDb()
{
QFile newDb( mDatabaseComboBox->currentText() );
@@ -298,28 +244,24 @@
QFileInfo fullPath = QFileInfo( mDatabaseComboBox->currentText() );
QDir path = fullPath.dir();
- qWarning("making this dir: %s", path.absolutePath().toUtf8().data());
+ qWarning( "making this dir: %s", path.absolutePath().toUtf8().data() );
-
// Must be sure there is destination directory ~/.qgis
QDir().mkpath( path.absolutePath( ) );
- qWarning("Copying %s ", spatialiteTemplate.toUtf8().data());
- qWarning("to %s", newDb.fileName().toUtf8().data());
+ qWarning( "Copying %s ", spatialiteTemplate.toUtf8().data() );
+ qWarning( "to %s", newDb.fileName().toUtf8().data() );
//now copy the template db file into the chosen location
- bool isDbFileCopied = spatialiteTemplateDb.copy( newDb.fileName() );
-
- if ( !isDbFileCopied )
+ if ( !spatialiteTemplateDb.copy( newDb.fileName() ) )
{
- // QMessageBox::warning( this, "Spatialite Database", tr( "Unable to copy the template database to your new location" ));
+ QMessageBox::warning( 0, tr( "SpatiaLite Database" ), tr( "Could not copy the template database to new location" ) );
return false;
}
else
{
- QMessageBox::information( 0, tr( "Spatialite Database" ), tr( "Created new database!" ) );
+ QMessageBox::information( 0, tr( "SpatiaLite Database" ), tr( "Created new database!" ) );
}
}
- return true;
+ return true;
}
-
Modified: trunk/qgis/src/app/qgsnewspatialitelayerdialog.h
===================================================================
--- trunk/qgis/src/app/qgsnewspatialitelayerdialog.h 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgsnewspatialitelayerdialog.h 2010-04-05 17:16:25 UTC (rev 13250)
@@ -1,7 +1,7 @@
/***************************************************************************
QgsNewSpatialiteLayerDialog.h - description
-------------------
- begin : 2010-03-19
+ begin : 2010-03-19
copyright : (C) 2010 by Gary Sherman
email : gsherman at mrcc.com
***************************************************************************/
@@ -17,18 +17,18 @@
/* $Id$ */
#ifndef qgsnewspatialitelayerdialog_H
#define qgsnewspatialitelayerdialog_H
-#include <sqlite3.h>
-extern "C"
-{
-#include <spatialite/headers/spatialite.h>
-}
-//#include <sqlite3.h>
+
#include "ui_qgsnewspatialitelayerdialogbase.h"
#include "qgisgui.h"
#include "qgscontexthelp.h"
#include "qgis.h"
+extern "C"
+{
+#include <sqlite3.h>
+}
+
class QgsNewSpatialiteLayerDialog: public QDialog, private Ui::QgsNewSpatialiteLayerDialogBase
{
Q_OBJECT
@@ -45,6 +45,8 @@
QString databaseName() const;
/**Returns the layer name to be created */
QString layerName() const;
+ /**Returns the geometry column name */
+ QString geometryColumn() const;
/**Returns the selected crs id*/
QString selectedCrsId() const;
/** Create a new database */
@@ -57,11 +59,11 @@
void on_pbnFindSRID_clicked();
void on_leLayerName_textChanged( QString text );
void createNewDb();
- void apply();
+
void on_buttonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }
private:
- QPushButton *mApplyButton;
+ QPushButton *mOkButton;
int mCrsId;
sqlite3 *db;
bool needNewDb;
Modified: trunk/qgis/src/app/qgsspatialitesourceselect.cpp
===================================================================
--- trunk/qgis/src/app/qgsspatialitesourceselect.cpp 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgsspatialitesourceselect.cpp 2010-04-05 17:16:25 UTC (rev 13250)
@@ -300,7 +300,7 @@
QString myFile = QFileDialog::getOpenFileName( this,
tr( "Choose a SpatiaLite/SQLite DB to open" ),
- lastUsedDir, QObject::tr( "SQLite DB (*.sqlite);;All files (*.*)" ) );
+ lastUsedDir, QObject::tr( "SQLite DB (*.sqlite *.db);;All files (*.*)" ) );
if ( myFile.isEmpty() )
return;
@@ -507,8 +507,8 @@
{
for ( i = 1; i <= rows; i++ )
{
- QString tableName = results[( i * columns ) + 0];
- QString column = results[( i * columns ) + 1];
+ QString tableName = QString::fromUtf8( results[( i * columns ) + 0] );
+ QString column = QString::fromUtf8( results[( i * columns ) + 1] );
QString type = results[( i * columns ) + 2];
if ( isDeclaredHidden( handle, tableName, column ) )
continue;
@@ -534,8 +534,8 @@
{
for ( i = 1; i <= rows; i++ )
{
- QString tableName = results[( i * columns ) + 0];
- QString column = results[( i * columns ) + 1];
+ QString tableName = QString::fromUtf8( results[( i * columns ) + 0] );
+ QString column = QString::fromUtf8( results[( i * columns ) + 1] );
QString type = results[( i * columns ) + 2];
if ( isDeclaredHidden( handle, tableName, column ) )
continue;
@@ -561,8 +561,8 @@
{
for ( i = 1; i <= rows; i++ )
{
- QString tableName = results[( i * columns ) + 0];
- QString column = results[( i * columns ) + 1];
+ QString tableName = QString::fromUtf8( results[( i * columns ) + 0] );
+ QString column = QString::fromUtf8( results[( i * columns ) + 1] );
QString type = results[( i * columns ) + 2];
if ( isDeclaredHidden( handle, tableName, column ) )
continue;
Modified: trunk/qgis/src/app/qgsspatialitesridsdialog.cpp
===================================================================
--- trunk/qgis/src/app/qgsspatialitesridsdialog.cpp 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgsspatialitesridsdialog.cpp 2010-04-05 17:16:25 UTC (rev 13250)
@@ -19,7 +19,7 @@
#include <QMessageBox>
#include "qgsspatialitesridsdialog.h"
QgsSpatialiteSridsDialog::QgsSpatialiteSridsDialog( QWidget *parent, Qt::WFlags fl )
- : QDialog( parent, fl )
+ : QDialog( parent, fl )
{
setupUi( this );
db = 0;
@@ -29,13 +29,13 @@
QgsSpatialiteSridsDialog::~QgsSpatialiteSridsDialog()
{
- sqlite3_close( db );
+ sqlite3_close( db );
}
QString QgsSpatialiteSridsDialog::selectedSrid()
{
- return twSrids->currentItem()->text(0);
+ return twSrids->currentItem()->text( 0 );
}
-bool QgsSpatialiteSridsDialog::load(QString dbName)
+bool QgsSpatialiteSridsDialog::load( QString dbName )
{
mDbName = dbName;
bool status = true;
@@ -44,43 +44,43 @@
int rc = sqlite3_open_v2( dbName.toUtf8(), &db, SQLITE_OPEN_READONLY, NULL );
if ( rc != SQLITE_OK )
{
- QMessageBox::warning( this, "Spatialite Database", tr( "Unable to open the database"));
+ QMessageBox::warning( this, tr( "SpatiaLite Database" ), tr( "Unable to open the database" ) );
return false;
}
}
- // load up the srid table
- // prepare the sql statement
- const char *pzTail;
- sqlite3_stmt *ppStmt;
- QString sql = "select auth_srid, auth_name, ref_sys_name from spatial_ref_sys order by srid asc";
+ // load up the srid table
+ // prepare the sql statement
+ const char *pzTail;
+ sqlite3_stmt *ppStmt;
+ QString sql = "select auth_srid, auth_name, ref_sys_name from spatial_ref_sys order by srid asc";
- int 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 )
+ int 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 )
+ {
+ // get the first row of the result set
+ while ( sqlite3_step( ppStmt ) == SQLITE_ROW )
{
- // get the first row of the result set
- while ( sqlite3_step( ppStmt ) == SQLITE_ROW )
- {
- QTreeWidgetItem *item = new QTreeWidgetItem( twSrids );
- // srid
- item->setText (0, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 0 ) ) );
- item->setText (1, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 1 ) ) );
- // name
- item->setText( 2, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 2 ) ) );
- // proj4 text
- item->setText( 3, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 3 ) ) );
+ QTreeWidgetItem *item = new QTreeWidgetItem( twSrids );
+ // srid
+ item->setText( 0, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 0 ) ) );
+ item->setText( 1, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 1 ) ) );
+ // name
+ item->setText( 2, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 2 ) ) );
+ // proj4 text
+ item->setText( 3, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 3 ) ) );
- }
- twSrids->sortByColumn( 0, Qt::AscendingOrder );
}
- else
- {
- // XXX query failed -- warn the user some how
- QMessageBox::warning(0, "Error", QString( "Failed to load SRIDS: %1" ).arg( sqlite3_errmsg( db ) ) );
- status = false;
- }
- // close the statement
- sqlite3_finalize( ppStmt );
+ twSrids->sortByColumn( 0, Qt::AscendingOrder );
+ }
+ else
+ {
+ // XXX query failed -- warn the user some how
+ QMessageBox::warning( 0, tr( "Error" ), tr( "Failed to load SRIDS: %1" ).arg( sqlite3_errmsg( db ) ) );
+ status = false;
+ }
+ // close the statement
+ sqlite3_finalize( ppStmt );
return status;
}
void QgsSpatialiteSridsDialog::on_pbnFilter_clicked()
@@ -102,7 +102,7 @@
{
search = "ref_sys_name";
}
- QString sql = QString("select auth_srid, auth_name, ref_sys_name from spatial_ref_sys where %1 like '%").arg(search) + leSearch->text() + QString("%' order by srid asc");
+ QString sql = QString( "select auth_srid, auth_name, ref_sys_name from spatial_ref_sys where %1 like '%" ).arg( search ) + leSearch->text() + QString( "%' order by srid asc" );
//QMessageBox::information(0, "Sql", sql);
int rc = sqlite3_prepare( db, sql.toUtf8(), sql.toUtf8().length(), &ppStmt, &pzTail );
@@ -116,8 +116,8 @@
{
QTreeWidgetItem *item = new QTreeWidgetItem( twSrids );
// srid
- item->setText (0, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 0 ) ) );
- item->setText (1, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 1 ) ) );
+ item->setText( 0, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 0 ) ) );
+ item->setText( 1, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 1 ) ) );
// name
item->setText( 2, QString::fromUtf8(( const char * )sqlite3_column_text( ppStmt, 2 ) ) );
// proj4 text
@@ -129,7 +129,7 @@
else
{
// XXX query failed -- warn the user some how
- QMessageBox::warning(0, "Error", QString( "Failed to load SRIDS: %1" ).arg( sqlite3_errmsg( db ) ) );
+ QMessageBox::warning( 0, tr( "Error" ), tr( "Failed to load SRIDS: %1" ).arg( sqlite3_errmsg( db ) ) );
}
// close the statement
sqlite3_finalize( ppStmt );
Modified: trunk/qgis/src/app/qgsspatialitesridsdialog.h
===================================================================
--- trunk/qgis/src/app/qgsspatialitesridsdialog.h 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/app/qgsspatialitesridsdialog.h 2010-04-05 17:16:25 UTC (rev 13250)
@@ -23,20 +23,24 @@
#include "qgscontexthelp.h"
#include "qgis.h"
+
+extern "C"
+{
#include <sqlite3.h>
+}
-class QgsSpatialiteSridsDialog: public QDialog, private Ui::QgsSpatialiteSridsDialogBase
+class QgsSpatialiteSridsDialog: public QDialog, private Ui::QgsSpatialiteSridsDialogBase
{
- Q_OBJECT
-public:
- QgsSpatialiteSridsDialog( QWidget *parent = 0, Qt::WFlags fl = QgisGui::ModalDialogFlags);
- ~QgsSpatialiteSridsDialog();
- bool load(QString dbName);
- QString selectedSrid();
-public slots:
- void on_pbnFilter_clicked();
-private:
- sqlite3 *db;
- QString mDbName;
+ Q_OBJECT
+ public:
+ QgsSpatialiteSridsDialog( QWidget *parent = 0, Qt::WFlags fl = QgisGui::ModalDialogFlags );
+ ~QgsSpatialiteSridsDialog();
+ bool load( QString dbName );
+ QString selectedSrid();
+ public slots:
+ void on_pbnFilter_clicked();
+ private:
+ sqlite3 *db;
+ QString mDbName;
};
#endif //QgsSpatialiteSridsDialog_H
Modified: trunk/qgis/src/core/qgsapplication.h
===================================================================
--- trunk/qgis/src/core/qgsapplication.h 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/core/qgsapplication.h 2010-04-05 17:16:25 UTC (rev 13250)
@@ -90,6 +90,7 @@
static const QString qgisMasterDbFilePath();
//! Returns the path to the spatialite template db file.
+ //! @note added in 1.5
static const QString qgisSpatialiteDbTemplatePath();
//! Returns the path to the settings directory in user's home dir
Modified: trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.cpp
===================================================================
--- trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.cpp 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.cpp 2010-04-05 17:16:25 UTC (rev 13250)
@@ -14,8 +14,6 @@
* *
***************************************************************************/
-#include <cassert>
-
#include <qgis.h>
#include <qgsapplication.h>
#include <qgsfeature.h>
@@ -41,8 +39,14 @@
QMap < QString, QgsSpatiaLiteProvider::SqliteHandles * >QgsSpatiaLiteProvider::SqliteHandles::handles;
-QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri ): QgsVectorDataProvider( uri ),
- geomType( QGis::WKBUnknown ), sqliteHandle( NULL ), sqliteStatement( NULL ), mSrid( -1 ), spatialIndexRTree( false ), spatialIndexMbrCache( false )
+QgsSpatiaLiteProvider::QgsSpatiaLiteProvider( QString const &uri )
+ : QgsVectorDataProvider( uri )
+ , geomType( QGis::WKBUnknown )
+ , sqliteHandle( NULL )
+ , sqliteStatement( NULL )
+ , mSrid( -1 )
+ , spatialIndexRTree( false )
+ , spatialIndexMbrCache( false )
{
QgsDataSourceURI anUri = QgsDataSourceURI( uri );
@@ -69,7 +73,7 @@
numberFeatures = 0;
valid = false;
- QgsLogger::critical( "Invalid SpatiaLite layer" );
+ QgsDebugMsg( "Invalid SpatiaLite layer" );
closeDb();
return;
}
@@ -90,7 +94,7 @@
numberFeatures = 0;
valid = false;
- QgsLogger::critical( "Invalid SpatiaLite layer" );
+ QgsDebugMsg( "Invalid SpatiaLite layer" );
closeDb();
return;
}
@@ -99,7 +103,7 @@
numberFeatures = 0;
valid = false;
- QgsLogger::critical( "Invalid SpatiaLite layer" );
+ QgsDebugMsg( "Invalid SpatiaLite layer" );
closeDb();
return;
}
@@ -109,7 +113,7 @@
{
valid = false;
- QgsLogger::critical( "Invalid SpatiaLite layer" );
+ QgsDebugMsg( "Invalid SpatiaLite layer" );
return;
}
//fill type names into sets
@@ -171,7 +175,9 @@
if ( strcasecmp( type, "int" ) == 0 ||
strcasecmp( type, "integer" ) == 0 ||
strcasecmp( type, "bigint" ) == 0 ||
- strcasecmp( type, "smallint" ) == 0 || strcasecmp( type, "tinyint" ) == 0 || strcasecmp( type, "boolean" ) == 0 )
+ strcasecmp( type, "smallint" ) == 0 ||
+ strcasecmp( type, "tinyint" ) == 0 ||
+ strcasecmp( type, "boolean" ) == 0 )
{
fieldType = QVariant::Int;
}
@@ -200,9 +206,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString error = "loadFields() SQL error: ";
- error = errMsg;
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "SQL error: %1" ).arg( QString::fromUtf8( errMsg ) ) );
sqlite3_free( errMsg );
}
}
@@ -223,22 +227,20 @@
{
const QgsField & fld = field( *it );
const QString & fieldname = fld.name();
- sql += ", \"";
- sql += fieldname;
- sql += "\"";
+ sql += "," + quotedIdentifier( fieldname );
}
if ( fetchGeometry )
{
- sql += QString( ", AsBinary(\"%1\")" ).arg( mGeometryColumn );
+ sql += QString( ", AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) );
}
- sql += QString( " FROM \"%1\" WHERE ROWID = %2" ).arg( mTableName ).arg( featureId );
+ sql += QString( " FROM %1 WHERE ROWID = %2" ).arg( quotedIdentifier( mTableName ) ).arg( featureId );
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &stmt, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" )
+ .arg( sql )
+ .arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
return false;
}
@@ -314,7 +316,7 @@
}
if ( mFetchGeom )
{
- QString geoCol = QString( "AsBinary(\"%1\")" ).arg( mGeometryColumn );
+ QString geoCol = QString( "AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) );
if ( strcasecmp( geoCol.toUtf8().constData(), sqlite3_column_name( stmt, ic ) ) == 0 )
{
if ( sqlite3_column_type( stmt, ic ) == SQLITE_BLOB )
@@ -339,9 +341,7 @@
else
{
// some unexpected error occurred
- QString error = "sqlite3_step() error: ";
- error += sqlite3_errmsg( sqliteHandle );
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "sqlite3_step() error: %1" ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
sqlite3_finalize( stmt );
return false;
}
@@ -355,13 +355,13 @@
feature.setValid( false );
if ( !valid )
{
- QgsLogger::critical( "Read attempt on an invalid SpatiaLite data source" );
+ QgsDebugMsg( "Read attempt on an invalid SpatiaLite data source" );
return false;
}
if ( sqliteStatement == NULL )
{
- QgsLogger::critical( "Invalid current SQLite statement" );
+ QgsDebugMsg( "Invalid current SQLite statement" );
return false;
}
@@ -438,7 +438,7 @@
}
if ( mFetchGeom )
{
- QString geoCol = QString( "AsBinary(\"%1\")" ).arg( mGeometryColumn );
+ QString geoCol = QString( "AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) );
if ( strcasecmp( geoCol.toUtf8().constData(), sqlite3_column_name( sqliteStatement, ic ) ) == 0 )
{
if ( sqlite3_column_type( sqliteStatement, ic ) == SQLITE_BLOB )
@@ -463,9 +463,7 @@
else
{
// some unexpected error occurred
- QString error = "sqlite3_step() error: ";
- error += sqlite3_errmsg( sqliteHandle );
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "sqlite3_step() error: %1" ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
sqlite3_finalize( sqliteStatement );
sqliteStatement = NULL;
return false;
@@ -512,7 +510,7 @@
if ( !valid )
{
- QgsLogger::critical( "Read attempt on an invalid SpatiaLite data source" );
+ QgsDebugMsg( "Read attempt on an invalid SpatiaLite data source" );
return;
}
@@ -528,15 +526,13 @@
{
const QgsField & fld = field( *it );
const QString & fieldname = fld.name();
- sql += ", \"";
- sql += fieldname;
- sql += "\"";
+ sql += "," + quotedIdentifier( fieldname );
}
if ( fetchGeometry )
{
- sql += QString( ", AsBinary(\"%1\")" ).arg( mGeometryColumn );
+ sql += QString( ", AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) );
}
- sql += QString( " FROM \"%1\"" ).arg( mTableName );
+ sql += QString( " FROM %1" ).arg( quotedIdentifier( mTableName ) );
QString whereClause;
@@ -551,7 +547,7 @@
arg( QString::number( rect.xMinimum(), 'f', 6 ) ).
arg( QString::number( rect.yMinimum(), 'f', 6 ) ).
arg( QString::number( rect.xMaximum(), 'f', 6 ) ).arg( QString::number( rect.yMaximum(), 'f', 6 ) );
- whereClause += QString( "Intersects(\"%1\", BuildMbr(%2)) AND " ).arg( mGeometryColumn ).arg( mbr );
+ whereClause += QString( "Intersects(%1, BuildMbr(%2)) AND " ).arg( quotedIdentifier( mGeometryColumn ) ).arg( mbr );
}
if ( mVShapeBased )
{
@@ -560,7 +556,7 @@
arg( QString::number( rect.xMinimum(), 'f', 6 ) ).
arg( QString::number( rect.yMinimum(), 'f', 6 ) ).
arg( QString::number( rect.xMaximum(), 'f', 6 ) ).arg( QString::number( rect.yMaximum(), 'f', 6 ) );
- whereClause += QString( "MbrIntersects(\"%1\", BuildMbr(%2))" ).arg( mGeometryColumn ).arg( mbr );
+ whereClause += QString( "MbrIntersects(%1, BuildMbr(%2))" ).arg( quotedIdentifier( mGeometryColumn ) ).arg( mbr );
}
else
{
@@ -572,7 +568,7 @@
mbrFilter += QString( "ymin <= %1 AND " ).arg( QString::number( rect.yMaximum(), 'f', 6 ) );
mbrFilter += QString( "ymax >= %1" ).arg( QString::number( rect.yMinimum(), 'f', 6 ) );
QString idxName = QString( "idx_%1_%2" ).arg( mIndexTable ).arg( mIndexGeometry );
- whereClause += QString( "ROWID IN (SELECT pkid FROM \"%1\" WHERE %2)" ).arg( idxName ).arg( mbrFilter );
+ whereClause += QString( "ROWID IN (SELECT pkid FROM %1 WHERE %2)" ).arg( quotedIdentifier( idxName ) ).arg( mbrFilter );
}
else if ( spatialIndexMbrCache )
{
@@ -582,7 +578,7 @@
arg( QString::number( rect.yMinimum(), 'f', 6 ) ).
arg( QString::number( rect.xMaximum(), 'f', 6 ) ).arg( QString::number( rect.yMaximum(), 'f', 6 ) );
QString idxName = QString( "cache_%1_%2" ).arg( mIndexTable ).arg( mIndexGeometry );
- whereClause += QString( "ROWID IN (SELECT rowid FROM \"%1\" WHERE mbr = FilterMbrIntersects(%2))" ).arg( idxName ).arg( mbr );
+ whereClause += QString( "ROWID IN (SELECT rowid FROM %1 WHERE mbr = FilterMbrIntersects(%2))" ).arg( quotedIdentifier( idxName ) ).arg( mbr );
}
else
{
@@ -591,7 +587,7 @@
arg( QString::number( rect.xMinimum(), 'f', 6 ) ).
arg( QString::number( rect.yMinimum(), 'f', 6 ) ).
arg( QString::number( rect.xMaximum(), 'f', 6 ) ).arg( QString::number( rect.yMaximum(), 'f', 6 ) );
- whereClause += QString( "MbrIntersects(\"%1\", BuildMbr(%2))" ).arg( mGeometryColumn ).arg( mbr );
+ whereClause += QString( "MbrIntersects(%1, BuildMbr(%2))" ).arg( quotedIdentifier( mGeometryColumn ) ).arg( mbr );
}
}
}
@@ -617,9 +613,7 @@
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &sqliteStatement, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
sqliteStatement = NULL;
}
}
@@ -752,9 +746,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString error = "minValue() SQL error: ";
- error = errMsg;
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "SQL error: %1" ).arg( QString::fromUtf8( errMsg ) ) );
sqlite3_free( errMsg );
}
return QVariant( QString::null );
@@ -810,9 +802,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString error = "maxValue() SQL error: ";
- error = errMsg;
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "SQL error: %1" ).arg( QString::fromUtf8( errMsg ) ) );
sqlite3_free( errMsg );
}
return QVariant( QString::null );
@@ -822,7 +812,6 @@
void QgsSpatiaLiteProvider::uniqueValues( int index, QList < QVariant > &uniqueValues, int limit )
{
sqlite3_stmt *stmt = NULL;
- char *errMsg = NULL;
QString sql;
QString txt;
@@ -847,9 +836,7 @@
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &stmt, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
return;
}
@@ -885,28 +872,15 @@
}
else
{
- // some unexpected error occurred
- const char *err = sqlite3_errmsg( sqliteHandle );
- int len = strlen( err );
- errMsg = ( char * ) sqlite3_malloc( len + 1 );
- strcpy( errMsg, err );
- goto abort;
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
+ sqlite3_finalize( stmt );
+ return;
}
}
+
sqlite3_finalize( stmt );
return;
-
-abort:
- QString msg = QString( "getUniqueValues SQL error:\n%1\n" ).arg( sql );
- if ( errMsg )
- {
- msg += errMsg;
- sqlite3_free( errMsg );
- }
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
}
bool QgsSpatiaLiteProvider::addFeatures( QgsFeatureList & flist )
@@ -932,13 +906,17 @@
if ( !mPrimaryKey.isEmpty() )
{
- sql = QString( "INSERT INTO \"%1\" (\"%2\", \"%3\"" ).
- arg( mTableName ).arg( mPrimaryKey ).arg( mGeometryColumn );
- values = QString( ") VALUES (NULL, GeomFromWKB(?, %1)" ).arg( mSrid );
+ sql = QString( "INSERT INTO %1(%2,%3" )
+ .arg( quotedIdentifier( mTableName ) )
+ .arg( quotedIdentifier( mPrimaryKey ) )
+ .arg( quotedIdentifier( mGeometryColumn ) );
+ values = QString( ") VALUES (NULL, GeomFromWKB(?,%1)" ).arg( mSrid );
}
else
{
- sql = QString( "INSERT INTO \"%1\" (\"%2\"" ).arg( mTableName ).arg( mGeometryColumn );
+ sql = QString( "INSERT INTO %1(%2" )
+ .arg( quotedIdentifier( mTableName ) )
+ .arg( quotedIdentifier( mGeometryColumn ) );
values = QString( ") VALUES (GeomFromWKB(?, %1)" ).arg( mSrid );
}
@@ -952,10 +930,8 @@
if ( fieldname.isEmpty() || fieldname == mGeometryColumn || fieldname == mPrimaryKey )
continue;
- sql += ", \"";
- sql += fieldname;
- sql += "\"";
- values += ", ?";
+ sql += "," + quotedIdentifier( fieldname );
+ values += ",?";
}
sql += values;
@@ -965,9 +941,7 @@
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &stmt, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( sqlite3_errmsg( sqliteHandle ) ) );
return false;
}
@@ -1061,15 +1035,11 @@
return true;
abort:
- QString msg = QString( "addFeatures SQL error:\n%1\n" ).arg( sql );
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
if ( errMsg )
{
- msg += errMsg;
sqlite3_free( errMsg );
}
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
if ( toCommit )
{
@@ -1095,15 +1065,13 @@
}
toCommit = true;
- sql = QString( "DELETE FROM \"%1\" WHERE ROWID = ?" ).arg( mTableName );
+ sql = QString( "DELETE FROM %1 WHERE ROWID=?" ).arg( quotedIdentifier( mTableName ) );
// SQLite prepared statement
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &stmt, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
return false;
}
@@ -1144,15 +1112,11 @@
return true;
abort:
- QString msg = QString( "deleteFeatures SQL error:\n%1\n" ).arg( sql );
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
if ( errMsg )
{
- msg += errMsg;
sqlite3_free( errMsg );
}
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
if ( toCommit )
{
@@ -1204,15 +1168,11 @@
return true;
abort:
- QString msg = QString( "addAttributes SQL error:\n%1\n" ).arg( sql );
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
if ( errMsg )
{
- msg += errMsg;
sqlite3_free( errMsg );
}
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
if ( toCommit )
{
@@ -1245,7 +1205,7 @@
if ( fid < 0 )
continue;
- QString sql = QString( "UPDATE \"%1\" SET " ).arg( mTableName );
+ QString sql = QString( "UPDATE %1 SET " ).arg( quotedIdentifier( mTableName ) );
bool first = true;
const QgsAttributeMap & attrs = iter.value();
@@ -1270,17 +1230,17 @@
if ( type == QVariant::Invalid )
{
// binding a NULL value
- sql += QString( "\"%1\"=NULL" ).arg( fieldName );
+ sql += QString( "%1=NULL" ).arg( quotedIdentifier( fieldName ) );
}
else if ( type == QVariant::Int || type == QVariant::Double )
{
// binding a NUMERIC value
- sql += QString( "\"%1\"=%2" ).arg( fieldName ).arg( siter->toString() );
+ sql += QString( "%1=%2" ).arg( quotedIdentifier( fieldName ) ).arg( siter->toString() );
}
else
{
// binding a TEXT value
- sql += QString( "\"%1\"=%2" ).arg( fieldName ).arg( quotedValue( siter->toString() ) );
+ sql += QString( "%1=%2" ).arg( quotedIdentifier( fieldName ) ).arg( quotedValue( siter->toString() ) );
}
}
sql += QString( " WHERE ROWID=%1" ).arg( fid );
@@ -1303,15 +1263,11 @@
return true;
abort:
- QString msg = QString( "changeAttributeValues SQL error:\n%1\n" ).arg( sql );
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
if ( errMsg )
{
- msg += errMsg;
sqlite3_free( errMsg );
}
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
if ( toCommit )
{
@@ -1338,16 +1294,16 @@
toCommit = true;
sql =
- QString( "UPDATE \"%1\" SET \"%2\" = GeomFromWKB(?, %3) WHERE ROWID = ?" ).
- arg( mTableName ).arg( mGeometryColumn ).arg( mSrid );
+ QString( "UPDATE %1 SET %2=GeomFromWKB(?, %3) WHERE ROWID = ?" )
+ .arg( quotedIdentifier( mTableName ) )
+ .arg( quotedIdentifier( mGeometryColumn ) )
+ .arg( mSrid );
// SQLite prepared statement
if ( sqlite3_prepare_v2( sqliteHandle, sql.toUtf8().constData(), -1, &stmt, NULL ) != SQLITE_OK )
{
// some error occurred
- QString errCause = sqlite3_errmsg( sqliteHandle );
- QString msg = tr( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQLite error: %1\n\nSQL: %2" ).arg( sql ).arg( QString::fromUtf8( sqlite3_errmsg( sqliteHandle ) ) ) );
return false;
}
@@ -1393,15 +1349,11 @@
return true;
abort:
- QString msg = QString( "addFeatures SQL error:\n%1\n" ).arg( sql );
+ QgsDebugMsg( QString( "SQL error:\n%1\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
if ( errMsg )
{
- msg += errMsg;
sqlite3_free( errMsg );
}
- else
- msg += "unknown cause";
- QgsLogger::critical( msg );
if ( toCommit )
{
@@ -1474,10 +1426,9 @@
if ( sqlite3_open_v2( dbPath.toUtf8().constData(), &sqlite_handle, SQLITE_OPEN_READWRITE, NULL ) )
{
// failure
-
- QString errCause = sqlite3_errmsg( sqlite_handle );
- QString msg = tr( "Failure while connecting to: %1\n\n%2" ).arg( dbPath ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "Failure while connecting to: %1\n%2" )
+ .arg( dbPath )
+ .arg( QString::fromUtf8( sqlite3_errmsg( sqlite_handle ) ) ) );
return NULL;
}
@@ -1485,10 +1436,7 @@
if ( checkMetadata( sqlite_handle ) == false )
{
// failure
-
- QString errCause = tr( "invalid metadata tables" );
- QString msg = tr( "Failure while connecting to: %1\n\n%2" ).arg( dbPath ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "Failure while connecting to: %1\n\ninvalid metadata tables" ).arg( dbPath ) );
sqlite3_close( sqlite_handle );
return NULL;
}
@@ -1514,8 +1462,8 @@
for ( i = handles.begin(); i != handles.end() && i.value() != handle; i++ )
;
- assert( i.value() == handle );
- assert( i.value()->ref > 0 );
+ Q_ASSERT( i.value() == handle );
+ Q_ASSERT( i.value()->ref > 0 );
if ( --i.value()->ref == 0 )
{
@@ -1536,6 +1484,12 @@
}
}
+QString QgsSpatiaLiteProvider::quotedIdentifier( QString id ) const
+{
+ id.replace( "\"", "\"\"" );
+ return id.prepend( "\"" ).append( "\"" );
+}
+
QString QgsSpatiaLiteProvider::quotedValue( QString value ) const
{
if ( value.isNull() )
@@ -1563,16 +1517,24 @@
QString sql = QString( "SELECT read_only FROM geometry_columns "
"LEFT JOIN geometry_columns_auth "
"USING (f_table_name, f_geometry_column) "
- "WHERE f_table_name=%1 and f_geometry_column=%2" ).arg( quotedValue( mTableName ) ).
- arg( quotedValue( mGeometryColumn ) );
+ "WHERE f_table_name=%1 and f_geometry_column=%2" )
+ .arg( quotedValue( mTableName ) )
+ .arg( quotedValue( mGeometryColumn ) );
ret = sqlite3_get_table( sqliteHandle, sql.toUtf8().constData(), &results, &rows, &columns, &errMsg );
if ( ret != SQLITE_OK )
- goto error;
- if ( rows < 1 )
- ;
- else
{
+ if ( errMsg && strcmp( errMsg, "no such table: geometry_columns_auth" ) == 0 )
+ {
+ sqlite3_free( errMsg );
+ sql = QString( "SELECT 0 FROM geometry_columns WHERE f_table_name=%1 and f_geometry_column=%2" )
+ .arg( quotedValue( mTableName ) )
+ .arg( quotedValue( mGeometryColumn ) );
+ ret = sqlite3_get_table( sqliteHandle, sql.toUtf8().constData(), &results, &rows, &columns, &errMsg );
+ }
+ }
+ if ( ret == SQLITE_OK && rows == 1 )
+ {
mTableBased = true;
mReadOnly = false;
for ( i = 1; i <= rows; i++ )
@@ -1585,6 +1547,12 @@
}
count++;
}
+ if ( errMsg )
+ {
+ QgsDebugMsg( QString( "sqlite error %1 [%2]" ).arg( sql ).arg( errMsg ) );
+ sqlite3_free( errMsg );
+ errMsg = 0;
+ }
sqlite3_free_table( results );
// checking if this one is a View-based layer
@@ -1593,16 +1561,18 @@
arg( quotedValue( mGeometryColumn ) );
ret = sqlite3_get_table( sqliteHandle, sql.toUtf8().constData(), &results, &rows, &columns, &errMsg );
- if ( ret != SQLITE_OK )
- goto error;
- if ( rows < 1 )
- ;
- else
+ if ( ret == SQLITE_OK && rows == 1 )
{
mViewBased = true;
mReadOnly = true;
count++;
}
+ if ( errMsg )
+ {
+ QgsDebugMsg( QString( "sqlite error %1 [%2]" ).arg( sql ).arg( errMsg ) );
+ sqlite3_free( errMsg );
+ errMsg = 0;
+ }
sqlite3_free_table( results );
// checking if this one is a VirtualShapefile-based layer
@@ -1611,34 +1581,22 @@
arg( quotedValue( mGeometryColumn ) );
ret = sqlite3_get_table( sqliteHandle, sql.toUtf8().constData(), &results, &rows, &columns, &errMsg );
- if ( ret != SQLITE_OK )
- goto error;
- if ( rows < 1 )
- ;
- else
+ if ( ret == SQLITE_OK && rows == 1 )
{
mVShapeBased = true;
mReadOnly = true;
count++;
}
- sqlite3_free_table( results );
-
-// cheching for validity
- if ( count != 1 )
- return false;
-
- return true;
-
-error:
- // unexpected error
- if ( errMsg != NULL )
+ if ( errMsg )
{
- QString errCause = errMsg;
- QString msg = QString( "checkLayerType SQL error: %1\n\n%2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "sqlite error %1 [%2]" ).arg( sql ).arg( errMsg ) );
sqlite3_free( errMsg );
+ errMsg = 0;
}
- return false;
+ sqlite3_free_table( results );
+
+// checking for validity
+ return count == 1;
}
bool QgsSpatiaLiteProvider::getGeometryDetails()
@@ -1729,9 +1687,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString errCause = errMsg;
- QString msg = QString( "getTableGeometryDetails SQL error: %1\n\n%2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQL error: %1\n\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
sqlite3_free( errMsg );
}
return false;
@@ -1814,9 +1770,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString errCause = errMsg;
- QString msg = QString( "getViewGeometryDetails SQL error: %1\n\n%2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQL error: %1\n\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
sqlite3_free( errMsg );
}
return false;
@@ -1886,9 +1840,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString errCause = errMsg;
- QString msg = QString( "getVShapeGeometryDetails SQL error: %1\n\n%2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQL error: %1\n\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
sqlite3_free( errMsg );
}
return false;
@@ -1925,9 +1877,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString errCause = errMsg;
- QString msg = QString( "getSridDetails SQL error: %1\n\n%2" ).arg( sql ).arg( errCause );
- QgsLogger::critical( msg );
+ QgsDebugMsg( QString( "SQL error: %1\n\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
sqlite3_free( errMsg );
}
return false;
@@ -1976,9 +1926,7 @@
// unexpected error
if ( errMsg != NULL )
{
- QString error = "getTableSummary() SQL error: ";
- error = errMsg;
- QgsLogger::critical( error );
+ QgsDebugMsg( QString( "SQL error: %1\n\n%2" ).arg( sql ).arg( errMsg ? QString::fromUtf8( errMsg ) : "unknown cause" ) );
sqlite3_free( errMsg );
}
return false;
@@ -1990,7 +1938,7 @@
if ( it == attributeFields.constEnd() )
{
- QgsLogger::critical( "Field " + QString::number( index ) + " not found." );
+ QgsDebugMsg( QString( "Field %1 not found." ).arg( index ) );
}
return it.value();
Modified: trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.h
===================================================================
--- trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.h 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/providers/spatialite/qgsspatialiteprovider.h 2010-04-05 17:16:25 UTC (rev 13250)
@@ -356,6 +356,7 @@
*/
//void sqliteOpen();
void closeDb();
+ QString quotedIdentifier( QString id ) const;
QString quotedValue( QString value ) const;
bool checkLayerType();
bool getGeometryDetails();
Modified: trunk/qgis/src/ui/qgsnewspatialitelayerdialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsnewspatialitelayerdialogbase.ui 2010-04-05 14:14:45 UTC (rev 13249)
+++ trunk/qgis/src/ui/qgsnewspatialitelayerdialogbase.ui 2010-04-05 17:16:25 UTC (rev 13250)
@@ -403,7 +403,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
- <set>QDialogButtonBox::Apply|QDialogButtonBox::Close|QDialogButtonBox::Help</set>
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
More information about the QGIS-commit
mailing list