bool QgsTransaction::addLayer( QgsVectorLayer* layer ) { if ( !layer ) return false; if ( layer->isEditable() ) return false; //test if provider supports transactions if ( !layer->dataProvider() || ( layer->dataProvider()->capabilities() & QgsVectorDataProvider::TransactionSupport ) == 0 ) return false; if ( layer->dataProvider()->transaction() ) return false; //connection string not compatible if ( QgsDataSourceURI( layer->source() ).connectionInfo( false ) != mConnString ) { QgsDebugMsg( QString( "Couldn't start transaction because connection string for layer %1 : '%2' does not match '%3'" ).arg( layer->id(), QgsDataSourceURI( layer->source() ).connectionInfo( false ), mConnString ) ); return false; } connect( this, SIGNAL( afterRollback() ), layer->dataProvider(), SIGNAL( dataChanged() ) ); connect( QgsMapLayerRegistry::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( onLayersDeleted( QStringList ) ) ); mLayers.insert( layer ); if ( mTransactionActive ) layer->dataProvider()->setTransaction( this ); return true; }
QgsTransaction* QgsTransaction::create( const QStringList& layerIds ) { if ( layerIds.isEmpty() ) { return 0; } QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerIds.first() ) ); if ( !layer ) { return 0; } QString connStr = QgsDataSourceURI( layer->source() ).connectionInfo(); QString providerKey = layer->dataProvider()->name(); QgsTransaction* ts = QgsTransaction::create( connStr, providerKey ); if ( !ts ) { return 0; } Q_FOREACH ( const QString& layerId, layerIds ) { if ( !ts->addLayer( layerId ) ) { delete ts; return 0; } } return ts; }
void QgsOfflineEditing::committedFeaturesAdded( const QString& qgisLayerId, const QgsFeatureList& addedFeatures ) { sqlite3* db = openLoggingDb(); if ( db == NULL ) { return; } // insert log int layerId = getOrCreateLayerId( db, qgisLayerId ); // get new feature ids from db QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( qgisLayerId ); QgsDataSourceURI uri = QgsDataSourceURI( layer->source() ); // only store feature ids QString sql = QString( "SELECT ROWID FROM '%1' ORDER BY ROWID DESC LIMIT %2" ).arg( uri.table() ).arg( addedFeatures.size() ); QList<int> newFeatureIds = sqlQueryInts( db, sql ); for ( int i = newFeatureIds.size() - 1; i >= 0; i-- ) { QString sql = QString( "INSERT INTO 'log_added_features' VALUES ( %1, %2 )" ) .arg( layerId ) .arg( newFeatureIds.at( i ) ); sqlExec( db, sql ); } sqlite3_close( db ); }
bool QgsTransactionGroup::addLayer( QgsVectorLayer* layer ) { if ( !QgsTransaction::supportsTransaction( layer ) ) return false; QString connString = QgsDataSourceURI( layer->source() ).connectionInfo(); if ( mConnString.isEmpty() ) { mConnString = connString; mProviderKey = layer->providerType(); } else if ( mConnString != connString || mProviderKey != layer->providerType() ) { return false; } mLayers.insert( layer ); connect( layer, SIGNAL( beforeEditingStarted() ), this, SLOT( onEditingStarted() ) ); connect( layer, SIGNAL( layerDeleted() ), this, SLOT( onLayerDeleted() ) ); return true; }
QgsMssqlProvider::QgsMssqlProvider( QString uri ) : QgsVectorDataProvider( uri ) , mCrs() , mWkbType( QGis::WKBUnknown ) { QgsDataSourceURI anUri = QgsDataSourceURI( uri ); if ( !anUri.srid().isEmpty() ) mSRId = anUri.srid().toInt(); else mSRId = -1; mWkbType = anUri.wkbType(); mValid = true; mUseWkb = false; mSkipFailures = false; mUseEstimatedMetadata = anUri.useEstimatedMetadata(); mSqlWhereClause = anUri.sql(); mDatabase = GetDatabase( anUri.service(), anUri.host(), anUri.database(), anUri.username(), anUri.password() ); if ( !OpenDatabase( mDatabase ) ) { setLastError( mDatabase.lastError( ).text( ) ); mValid = false; return; } // Create a query for default connection mQuery = QSqlQuery( mDatabase ); // Database successfully opened; we can now issue SQL commands. if ( !anUri.schema().isEmpty() ) mSchemaName = anUri.schema(); else mSchemaName = "dbo"; if ( !anUri.table().isEmpty() ) { // the layer name has been specified mTableName = anUri.table(); QStringList sl = mTableName.split( '.' ); if ( sl.length() == 2 ) { mSchemaName = sl[0]; mTableName = sl[1]; } mTables = QStringList( mTableName ); } else { // Get a list of table mTables = mDatabase.tables( QSql::Tables ); if ( mTables.count() > 0 ) mTableName = mTables[0]; else mValid = false; } if ( mValid ) { if ( !anUri.keyColumn().isEmpty() ) mFidColName = anUri.keyColumn(); if ( !anUri.geometryColumn().isEmpty() ) mGeometryColName = anUri.geometryColumn(); if ( mSRId < 0 || mWkbType == QGis::WKBUnknown || mGeometryColName.isEmpty() ) loadMetadata(); loadFields(); UpdateStatistics( mUseEstimatedMetadata ); if ( mGeometryColName.isEmpty() ) { // table contains no geometries mWkbType = QGis::WKBNoGeometry; mSRId = 0; } } //fill type names into sets mNativeTypes // integer types << QgsVectorDataProvider::NativeType( tr( "8 Bytes integer" ), "bigint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "4 Bytes integer" ), "int", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "2 Bytes integer" ), "smallint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "1 Bytes integer" ), "tinyint", QVariant::Int ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (numeric)" ), "numeric", QVariant::Double, 1, 20, 0, 20 ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (decimal)" ), "decimal", QVariant::Double, 1, 20, 0, 20 ) // floating point << QgsVectorDataProvider::NativeType( tr( "Decimal number (real)" ), "real", QVariant::Double ) << QgsVectorDataProvider::NativeType( tr( "Decimal number (double)" ), "float", QVariant::Double ) // string types << QgsVectorDataProvider::NativeType( tr( "Text, fixed length (char)" ), "char", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, limited variable length (varchar)" ), "varchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, fixed length unicode (nchar)" ), "nchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, limited variable length unicode (nvarchar)" ), "nvarchar", QVariant::String, 1, 255 ) << QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (text)" ), "text", QVariant::String ) << QgsVectorDataProvider::NativeType( tr( "Text, unlimited length unicode (ntext)" ), "text", QVariant::String ) ; }
QgsAfsProvider::QgsAfsProvider( const QString& uri ) : QgsVectorDataProvider( uri ) , mValid( false ) , mGeometryType( QgsWKBTypes::Unknown ) , mObjectIdFieldIdx( -1 ) { mDataSource = QgsDataSourceURI( uri ); // Set CRS mSourceCRS = QgsCoordinateReferenceSystem::fromOgcWmsCrs( mDataSource.param( "crs" ) ); // Get layer info QString errorTitle, errorMessage; QVariantMap layerData = QgsArcGisRestUtils::getLayerInfo( mDataSource.param( "url" ), errorTitle, errorMessage ); if ( layerData.isEmpty() ) { pushError( errorTitle + ": " + errorMessage ); appendError( QgsErrorMessage( tr( "getLayerInfo failed" ), "AFSProvider" ) ); return; } mLayerName = layerData["name"].toString(); mLayerDescription = layerData["description"].toString(); // Set extent QStringList coords = mDataSource.param( "bbox" ).split( "," ); if ( coords.size() == 4 ) { bool xminOk = false, yminOk = false, xmaxOk = false, ymaxOk = false; mExtent.setXMinimum( coords[0].toDouble( &xminOk ) ); mExtent.setYMinimum( coords[1].toDouble( &yminOk ) ); mExtent.setXMaximum( coords[2].toDouble( &xmaxOk ) ); mExtent.setYMaximum( coords[3].toDouble( &ymaxOk ) ); if ( !xminOk || !yminOk || !xmaxOk || !ymaxOk ) mExtent = QgsRectangle(); } if ( mExtent.isEmpty() ) { QVariantMap layerExtentMap = layerData["extent"].toMap(); bool xminOk = false, yminOk = false, xmaxOk = false, ymaxOk = false; mExtent.setXMinimum( layerExtentMap["xmin"].toDouble( &xminOk ) ); mExtent.setYMinimum( layerExtentMap["ymin"].toDouble( &yminOk ) ); mExtent.setXMaximum( layerExtentMap["xmax"].toDouble( &xmaxOk ) ); mExtent.setYMaximum( layerExtentMap["ymax"].toDouble( &ymaxOk ) ); if ( !xminOk || !yminOk || !xmaxOk || !ymaxOk ) { appendError( QgsErrorMessage( tr( "Could not retrieve layer extent" ), "AFSProvider" ) ); return; } QgsCoordinateReferenceSystem extentCrs = QgsArcGisRestUtils::parseSpatialReference( layerExtentMap["spatialReference"].toMap() ); if ( !extentCrs.isValid() ) { appendError( QgsErrorMessage( tr( "Could not parse spatial reference" ), "AFSProvider" ) ); return; } mExtent = QgsCoordinateTransform( extentCrs, mSourceCRS ).transformBoundingBox( mExtent ); } // Read fields foreach ( const QVariant& fieldData, layerData["fields"].toList() ) { QVariantMap fieldDataMap = fieldData.toMap(); QString fieldName = fieldDataMap["name"].toString(); QVariant::Type type = QgsArcGisRestUtils::mapEsriFieldType( fieldDataMap["type"].toString() ); if ( fieldName == "geometry" || type == QVariant::Invalid ) { QgsDebugMsg( QString( "Skipping unsupported (or possibly geometry) field" ).arg( fieldName ) ); continue; } QgsField field( fieldName, type, fieldDataMap["type"].toString(), fieldDataMap["length"].toInt() ); mFields.append( field ); } // Determine geometry type bool hasM = layerData["hasM"].toBool(); bool hasZ = layerData["hasZ"].toBool(); mGeometryType = QgsArcGisRestUtils::mapEsriGeometryType( layerData["geometryType"].toString() ); if ( mGeometryType == QgsWKBTypes::Unknown ) { appendError( QgsErrorMessage( tr( "Failed to determine geometry type" ), "AFSProvider" ) ); return; } mGeometryType = QgsWKBTypes::zmType( mGeometryType, hasZ, hasM ); // Read OBJECTIDs of all features: these may not be a continuous sequence, // and we need to store these to iterate through the features. This query // also returns the name of the ObjectID field. QVariantMap objectIdData = QgsArcGisRestUtils::getObjectIds( mDataSource.param( "url" ), errorTitle, errorMessage ); if ( objectIdData.isEmpty() ) { appendError( QgsErrorMessage( tr( "getObjectIds failed: %1 - %2" ).arg( errorTitle ).arg( errorMessage ), "AFSProvider" ) ); return; } if ( !objectIdData["objectIdFieldName"].isValid() || !objectIdData["objectIds"].isValid() ) { appendError( QgsErrorMessage( tr( "Failed to determine objectIdFieldName and/or objectIds" ), "AFSProvider" ) ); return; } mObjectIdFieldName = objectIdData["objectIdFieldName"].toString(); for ( int idx = 0, nIdx = mFields.count(); idx < nIdx; ++idx ) { if ( mFields.at( idx ).name() == mObjectIdFieldName ) { mObjectIdFieldIdx = idx; break; } } foreach ( const QVariant& objectId, objectIdData["objectIds"].toList() ) { mObjectIds.append( objectId.toInt() ); } mValid = true; }
// Slot called when the menu item is triggered void SqlAnywhere::addSqlAnywhereLayer() { QgsMapCanvas *mMapCanvas = mQGisIface->mapCanvas(); if ( mMapCanvas && mMapCanvas->isDrawing() ) { return; } // show the data source dialog SaSourceSelect *dbs = new SaSourceSelect( mQGisIface->mainWindow() ); mMapCanvas->freeze(); if ( dbs->exec() ) { // add files to the map canvas QStringList tables = dbs->selectedTables(); SaDebugMsg( "Selected tables:\n" + tables.join( "\n" ) + "\n\n" ); QApplication::setOverrideCursor( Qt::WaitCursor ); // retrieve database connection string QString connectionInfo = dbs->connectionInfo(); // create a new map layer for each selected table and register it for ( QStringList::Iterator it = tables.begin() ; it != tables.end() ; it++ ) { // create the layer SaDebugMsg( "Creating layer " + *it ); SaLayer *layer = new SaLayer( connectionInfo + " " + *it, *it ); if ( layer->isValid() ) { // set initial layer name to table name SaDebugMsg( "Beautifying layer name. old: " + layer->name() ); QgsDataSourceURI layerUri = QgsDataSourceURI( *it ); QString newName = QString( "%1 (%2)" ) .arg( layerUri.table() ) .arg( layerUri.geometryColumn() ); if ( QgsMapLayerRegistry::instance()->mapLayers().contains( newName ) ) { newName = QString( "%1.%2 (%3)" ) .arg( layerUri.schema() ) .arg( layerUri.table() ) .arg( layerUri.geometryColumn() ); if ( QgsMapLayerRegistry::instance()->mapLayers().contains( newName ) ) { // give up and revert to original name newName = layer->name(); } } layer->setLayerName( newName ); SaDebugMsg( "Beautifying layer name. new: " + layer->name() ); // register this layer with the central layers registry QgsMapLayerRegistry::instance()->addMapLayer(( QgsVectorLayer* )layer ); } else { SaDebugMsg(( *it ) + " is an invalid layer - not loaded" ); QMessageBox::critical( mQGisIface->mainWindow(), tr( "Invalid Layer" ), tr( "%1 is an invalid layer and cannot be loaded." ).arg( *it ) ); delete layer; } } QApplication::restoreOverrideCursor(); (( QMainWindow * ) mQGisIface->mainWindow() )->statusBar()->showMessage( mMapCanvas->extent().toString( 2 ) ); } delete dbs; // update UI qApp->processEvents(); // draw the map mMapCanvas->freeze( false ); mMapCanvas->refresh(); } // SqlAnywhere::addSqlAnywhereLayer()