Skip to content

Commit c8859ec

Browse files
committed
oracle provider: fix support for geometryless tables (fixes #7023)
1 parent f91f2d4 commit c8859ec

5 files changed

+50
-50
lines changed

src/providers/oracle/qgsoracleconn.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -220,17 +220,11 @@ bool QgsOracleConn::tableInfo( bool geometryColumnsOnly, bool userTablesOnly, bo
220220
layerProperty.ownerName = qry.value( 0 ).toString();
221221
layerProperty.tableName = qry.value( 1 ).toString();
222222
layerProperty.geometryColName = qry.value( 2 ).toString();
223+
layerProperty.types = QList<QGis::WkbType>() << ( qry.value( 2 ).isNull() ? QGis::WKBNoGeometry : QGis::WKBUnknown );
223224
layerProperty.srids = QList<int>() << qry.value( 3 ).toInt();
224-
layerProperty.types = QList<QGis::WkbType>() << QGis::WKBUnknown; // detect
225225
layerProperty.isView = qry.value( 4 ).isNull();
226226
layerProperty.pkCols.clear();
227227

228-
if ( allowGeometrylessTables )
229-
{
230-
layerProperty.types << QGis::WKBNoGeometry;
231-
layerProperty.srids << 0;
232-
}
233-
234228
mLayersSupported << layerProperty;
235229
}
236230

src/providers/oracle/qgsoracleconn.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,14 @@ struct QgsOracleLayerProperty
8383
sridString += QString::number( srid );
8484
}
8585

86-
return QString( "%1.%2.%3 type=%4 srid=%5 view=%6 sql=%7" )
86+
return QString( "%1.%2.%3 type=%4 srid=%5 view=%6%7 sql=%8" )
8787
.arg( ownerName )
8888
.arg( tableName )
8989
.arg( geometryColName )
9090
.arg( typeString )
9191
.arg( sridString )
9292
.arg( isView ? "yes" : "no" )
93+
.arg( isView ? QString( " pk=%1" ).arg( pkCols.join( "|" ) ) : "" )
9394
.arg( sql );
9495
}
9596
#endif

src/providers/oracle/qgsoracleprovider.cpp

+36-30
Original file line numberDiff line numberDiff line change
@@ -582,11 +582,11 @@ bool QgsOracleProvider::loadFields()
582582
",t.char_used"
583583
",t.data_default"
584584
" FROM all_tab_columns t"
585-
" WHERE t.owner=%1 AND t.table_name=%2 AND t.column_name<>%3"
585+
" WHERE t.owner=%1 AND t.table_name=%2%3"
586586
" ORDER BY t.column_id" )
587587
.arg( quotedValue( mOwnerName ) )
588588
.arg( quotedValue( mTableName ) )
589-
.arg( quotedValue( mGeometryColumn ) )
589+
.arg( mGeometryColumn.isEmpty() ? "" : QString( " AND t.column_name<>%1 " ).arg( quotedValue( mGeometryColumn ) ) )
590590
) )
591591
{
592592
while ( qry.next() )
@@ -643,50 +643,53 @@ bool QgsOracleProvider::loadFields()
643643
tr( "Oracle" ) );
644644
}
645645

