@@ -76,14 +76,21 @@ QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri )
76
76
QString username = uri.username ();
77
77
QString password = uri.password ();
78
78
79
+ QString realm ( database );
80
+ if ( !username.isEmpty () )
81
+ realm.prepend ( username + " @" );
82
+
79
83
while ( !mDatabase .open () )
80
84
{
81
- bool ok = QgsCredentials::instance ()->get ( database , username, password, mDatabase .lastError ().text () );
85
+ bool ok = QgsCredentials::instance ()->get ( realm , username, password, mDatabase .lastError ().text () );
82
86
if ( !ok )
83
87
break ;
84
88
85
89
if ( !username.isEmpty () )
90
+ {
86
91
uri.setUsername ( username );
92
+ realm = username + " @" + database;
93
+ }
87
94
88
95
if ( !password.isEmpty () )
89
96
uri.setPassword ( password );
@@ -94,7 +101,7 @@ QgsOracleConn::QgsOracleConn( QgsDataSourceURI uri )
94
101
}
95
102
96
103
if ( mDatabase .isOpen () )
97
- QgsCredentials::instance ()->put ( database , username, password );
104
+ QgsCredentials::instance ()->put ( realm , username, password );
98
105
}
99
106
100
107
if ( !mDatabase .isOpen () )
@@ -377,12 +384,35 @@ void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, b
377
384
where = layerProperty.sql ;
378
385
}
379
386
387
+ QGis::WkbType detectedType = layerProperty.types .value ( 0 , QGis::WKBUnknown );
388
+ int detectedSrid = layerProperty.srids .value ( 0 , -1 );
389
+
390
+ Q_ASSERT ( detectedType == QGis::WKBUnknown || detectedSrid <= 0 );
391
+
380
392
QSqlQuery qry ( mDatabase );
381
- QString sql = QString ( " SELECT DISTINCT t.%1.SDO_GTYPE,t.%1.SDO_SRID FROM %2 t WHERE NOT t.%1 IS NULL%3" )
382
- .arg ( quotedIdentifier ( layerProperty.geometryColName ) )
383
- .arg ( table )
384
- .arg ( where.isEmpty () ? " " : QString ( " AND (%1)" ).arg ( where ) );
385
- if ( !exec ( qry, sql ) )
393
+ int idx = 0 ;
394
+ QString sql = " SELECT DISTINCT " ;
395
+ if ( detectedType == QGis::WKBUnknown )
396
+ {
397
+ sql += " t.%1.SDO_GTYPE" ;
398
+ if ( detectedSrid <= 0 )
399
+ {
400
+ sql += " ," ;
401
+ idx = 1 ;
402
+ }
403
+ }
404
+
405
+ if ( detectedSrid <= 0 )
406
+ {
407
+ sql += " t.%1.SDO_SRID" ;
408
+ }
409
+
410
+ sql += " FROM %2 t WHERE NOT t.%1 IS NULL%3" ;
411
+
412
+ if ( !exec ( qry, sql
413
+ .arg ( quotedIdentifier ( layerProperty.geometryColName ) )
414
+ .arg ( table )
415
+ .arg ( where.isEmpty () ? " " : QString ( " AND (%1)" ).arg ( where ) ) ) )
386
416
{
387
417
QgsMessageLog::logMessage ( tr ( " SQL:%1\n error:%2\n " )
388
418
.arg ( qry.lastQuery () )
@@ -397,19 +427,28 @@ void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, b
397
427
QSet<int > srids;
398
428
while ( qry.next () )
399
429
{
400
- QGis::WkbType type = wkbTypeFromDatabase ( qry.value ( 0 ).toInt () );
401
- if ( type == QGis::WKBUnknown )
430
+ if ( detectedType == QGis::WKBUnknown )
402
431
{
403
- QgsMessageLog::logMessage ( tr ( " Unsupported geometry type %1 in %2.%3.%4 ignored" )
404
- .arg ( qry.value ( 0 ).toInt () )
405
- .arg ( layerProperty.ownerName ).arg ( layerProperty.tableName ).arg ( layerProperty.geometryColName ),
406
- tr ( " Oracle" ) );
407
- continue ;
432
+ QGis::WkbType type = wkbTypeFromDatabase ( qry.value ( 0 ).toInt () );
433
+ if ( type == QGis::WKBUnknown )
434
+ {
435
+ QgsMessageLog::logMessage ( tr ( " Unsupported geometry type %1 in %2.%3.%4 ignored" )
436
+ .arg ( qry.value ( 0 ).toInt () )
437
+ .arg ( layerProperty.ownerName ).arg ( layerProperty.tableName ).arg ( layerProperty.geometryColName ),
438
+ tr ( " Oracle" ) );
439
+ continue ;
440
+ }
441
+ QgsDebugMsg ( QString ( " add type %1" ).arg ( type ) );
442
+ layerProperty.types << type;
443
+ }
444
+ else
445
+ {
446
+ layerProperty.types << detectedType;
408
447
}
409
- QgsDebugMsg ( QString ( " add type %1 " ). arg ( type ) );
410
- layerProperty. types << type ;
411
- layerProperty.srids << ( qry. value ( 1 ). isNull () ? 0 : qry. value ( 1 ). toInt () ) ;
412
- srids << ( qry. value ( 1 ). isNull () ? 0 : qry. value ( 1 ). toInt () ) ;
448
+
449
+ int srid = detectedSrid != - 1 ? detectedSrid : ( qry. value ( idx ). isNull () ? - 1 : qry. value ( idx ). toInt () ) ;
450
+ layerProperty.srids << srid ;
451
+ srids << srid ;
413
452
}
414
453
415
454
qry.finish ();
@@ -466,7 +505,6 @@ QString QgsOracleConn::databaseTypeFilter( QString alias, QString geomCol, QGis:
466
505
return QString::null;
467
506
}
468
507
469
-
470
508
QGis::WkbType QgsOracleConn::wkbTypeFromDatabase ( int gtype )
471
509
{
472
510
QgsDebugMsg ( QString ( " entering %1" ).arg ( gtype ) );
0 commit comments