Skip to content

Commit 831f99a

Browse files
committed
oracle provider improvements:
- improve srs lookup - insert crs to oracle table on import, if not existent (requires INSERT privilege on MDSYS.SDO_COORD_REF_SYSTEM) - move table lookup into thread - use QgsMessageOutput for import errors (also in postgres and spatialite) - german translation update
1 parent fcb5045 commit 831f99a

15 files changed

+1217
-1144
lines changed

doc/TRANSLATORS

Lines changed: 33 additions & 33 deletions
Large diffs are not rendered by default.

i18n/qgis_de.ts

Lines changed: 838 additions & 839 deletions
Large diffs are not rendered by default.

src/providers/oracle/qgsoraclecolumntypethread.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,39 +16,51 @@ email : jef at norbit dot de
1616
***************************************************************************/
1717

1818
#include "qgsoraclecolumntypethread.h"
19+
#include "qgslogger.h"
1920

2021
#include <QMetaType>
2122

22-
QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QgsOracleConn *conn, bool useEstimatedMetaData )
23+
QgsOracleColumnTypeThread::QgsOracleColumnTypeThread( QString name, bool useEstimatedMetadata )
2324
: QThread()
24-
, mConn( conn )
25-
, mUseEstimatedMetadata( useEstimatedMetaData )
25+
, mName( name )
26+
, mUseEstimatedMetadata( useEstimatedMetadata )
2627
{
2728
qRegisterMetaType<QgsOracleLayerProperty>( "QgsOracleLayerProperty" );
2829
}
2930

30-
void QgsOracleColumnTypeThread::addGeometryColumn( QgsOracleLayerProperty layerProperty )
31-
{
32-
layerProperties << layerProperty;
33-
}
34-
3531
void QgsOracleColumnTypeThread::stop()
3632
{
3733
mStopped = true;
3834
}
3935

4036
void QgsOracleColumnTypeThread::run()
4137
{
42-
if ( !mConn )
38+
QgsDataSourceURI uri = QgsOracleConn::connUri( mName );
39+
QgsOracleConn *conn = QgsOracleConn::connectDb( uri.connectionInfo() );
40+
if ( !conn )
41+
{
42+
QgsDebugMsg( "Connection failed - " + uri.connectionInfo() );
4343
return;
44+
}
4445

4546
mStopped = false;
4647

48+
QgsDebugMsg( "retrieving supported layers - connection " + mName );
49+
QVector<QgsOracleLayerProperty> layerProperties;
50+
if ( !conn->supportedLayers( layerProperties,
51+
QgsOracleConn::geometryColumnsOnly( mName ),
52+
QgsOracleConn::userTablesOnly( mName ),
53+
QgsOracleConn::allowGeometrylessTables( mName ) ) ||
54+
layerProperties.isEmpty() )
55+
{
56+
return;
57+
}
58+
4759
foreach ( QgsOracleLayerProperty layerProperty, layerProperties )
4860
{
4961
if ( !mStopped )
5062
{
51-
mConn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata );
63+
conn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata );
5264
}
5365

5466
if ( mStopped )
@@ -61,6 +73,5 @@ void QgsOracleColumnTypeThread::run()
6173
emit setLayerType( layerProperty );
6274
}
6375

64-
mConn->disconnect();
65-
mConn = 0;
76+
conn->disconnect();
6677
}

src/providers/oracle/qgsoraclecolumntypethread.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class QgsOracleColumnTypeThread : public QThread
2828
{
2929
Q_OBJECT
3030
public:
31-
QgsOracleColumnTypeThread( QgsOracleConn *conn, bool useEstimatedMetaData );
31+
QgsOracleColumnTypeThread( QString connName, bool useEstimatedMetaData );
3232

3333
// These functions get the layer types and pass that information out
3434
// by emitting the setLayerType() signal.
@@ -38,13 +38,12 @@ class QgsOracleColumnTypeThread : public QThread
3838
void setLayerType( QgsOracleLayerProperty layerProperty );
3939

4040
public slots:
41-
void addGeometryColumn( QgsOracleLayerProperty layerProperty );
4241
void stop();
4342

4443
private:
4544
QgsOracleColumnTypeThread() {}
4645

47-
QgsOracleConn *mConn;
46+
QString mName;
4847
bool mUseEstimatedMetadata;
4948
bool mStopped;
5049
QList<QgsOracleLayerProperty> layerProperties;

src/providers/oracle/qgsoracleconn.cpp

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -173,34 +173,37 @@ QStringList QgsOracleConn::pkCandidates( QString ownerName, QString viewName )
173173
return cols;
174174
}
175175

