void QgsOracleTableModel::addTableEntry( const QgsOracleLayerProperty &layerProperty ) { QgsDebugMsg( layerProperty.toString() ); if ( layerProperty.isView && layerProperty.pkCols.isEmpty() ) { QgsDebugMsg( "View without pk skipped." ); return; } // is there already a root item with the given scheme Name? QStandardItem *ownerItem = 0; for ( int i = 0; i < layerProperty.size(); i++ ) { QGis::WkbType wkbType = layerProperty.types[ i ]; int srid = layerProperty.srids[ i ]; QString tip; if ( wkbType == QGis::WKBUnknown ) { tip = tr( "Specify a geometry type" ); } else if ( wkbType != QGis::WKBNoGeometry && srid == 0 ) { tip = tr( "Enter a SRID" ); } if ( tip.isEmpty() && layerProperty.isView ) { tip = tr( "Select a primary key" ); } QStandardItem *ownerNameItem = new QStandardItem( layerProperty.ownerName ); QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsOracleConn::displayStringForWkbType( wkbType ) ); typeItem->setData( wkbType == QGis::WKBUnknown, Qt::UserRole + 1 ); typeItem->setData( wkbType, Qt::UserRole + 2 ); if ( wkbType == QGis::WKBUnknown ) typeItem->setFlags( typeItem->flags() | Qt::ItemIsEditable ); QStandardItem *tableItem = new QStandardItem( layerProperty.tableName ); QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName ); QStandardItem *sridItem = new QStandardItem( wkbType != QGis::WKBNoGeometry ? QString::number( srid ) : "" ); sridItem->setEditable( wkbType != QGis::WKBNoGeometry && srid == 0 ); if ( sridItem->isEditable() ) { sridItem->setText( tr( "Enter..." ) ); sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable ); } QStandardItem *pkItem = new QStandardItem( "" ); if ( layerProperty.isView ) { pkItem->setText( tr( "Select..." ) ); pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable ); } else pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable ); pkItem->setData( layerProperty.isView, Qt::UserRole + 1 ); pkItem->setData( false, Qt::UserRole + 2 ); // not selected QStandardItem *selItem = new QStandardItem( "" ); selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable ); selItem->setCheckState( Qt::Checked ); selItem->setToolTip( tr( "Disable 'Fast Access to Features at ID' capability to force keeping the attribute table in memory (e.g. in case of expensive views)." ) ); QStandardItem* sqlItem = new QStandardItem( layerProperty.sql ); QList<QStandardItem*> childItemList; childItemList << ownerNameItem; childItemList << tableItem; childItemList << typeItem; childItemList << geomItem; childItemList << sridItem; childItemList << pkItem; childItemList << selItem; childItemList << sqlItem; foreach ( QStandardItem *item, childItemList ) { if ( tip.isEmpty() ) { item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled ); item->setToolTip( "" ); } else { item->setFlags( item->flags() & ~Qt::ItemIsSelectable ); if ( item == ownerNameItem || item == tableItem || item == geomItem ) { item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); item->setToolTip( tip ); } } } if ( !ownerItem ) { QList<QStandardItem*> ownerItems = findItems( layerProperty.ownerName, Qt::MatchExactly, dbtmOwner ); // there is already an item for this schema if ( ownerItems.size() > 0 ) { ownerItem = ownerItems.at( dbtmOwner ); } else { // create a new toplevel item for this schema ownerItem = new QStandardItem( layerProperty.ownerName ); ownerItem->setFlags( Qt::ItemIsEnabled ); invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), ownerItem ); } } ownerItem->appendRow( childItemList ); ++mTableCount; } }
void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, bool useEstimatedMetadata, bool onlyExistingTypes ) { if ( layerProperty.geometryColName.isEmpty() ) return; QgsDebugMsg( "entering: " + layerProperty.toString() ); QString table; QString where; if ( useEstimatedMetadata ) { table = QString( "(SELECT %1 FROM %2.%3 WHERE %1 IS NOT NULL%4 AND rownum<=%5)" ) .arg( quotedIdentifier( layerProperty.geometryColName ) ) .arg( quotedIdentifier( layerProperty.ownerName ) ) .arg( quotedIdentifier( layerProperty.tableName ) ) .arg( layerProperty.sql.isEmpty() ? "" : QString( " AND (%1)" ).arg( layerProperty.sql ) ) .arg( sGeomTypeSelectLimit ); } else if ( !layerProperty.ownerName.isEmpty() ) { table = QString( "%1.%2" ) .arg( quotedIdentifier( layerProperty.ownerName ) ) .arg( quotedIdentifier( layerProperty.tableName ) ); where = layerProperty.sql; } else { table = quotedIdentifier( layerProperty.tableName ); where = layerProperty.sql; } QGis::WkbType detectedType = layerProperty.types.value( 0, QGis::WKBUnknown ); int detectedSrid = layerProperty.srids.value( 0, -1 ); Q_ASSERT( detectedType == QGis::WKBUnknown || detectedSrid <= 0 ); QSqlQuery qry( mDatabase ); int idx = 0; QString sql = "SELECT DISTINCT "; if ( detectedType == QGis::WKBUnknown ) { sql += "t.%1.SDO_GTYPE"; if ( detectedSrid <= 0 ) { sql += ","; idx = 1; } } if ( detectedSrid <= 0 ) { sql += "t.%1.SDO_SRID"; } sql += " FROM %2 t WHERE NOT t.%1 IS NULL%3"; if ( !exec( qry, sql .arg( quotedIdentifier( layerProperty.geometryColName ) ) .arg( table ) .arg( where.isEmpty() ? "" : QString( " AND (%1)" ).arg( where ) ) ) ) { QgsMessageLog::logMessage( tr( "SQL:%1\nerror:%2\n" ) .arg( qry.lastQuery() ) .arg( qry.lastError().text() ), tr( "Oracle" ) ); return; } layerProperty.types.clear(); layerProperty.srids.clear(); QSet<int> srids; while ( qry.next() ) { if ( detectedType == QGis::WKBUnknown ) { QGis::WkbType type = wkbTypeFromDatabase( qry.value( 0 ).toInt() ); if ( type == QGis::WKBUnknown ) { QgsMessageLog::logMessage( tr( "Unsupported geometry type %1 in %2.%3.%4 ignored" ) .arg( qry.value( 0 ).toInt() ) .arg( layerProperty.ownerName ).arg( layerProperty.tableName ).arg( layerProperty.geometryColName ), tr( "Oracle" ) ); continue; } QgsDebugMsg( QString( "add type %1" ).arg( type ) ); layerProperty.types << type; } else { layerProperty.types << detectedType; } int srid = detectedSrid != -1 ? detectedSrid : ( qry.value( idx ).isNull() ? -1 : qry.value( idx ).toInt() ); layerProperty.srids << srid; srids << srid; } qry.finish(); if ( !onlyExistingTypes ) { layerProperty.types << QGis::WKBUnknown; layerProperty.srids << ( srids.size() == 1 ? *srids.constBegin() : 0 ); } if ( layerProperty.isView ) { layerProperty.pkCols = pkCandidates( layerProperty.ownerName, layerProperty.tableName ); if ( layerProperty.pkCols.isEmpty() ) { QgsMessageLog::logMessage( tr( "View %1.%2 doesn't have integer columns for use as keys." ) .arg( layerProperty.ownerName ).arg( layerProperty.tableName ), tr( "Oracle" ) ); } } QgsDebugMsg( "leaving." ); }