646-
if ( exec( qry, QString( "SELECT i.index_name,i.domidx_opstatus"
647-
" FROM all_indexes i"
648-
" JOIN all_ind_columns c ON i.owner=c.index_owner AND i.index_name=c.index_name AND c.column_name=%3"
649-
" WHERE i.table_owner=%1 AND i.table_name=%2 AND i.ityp_owner='MDSYS' AND i.ityp_name='SPATIAL_INDEX'" )
650-
.arg( quotedValue( mOwnerName ) )
651-
.arg( quotedValue( mTableName ) )
652-
.arg( quotedValue( mGeometryColumn ) ) ) )
646+
if ( !mGeometryColumn.isEmpty() )
653647
{
654-
if ( qry.next() )
648+
if ( exec( qry, QString( "SELECT i.index_name,i.domidx_opstatus"
649+
" FROM all_indexes i"
650+
" JOIN all_ind_columns c ON i.owner=c.index_owner AND i.index_name=c.index_name AND c.column_name=%3"
651+
" WHERE i.table_owner=%1 AND i.table_name=%2 AND i.ityp_owner='MDSYS' AND i.ityp_name='SPATIAL_INDEX'" )
652+
.arg( quotedValue( mOwnerName ) )
653+
.arg( quotedValue( mTableName ) )
654+
.arg( quotedValue( mGeometryColumn ) ) ) )
655655
{
656-
mSpatialIndex = qry.value( 0 ).toString();
657-
if ( qry.value( 1 ).toString() != "VALID" )
656+
if ( qry.next() )
657+
{
658+
mSpatialIndex = qry.value( 0 ).toString();
659+
if ( qry.value( 1 ).toString() != "VALID" )
660+
{
661+
QgsMessageLog::logMessage( tr( "Invalid spatial index %1 on column %2.%3.%4 found - expect poor performance." )
662+
.arg( mSpatialIndex )
663+
.arg( mOwnerName )
664+
.arg( mTableName )
665+
.arg( mGeometryColumn ),
666+
tr( "Oracle" ) );
667+
mSpatialIndex = QString::null;
668+
}
669+
else
670+
{
671+
QgsDebugMsg( QString( "Valid spatial index %1 found" ).arg( mSpatialIndex ) );
672+
}
673+
}
674+
else
658675
{
659-
QgsMessageLog::logMessage( tr( "Invalid spatial index %1 on column %2.%3.%4 found - expect poor performance." )
660-
.arg( mSpatialIndex )
676+
QgsMessageLog::logMessage( tr( "No spatial index on column %1.%2.%3 found - expect poor performance." )
661677
.arg( mOwnerName )
662678
.arg( mTableName )
663679
.arg( mGeometryColumn ),
664680
tr( "Oracle" ) );
665-
mSpatialIndex = QString::null;
666-
}
667-
else
668-
{
669-
QgsDebugMsg( QString( "Valid spatial index %1 found" ).arg( mSpatialIndex ) );
670681
}
671682
}
672683
else
673684
{
674-
QgsMessageLog::logMessage( tr( "No spatial index on column %1.%2.%3 found - expect poor performance." )
685+
QgsMessageLog::logMessage( tr( "Probing for spatial index on column %1.%2.%3 failed [%4]" )
675686
.arg( mOwnerName )
676687
.arg( mTableName )
677-
.arg( mGeometryColumn ),
688+
.arg( mGeometryColumn )
689+
.arg( qry.lastError().text() ),
678690
tr( "Oracle" ) );
679691
}
680692
}
681-
else
682-
{
683-
QgsMessageLog::logMessage( tr( "Probing for spatial index on column %1.%2.%3 failed [%4]" )
684-
.arg( mOwnerName )
685-
.arg( mTableName )
686-
.arg( mGeometryColumn )
687-
.arg( qry.lastError().text() ),
688-
tr( "Oracle" ) );
689-
}
690693

691694
qry.finish();
692695

@@ -708,6 +711,9 @@ bool QgsOracleProvider::loadFields()
708711
if ( field.name() == mGeometryColumn )
709712
continue;
710713

714+
if ( !types.contains( field.name() ) )
715+
continue;
716+
711717
mAttributeFields.append( QgsField( field.name(), field.type(), types.value( field.name() ), field.length(), field.precision(), comments.value( field.name() ) ) );
712718
mDefaultValues.append( defvalues.value( field.name(), QVariant() ) );
713719
}

src/providers/oracle/qgsoraclesourceselect.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QSt
8585
if ( values.size() == 0 )
8686
return 0;
8787

88-
8988
if ( values.size() > 0 )
9089
{
9190
QComboBox *cb = new QComboBox( parent );

src/providers/oracle/qgsoracletablemodel.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ void QgsOracleTableModel::addTableEntry( QgsOracleLayerProperty layerProperty )
5959
QgsDebugMsg( layerProperty.toString() );
6060
#endif
6161

62-
if ( !layerProperty.types.contains( QGis::WKBUnknown ) )
62+
if ( layerProperty.isView && layerProperty.pkCols.isEmpty() )
6363
{
64-
layerProperty.types << ( layerProperty.geometryColName.isEmpty() ? QGis::WKBNoGeometry : QGis::WKBUnknown );
65-
layerProperty.srids << 0;
64+
QgsDebugMsg( "View without pk skipped." );
65+
return;
6666
}
6767

6868
// is there already a root item with the given scheme Name?
@@ -75,7 +75,7 @@ void QgsOracleTableModel::addTableEntry( QgsOracleLayerProperty layerProperty )
7575

7676
QStandardItem *ownerNameItem = new QStandardItem( layerProperty.ownerName );
7777

78-
bool selectable = wkbType != QGis::WKBUnknown && srid != 0;
78+
bool selectable = wkbType == QGis::WKBNoGeometry || ( wkbType != QGis::WKBUnknown && srid != 0 );
7979

8080
QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsOracleConn::displayStringForWkbType( wkbType ) );
8181
typeItem->setData( wkbType == QGis::WKBUnknown, Qt::UserRole + 1 );
@@ -85,9 +85,9 @@ void QgsOracleTableModel::addTableEntry( QgsOracleLayerProperty layerProperty )
8585

8686
QStandardItem *tableItem = new QStandardItem( layerProperty.tableName );
8787
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
88-
QStandardItem *sridItem = new QStandardItem( QString::number( srid ) );
89-
sridItem->setEditable( srid == 0 );
90-
if ( srid == 0 )
88+
QStandardItem *sridItem = new QStandardItem( wkbType != QGis::WKBNoGeometry ? QString::number( srid ) : "" );
89+
sridItem->setEditable( wkbType != QGis::WKBNoGeometry && srid == 0 );
90+
if ( sridItem->isEditable() )
9191
{
9292
sridItem->setText( tr( "Enter..." ) );
9393
sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable );
@@ -256,10 +256,10 @@ bool QgsOracleTableModel::setData( const QModelIndex &idx, const QVariant &value
256256
bool ok = geomType != QGis::WKBUnknown;
257257

258258
if ( ok && geomType != QGis::WKBNoGeometry )
259-
idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
260-
261-
int srid = idx.sibling( idx.row(), dbtmSrid ).data().toInt();
262-
ok &= srid != 0;
259+
{
260+
int srid = idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
261+
ok &= srid != 0;
262+
}
263263

264264
ok &= !idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toBool() ||
265265
idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 2 ).toBool();

0 commit comments

Comments
 (0)