void QgsOfflineEditing::committedGeometriesChanges( const QString& qgisLayerId, const QgsGeometryMap& changedGeometries ) { sqlite3* db = openLoggingDb(); if ( db == NULL ) { return; } // insert log int layerId = getOrCreateLayerId( db, qgisLayerId ); int commitNo = getCommitNo( db ); for ( QgsGeometryMap::const_iterator it = changedGeometries.begin(); it != changedGeometries.end(); ++it ) { QgsFeatureId fid = it.key(); if ( isAddedFeature( db, layerId, fid ) ) { // skip added features continue; } QgsGeometry geom = it.value(); QString sql = QString( "INSERT INTO 'log_geometry_updates' VALUES ( %1, %2, %3, '%4' )" ) .arg( layerId ) .arg( commitNo ) .arg( fid ) .arg( geom.exportToWkt() ); sqlExec( db, sql ); // TODO: use WKB instead of WKT? } increaseCommitNo( db ); sqlite3_close( db ); }
bool QgsDb2Provider::changeGeometryValues( const QgsGeometryMap &geometry_map ) { if ( geometry_map.isEmpty() ) return true; if ( mFidColName.isEmpty() ) return false; for ( QgsGeometryMap::const_iterator it = geometry_map.constBegin(); it != geometry_map.constEnd(); ++it ) { QgsFeatureId fid = it.key(); // skip added features if ( FID_IS_NEW( fid ) ) { continue; } QString statement; statement = QString( "UPDATE %1.%2 SET %3 = " ) .arg( mSchemaName, mTableName, mGeometryColName ); if ( !mDatabase.isOpen() ) { QString errMsg; mDatabase = getDatabase( mConnInfo, errMsg ); if ( !errMsg.isEmpty() ) { return false; } } QSqlQuery query = QSqlQuery( mDatabase ); query.setForwardOnly( true ); statement += QString( "db2gse.%1(CAST (%2 AS BLOB(2M)),%3)" ) .arg( mGeometryColType, QString( "?" ), QString::number( mSRId ) ); // set attribute filter statement += QString( " WHERE %1=%2" ).arg( mFidColName, FID_TO_STRING( fid ) ); QgsDebugMsg( statement ); if ( !query.prepare( statement ) ) { QgsDebugMsg( query.lastError().text() ); return false; } // add geometry param QByteArray bytea = QByteArray(( char* )it->asWkb(), ( int ) it->wkbSize() ); query.addBindValue( bytea, QSql::In | QSql::Binary ); if ( !query.exec() ) { QgsDebugMsg( query.lastError().text() ); return false; } } return true; }
bool QgsMemoryProvider::changeGeometryValues( QgsGeometryMap & geometry_map ) { for ( QgsGeometryMap::const_iterator it = geometry_map.begin(); it != geometry_map.end(); ++it ) { QgsFeatureMap::iterator fit = mFeatures.find( it.key() ); if ( fit == mFeatures.end() ) continue; // update spatial index if ( mSpatialIndex ) mSpatialIndex->deleteFeature( *fit ); fit->setGeometry( it.value() ); // update spatial index if ( mSpatialIndex ) mSpatialIndex->insertFeature( *fit ); } updateExtent(); return TRUE; }
bool QgsWFSProvider::changeGeometryValues( const QgsGeometryMap &geometry_map ) { //find out typename from uri and strip namespace prefix QString tname = mShared->mURI.typeName(); if ( tname.isNull() ) { return false; } //create <Transaction> xml QDomDocument transactionDoc; QDomElement transactionElem = createTransactionElement( transactionDoc ); transactionDoc.appendChild( transactionElem ); QgsGeometryMap::const_iterator geomIt = geometry_map.constBegin(); for ( ; geomIt != geometry_map.constEnd(); ++geomIt ) { QString gmlid = mShared->findGmlId( geomIt.key() ); if ( gmlid.isEmpty() ) { QgsDebugMsg( QString( "Cannot identify feature of id %1" ).arg( geomIt.key() ) ); continue; } QDomElement updateElem = transactionDoc.createElementNS( QgsWFSConstants::WFS_NAMESPACE, "Update" ); updateElem.setAttribute( "typeName", tname ); //Property QDomElement propertyElem = transactionDoc.createElementNS( QgsWFSConstants::WFS_NAMESPACE, "Property" ); QDomElement nameElem = transactionDoc.createElementNS( QgsWFSConstants::WFS_NAMESPACE, "Name" ); QDomText nameText = transactionDoc.createTextNode( mShared->mGeometryAttribute ); nameElem.appendChild( nameText ); propertyElem.appendChild( nameElem ); QDomElement valueElem = transactionDoc.createElementNS( QgsWFSConstants::WFS_NAMESPACE, "Value" ); QDomElement gmlElem = QgsOgcUtils::geometryToGML( &geomIt.value(), transactionDoc ); gmlElem.setAttribute( "srsName", crs().authid() ); valueElem.appendChild( gmlElem ); propertyElem.appendChild( valueElem ); updateElem.appendChild( propertyElem ); //filter QDomElement filterElem = transactionDoc.createElementNS( QgsWFSConstants::OGC_NAMESPACE, "Filter" ); QDomElement featureIdElem = transactionDoc.createElementNS( QgsWFSConstants::OGC_NAMESPACE, "FeatureId" ); featureIdElem.setAttribute( "fid", gmlid ); filterElem.appendChild( featureIdElem ); updateElem.appendChild( filterElem ); transactionElem.appendChild( updateElem ); } QDomDocument serverResponse; bool success = sendTransactionDocument( transactionDoc, serverResponse ); if ( !success ) { return false; } if ( transactionSuccess( serverResponse ) ) { mShared->changeGeometryValues( geometry_map ); return true; } else { handleException( serverResponse ); return false; } }