bool TeSQLite::insertLayer(TeLayer* layer) { errorMessage_ = ""; TeProjection* proj = layer->projection(); if (!proj || !insertProjection(proj)) { errorMessage_ = "Error inserting projection!"; return false; } string sql = "INSERT INTO te_layer (projection_id, name, lower_x, lower_y, upper_x, "; sql += "upper_y, edition_time) VALUES("; sql += Te2String(proj->id()); sql += ", '"; sql += layer->name(); sql += "', "; sql += Te2String(layer->box().x1(), 15); sql += ", "; sql += Te2String(layer->box().y1(), 15); sql += ", "; sql += Te2String(layer->box().x2(), 15); sql += ", "; sql += Te2String(layer->box().y2(), 15); sql += ", "; TeTime editionTime = layer->getEditionTime(); sql += this->getSQLTime(editionTime); sql += ")"; if(this->execute(sql)) { //int newId = getMaxValue(this, "te_layer", "layer_id"); int newId = getLastInsertedSerial(); if(newId >= 0) { layer->id(newId); } } else return false; layerMap()[layer->id()] = layer; return true; }
bool QgsCustomProjectionDialog::saveCRS( QgsCoordinateReferenceSystem myCRS, QString myName, QString myId, bool newEntry ) { QString mySql; int return_id; QString myProjectionAcronym = myCRS.projectionAcronym(); QString myEllipsoidAcronym = myCRS.ellipsoidAcronym(); QgsDebugMsg( QString( "Saving a CRS:%1, %2, %3" ).arg( myName ).arg( myCRS.toProj4() ).arg( newEntry ) ); if ( newEntry ) { return_id = myCRS.saveAsUserCRS( myName ); if ( return_id == -1 ) return false; else myId = QString::number( return_id ); } else { mySql = "update tbl_srs set description=" + quotedValue( myName ) + ",projection_acronym=" + quotedValue( myProjectionAcronym ) + ",ellipsoid_acronym=" + quotedValue( myEllipsoidAcronym ) + ",parameters=" + quotedValue( myCRS.toProj4() ) + ",is_geo=0" // <--shamelessly hard coded for now + " where srs_id=" + quotedValue( myId ) ; QgsDebugMsg( mySql ); sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; //check if the db is available myResult = sqlite3_open( QgsApplication::qgisUserDbFilePath().toUtf8(), &myDatabase ); if ( myResult != SQLITE_OK ) { QgsDebugMsg( QString( "Can't open database: %1 \n please notify QGIS developers of this error \n %2 (file name) " ).arg( sqlite3_errmsg( myDatabase ) ).arg( QgsApplication::qgisUserDbFilePath() ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. Q_ASSERT( myResult == SQLITE_OK ); } myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail ); sqlite3_step( myPreparedStatement ); // XXX Need to free memory from the error msg if one is set if ( myResult != SQLITE_OK ) { QgsDebugMsg( QString( "failed to write to database in custom projection dialog: %1 [%2]" ).arg( mySql ).arg( sqlite3_errmsg( myDatabase ) ) ); } sqlite3_finalize( myPreparedStatement ); // close sqlite3 db sqlite3_close( myDatabase ); if ( myResult != SQLITE_OK ) return false; } existingCRSparameters[myId] = myCRS.toProj4(); existingCRSnames[myId] = myName; QgsCRSCache::instance()->updateCRSCache( QString( "USER:%1" ).arg( myId ) ); // If we have a projection acronym not in the user db previously, add it. // This is a must, or else we can't select it from the vw_srs table. // Actually, add it always and let the SQL PRIMARY KEY remove duplicates. insertProjection( myProjectionAcronym ); return true; }
bool QgsCustomProjectionDialog::saveCrs( QgsCoordinateReferenceSystem parameters, const QString &name, const QString &existingId, bool newEntry ) { QString id = existingId; QString sql; int returnId; QString projectionAcronym = parameters.projectionAcronym(); QString ellipsoidAcronym = parameters.ellipsoidAcronym(); QgsDebugMsg( QString( "Saving a CRS:%1, %2, %3" ).arg( name, parameters.toProj4() ).arg( newEntry ) ); if ( newEntry ) { returnId = parameters.saveAsUserCrs( name ); if ( returnId == -1 ) return false; else id = QString::number( returnId ); } else { sql = "update tbl_srs set description=" + quotedValue( name ) + ",projection_acronym=" + quotedValue( projectionAcronym ) + ",ellipsoid_acronym=" + quotedValue( ellipsoidAcronym ) + ",parameters=" + quotedValue( parameters.toProj4() ) + ",is_geo=0" // <--shamelessly hard coded for now + " where srs_id=" + quotedValue( id ) ; QgsDebugMsg( sql ); sqlite3_database_unique_ptr database; //check if the db is available int result = database.open( QgsApplication::qgisUserDatabaseFilePath() ); if ( result != SQLITE_OK ) { QgsDebugMsg( QString( "Can't open database: %1 \n please notify QGIS developers of this error \n %2 (file name) " ).arg( database.errorMessage(), QgsApplication::qgisUserDatabaseFilePath() ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. Q_ASSERT( result == SQLITE_OK ); } sqlite3_statement_unique_ptr preparedStatement = database.prepare( sql, result ); if ( result != SQLITE_OK || preparedStatement.step() != SQLITE_DONE ) { QgsDebugMsg( QString( "failed to write to database in custom projection dialog: %1 [%2]" ).arg( sql, database.errorMessage() ) ); } preparedStatement.reset(); if ( result != SQLITE_OK ) return false; } mExistingCRSparameters[id] = parameters.toProj4(); mExistingCRSnames[id] = name; QgsCoordinateReferenceSystem::invalidateCache(); QgsCoordinateTransformCache::instance()->invalidateCrs( QStringLiteral( "USER:%1" ).arg( id ) ); // If we have a projection acronym not in the user db previously, add it. // This is a must, or else we can't select it from the vw_srs table. // Actually, add it always and let the SQL PRIMARY KEY remove duplicates. insertProjection( projectionAcronym ); return true; }
bool TeSQLite::insertView(TeView *view) { errorMessage_ = ""; // save it's projection TeProjection* proj = view->projection(); if ( !proj || !insertProjection(proj)) { errorMessage_ = "Error inserting projection"; return false; } string sql = "INSERT INTO te_view (projection_id, name, user_name, visibility, lower_x, lower_y, upper_x, upper_y, current_theme) VALUES("; sql += Te2String(proj->id()); sql += ", '"; sql += view->name(); sql += "', '"; sql += view->user(); sql += "', "; sql += Te2String(view->isVisible()) + ", "; sql += Te2String(view->getCurrentBox().lowerLeft().x(),15) + ", "; sql += Te2String(view->getCurrentBox().lowerLeft().y(),15) + ", "; sql += Te2String(view->getCurrentBox().upperRight().x(),15) + ", "; sql += Te2String(view->getCurrentBox().upperRight().y(),15) + ", "; if(view->getCurrentTheme() == -1) sql += "null "; else sql += Te2String(view->getCurrentTheme()); sql += ")"; if(this->execute(sql)) { //int newId = getMaxValue(this, "te_view", "view_id"); int newId = getLastInsertedSerial(); if(newId >= 0) { view->id(newId); } } else return false; for(unsigned int th = 0; th < view->size(); ++th) { TeViewNode* node = view->get (th); if (node->type() == TeTHEME) { TeTheme *theme = (TeTheme*) node; insertTheme (theme); } else { TeViewTree* tree = (TeViewTree*)node; insertViewTree (tree); } } viewMap()[view->id()] = view; return true; }