bool QgsOfflineEditing::createSpatialiteDB( const QString& offlineDbPath ) { int ret; sqlite3 *sqlite_handle; char *errMsg = NULL; QFile newDb( offlineDbPath ); if ( newDb.exists() ) { QFile::remove( offlineDbPath ); } // see also QgsNewSpatialiteLayerDialog::createDb() QFileInfo fullPath = QFileInfo( offlineDbPath ); QDir path = fullPath.dir(); // Must be sure there is destination directory ~/.qgis QDir().mkpath( path.absolutePath( ) ); // 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 ); if ( ret ) { // an error occurred QString errCause = tr( "Could not create a new database\n" ); errCause += QString::fromUtf8( sqlite3_errmsg( sqlite_handle ) ); sqlite3_close( sqlite_handle ); showWarning( errCause ); return false; } // activating Foreign Key constraints ret = sqlite3_exec( sqlite_handle, "PRAGMA foreign_keys = 1", NULL, 0, &errMsg ); if ( ret != SQLITE_OK ) { showWarning( tr( "Unable to activate FOREIGN_KEY constraints" ) ); sqlite3_free( errMsg ); sqlite3_close( sqlite_handle ); return false; } initializeSpatialMetadata( sqlite_handle ); // all done: closing the DB connection sqlite3_close( sqlite_handle ); return true; }
bool QgsNewSpatialiteLayerDialog::createDb() { QSettings settings; int ret; sqlite3 *sqlite_handle; char *errMsg = NULL; if ( mDatabaseComboBox->currentText().isEmpty() ) return false; QFile newDb( mDatabaseComboBox->currentText() ); if ( !newDb.exists() ) { QgsDebugMsg( "creating a new db" ); QFileInfo fullPath = QFileInfo( mDatabaseComboBox->currentText() ); QDir path = fullPath.dir(); QgsDebugMsg( QString( "making this dir: %1" ).arg( path.absolutePath() ) ); // Must be sure there is destination directory ~/.qgis QDir().mkpath( path.absolutePath( ) ); // 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 ); if ( ret ) { // an error occurred QString errCause = tr( "Could not create a new database\n" ); errCause += QString::fromUtf8( sqlite3_errmsg( sqlite_handle ) ); sqlite3_close( sqlite_handle ); QMessageBox::warning( 0, tr( "SpatiaLite Database" ), errCause ); pbnFindSRID->setEnabled( false ); return false; } // activating Foreign Key constraints ret = sqlite3_exec( sqlite_handle, "PRAGMA foreign_keys = 1", NULL, 0, &errMsg ); if ( ret != SQLITE_OK ) { QMessageBox::warning( 0, tr( "SpatiaLite Database" ), tr( "Unable to activate FOREIGN_KEY constraints" ) ); sqlite3_free( errMsg ); sqlite3_close( sqlite_handle ); pbnFindSRID->setEnabled( false ); return false; } initializeSpatialMetadata( sqlite_handle ); // all done: closing the DB connection sqlite3_close( sqlite_handle ); } QFileInfo fi( newDb ); if ( !fi.exists() ) { pbnFindSRID->setEnabled( false ); return false; } QString key = "/SpatiaLite/connections/" + fi.fileName() + "/sqlitepath"; if ( !settings.contains( key ) ) { settings.setValue( "/SpatiaLite/connections/selected", fi.fileName() + tr( "@" ) + fi.canonicalFilePath() ); settings.setValue( key, fi.canonicalFilePath() ); QMessageBox::information( 0, tr( "SpatiaLite Database" ), tr( "Registered new database!" ) ); } pbnFindSRID->setEnabled( true ); return true; }