176-
bool QgsOracleConn::tableInfo( bool geometryTablesOnly, bool userTablesOnly, bool allowGeometrylessTables )
176+
bool QgsOracleConn::tableInfo( bool geometryColumnsOnly, bool userTablesOnly, bool allowGeometrylessTables )
177177
{
178178
QgsDebugMsg( "Entering." );
179179

180180
mLayersSupported.clear();
181181

182182
QString sql, delim;
183183

184-
sql = QString( "SELECT c.owner,c.table_name,c.column_name,%1,t.table_name AS isview"
185-
" FROM %2 c"
186-
" LEFT OUTER JOIN all_tables t ON c.owner=t.owner AND c.table_name=t.table_name%3" )
187-
.arg( geometryTablesOnly ? "c.srid" : "NULL AS srid" )
188-
.arg( geometryTablesOnly ? "all_sdo_geom_metadata" : "all_tab_columns" )
189-
.arg( geometryTablesOnly ? "" : " WHERE c.data_type='SDO_GEOMETRY' AND c.data_type_owner='MDSYS'" );
184+
QString
185+
prefix( userTablesOnly ? "user" : "all" ),
186+
owner( userTablesOnly ? "user AS owner" : "c.owner" );
187+
188+
sql = QString( "SELECT %1,c.table_name,c.column_name,%2,t.table_name AS isview"
189+
" FROM %3_%4 c"
190+
" LEFT OUTER JOIN %3_tables t ON c.table_name=t.table_name%5%6" )
191+
.arg( owner )
192+
.arg( geometryColumnsOnly ? "c.srid" : "NULL AS srid" )
193+
.arg( prefix )
194+
.arg( geometryColumnsOnly ? "sdo_geom_metadata" : "tab_columns" )
195+
.arg( userTablesOnly ? "" : " AND c.owner=t.owner" )
196+
.arg( geometryColumnsOnly ? "" : " WHERE c.data_type='SDO_GEOMETRY' AND c.data_type_owner='MDSYS'" );
190197

191198
if ( allowGeometrylessTables )
192199
{
193-
sql += " UNION SELECT owner,table_name,NULL AS column_name,NULL AS srid,table_name AS isview FROM all_tables"
194-
" UNION SELECT owner,view_name,NULL AS column_name,NULL AS srid,NULL AS isview FROM all_views";
200+
sql += QString( " UNION SELECT %1,table_name,NULL AS column_name,NULL AS srid,table_name AS isview FROM %2_tables c"
201+
" UNION SELECT %1,view_name,NULL AS column_name,NULL AS srid,NULL AS isview FROM %2_views c" )
202+
.arg( owner ).arg( prefix );
195203
}
196204

197205
sql = "SELECT * FROM (" + sql + ")";
198206

199-
if ( userTablesOnly )
200-
{
201-
sql += " WHERE owner=user";
202-
}
203-
204207
sql += " ORDER BY owner,isview,table_name,column_name";
205208

206209
QSqlQuery qry( mDatabase );
@@ -221,6 +224,12 @@ bool QgsOracleConn::tableInfo( bool geometryTablesOnly, bool userTablesOnly, boo
221224
layerProperty.isView = qry.value( 4 ).isNull();
222225
layerProperty.pkCols.clear();
223226

227+
if ( allowGeometrylessTables )
228+
{
229+
layerProperty.types << QGis::WKBNoGeometry;
230+
layerProperty.srids << 0;
231+
}
232+
224233
mLayersSupported << layerProperty;
225234
}
226235

@@ -313,7 +322,11 @@ QString QgsOracleConn::fieldExpression( const QgsField &fld )
313322

314323
void QgsOracleConn::retrieveLayerTypes( QgsOracleLayerProperty &layerProperty, bool useEstimatedMetadata )
315324
{
325+
if ( layerProperty.geometryColName.isEmpty() )
326+
return;
327+
316328
QgsDebugMsg( "entering: " + layerProperty.toString() );
329+
317330
QString table;
318331
QString where;
319332

@@ -569,7 +582,7 @@ void QgsOracleConn::deleteConnection( QString theConnName )
569582
settings.remove( key + "/database" );
570583
settings.remove( key + "/username" );
571584
settings.remove( key + "/password" );
572-
settings.remove( key + "/publicOnly" );
585+
settings.remove( key + "/userTablesOnly" );
573586
settings.remove( key + "/geometryColumnsOnly" );
574587
settings.remove( key + "/allowGeometrylessTables" );
575588
settings.remove( key + "/estimatedMetadata" );
@@ -635,12 +648,24 @@ bool QgsOracleConn::userTablesOnly( QString theConnName )
635648
return settings.value( "/Oracle/connections/" + theConnName + "/userTablesOnly", false ).toBool();
636649
}
637650

651+
bool QgsOracleConn::geometryColumnsOnly( QString theConnName )
652+
{
653+
QSettings settings;
654+
return settings.value( "/Oracle/connections/" + theConnName + "/geometryColumnsOnly", false ).toBool();
655+
}
656+
638657
bool QgsOracleConn::allowGeometrylessTables( QString theConnName )
639658
{
640659
QSettings settings;
641660
return settings.value( "/Oracle/connections/" + theConnName + "/allowGeometrylessTables", false ).toBool();
642661
}
643662

663+
bool QgsOracleConn::estimatedMetadata( QString theConnName )
664+
{
665+
QSettings settings;
666+
return settings.value( "/Oracle/connections/" + theConnName + "/estimatedMetadata", false ).toBool();
667+
}
668+
644669
QString QgsOracleConn::databaseName( QString database, QString host, QString port )
645670
{
646671
QString db;

src/providers/oracle/qgsoracleconn.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ class QgsOracleConn : public QThread
147147
static void setSelectedConnection( QString theConnName );
148148
static QgsDataSourceURI connUri( QString theConnName );
149149
static bool userTablesOnly( QString theConnName );
150+
static bool geometryColumnsOnly( QString theConnName );
150151
static bool allowGeometrylessTables( QString theConnName );
152+
static bool estimatedMetadata( QString theConnName );
151153
static void deleteConnection( QString theConnName );
152154
static QString databaseName( QString database, QString host, QString port );
153155

0 commit comments

Comments
 (0)