QVector<QgsDataItem*> QgsPGConnectionItem::createChildren() { QgsDebugMsg( "Entered" ); QVector<QgsDataItem*>items; QgsDataSourceURI uri = QgsPostgresConn::connUri( mName ); QgsPostgresConn *conn = QgsPostgresConnPool::instance()->acquireConnection( uri.connectionInfo() ); if ( !conn ) { items.append( new QgsErrorItem( this, tr( "Connection failed" ), mPath + "/error" ) ); QgsDebugMsg( "Connection failed - " + uri.connectionInfo() ); return items; } QVector<QgsPostgresLayerProperty> layerProperties; bool ok = conn->supportedLayers( layerProperties, QgsPostgresConn::geometryColumnsOnly( mName ), QgsPostgresConn::publicSchemaOnly( mName ), QgsPostgresConn::allowGeometrylessTables( mName ) ); QgsPostgresConnPool::instance()->releaseConnection( conn ); if ( !ok ) { items.append( new QgsErrorItem( this, tr( "Failed to get schemas" ), mPath + "/error" ) ); return items; } QSet<QString> schemaNames; foreach ( QgsPostgresLayerProperty layerProperty, layerProperties ) { schemaNames.insert( layerProperty.schemaName ); }
QVector<QgsDataItem *> QgsPGSchemaItem::createChildren() { QVector<QgsDataItem *>items; QgsDataSourceUri uri = QgsPostgresConn::connUri( mConnectionName ); QgsPostgresConn *conn = QgsPostgresConnPool::instance()->acquireConnection( uri.connectionInfo( false ) ); if ( !conn ) { items.append( new QgsErrorItem( this, tr( "Connection failed" ), mPath + "/error" ) ); QgsDebugMsg( "Connection failed - " + uri.connectionInfo( false ) ); return items; } QVector<QgsPostgresLayerProperty> layerProperties; bool ok = conn->supportedLayers( layerProperties, QgsPostgresConn::geometryColumnsOnly( mConnectionName ), QgsPostgresConn::publicSchemaOnly( mConnectionName ), QgsPostgresConn::allowGeometrylessTables( mConnectionName ), mName ); if ( !ok ) { items.append( new QgsErrorItem( this, tr( "Failed to get layers" ), mPath + "/error" ) ); QgsPostgresConnPool::instance()->releaseConnection( conn ); return items; } bool dontResolveType = QgsPostgresConn::dontResolveType( mConnectionName ); const auto constLayerProperties = layerProperties; for ( QgsPostgresLayerProperty layerProperty : constLayerProperties ) { if ( layerProperty.schemaName != mName ) continue; if ( !layerProperty.geometryColName.isNull() && ( layerProperty.types.value( 0, QgsWkbTypes::Unknown ) == QgsWkbTypes::Unknown || layerProperty.srids.value( 0, std::numeric_limits<int>::min() ) == std::numeric_limits<int>::min() ) ) { if ( dontResolveType ) { //QgsDebugMsg( QStringLiteral( "skipping column %1.%2 without type constraint" ).arg( layerProperty.schemaName ).arg( layerProperty.tableName ) ); continue; } conn->retrieveLayerTypes( layerProperty, true /* useEstimatedMetadata */ ); } for ( int i = 0; i < layerProperty.size(); i++ ) { QgsPGLayerItem *layerItem = createLayer( layerProperty.at( i ) ); if ( layerItem ) items.append( layerItem ); } } QgsPostgresConnPool::instance()->releaseConnection( conn ); QgsProjectStorage *storage = QgsApplication::projectStorageRegistry()->projectStorageFromType( "postgresql" ); if ( QgsPostgresConn::allowProjectsInDatabase( mConnectionName ) && storage ) { QgsPostgresProjectUri postUri; postUri.connInfo = uri; postUri.schemaName = mName; QString schemaUri = QgsPostgresProjectStorage::encodeUri( postUri ); const QStringList projectNames = storage->listProjects( schemaUri ); for ( const QString &projectName : projectNames ) { QgsPostgresProjectUri projectUri( postUri ); projectUri.projectName = projectName; items.append( new QgsProjectItem( this, projectName, QgsPostgresProjectStorage::encodeUri( projectUri ) ) ); } } return items; }