Skip to content

Commit b85af12

Browse files
committed
postgres provider:
- move available table detection to thread - more progress messages
1 parent 4182baa commit b85af12

10 files changed

+357
-453
lines changed

src/providers/postgres/qgscolumntypethread.cpp

+45-11
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,20 @@ email : jef at norbit dot de
1616
***************************************************************************/
1717

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

2021
#include <QMetaType>
2122

22-
QgsGeomColumnTypeThread::QgsGeomColumnTypeThread( QgsPostgresConn *conn, bool useEstimatedMetaData )
23+
QgsGeomColumnTypeThread::QgsGeomColumnTypeThread( QString name, bool useEstimatedMetaData, bool allowGeometrylessTables )
2324
: QThread()
24-
, mConn( conn )
25+
, mConn( 0 )
26+
, mName( name )
2527
, mUseEstimatedMetadata( useEstimatedMetaData )
28+
, mAllowGeometrylessTables( allowGeometrylessTables )
2629
{
2730
qRegisterMetaType<QgsPostgresLayerProperty>( "QgsPostgresLayerProperty" );
2831
}
2932

30-
void QgsGeomColumnTypeThread::addGeometryColumn( QgsPostgresLayerProperty layerProperty )
31-
{
32-
layerProperties << layerProperty;
33-
}
34-
3533
void QgsGeomColumnTypeThread::stop()
3634
{
3735
if ( !mConn )
@@ -43,31 +41,67 @@ void QgsGeomColumnTypeThread::stop()
4341

4442
void QgsGeomColumnTypeThread::run()
4543
{
44+
QgsDataSourceURI uri = QgsPostgresConn::connUri( mName );
45+
mConn = QgsPostgresConn::connectDb( uri.connectionInfo(), true );
4646
if ( !mConn )
47+
{
48+
QgsDebugMsg( "Connection failed - " + uri.connectionInfo() );
4749
return;
50+
}
4851

4952
mStopped = false;
5053

54+
bool dontResolveType = QgsPostgresConn::dontResolveType( mName );
55+
56+
emit progressMessage( tr( "Retrieving tables of %1..." ).arg( mName ) );
57+
QVector<QgsPostgresLayerProperty> layerProperties;
58+
if ( !mConn->supportedLayers( layerProperties,
59+
QgsPostgresConn::geometryColumnsOnly( mName ),
60+
QgsPostgresConn::publicSchemaOnly( mName ),
61+
mAllowGeometrylessTables ) ||
62+
layerProperties.isEmpty() )
63+
{
64+
return;
65+
}
66+
5167
int i = 0;
5268
foreach ( QgsPostgresLayerProperty layerProperty, layerProperties )
5369
{
5470
if ( !mStopped )
5571
{
5672
emit progress( i++, layerProperties.size() );
57-
emit progressMessage( tr( "Scanning column %1.%2.%3..." ).arg( layerProperty.schemaName ).arg( layerProperty.tableName ).arg( layerProperty.geometryColName ) );
58-
mConn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata );
73+
emit progressMessage( tr( "Scanning column %1.%2.%3..." )
74+
.arg( layerProperty.schemaName )
75+
.arg( layerProperty.tableName )
76+
.arg( layerProperty.geometryColName ) );
77+
78+
if ( !layerProperty.geometryColName.isNull() &&
79+
( layerProperty.types.value( 0, QGis::WKBUnknown ) == QGis::WKBUnknown ||
80+
layerProperty.srids.value( 0, 0 ) == 0 ) )
81+
{
82+
if ( dontResolveType )
83+
{
84+
QgsDebugMsg( QString( "skipping column %1.%2 without type constraint" ).arg( layerProperty.schemaName ).arg( layerProperty.tableName ) );
85+
continue;
86+
}
87+
88+
mConn->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata );
89+
}
5990
}
6091

6192
if ( mStopped )
6293
{
63-
layerProperty.type = "";
64-
layerProperty.srid = "";
94+
layerProperty.types.clear();
95+
layerProperty.srids.clear();
6596
}
6697

6798
// Now tell the layer list dialog box...
6899
emit setLayerType( layerProperty );
69100
}
70101

102+
emit progress( 0, 0 );
103+
emit progressMessage( tr( "Table retrieval finished." ) );
104+
71105
mConn->disconnect();
72106
mConn = 0;
73107
}

src/providers/postgres/qgscolumntypethread.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class QgsGeomColumnTypeThread : public QThread
2828
{
2929
Q_OBJECT
3030
public:
31-
QgsGeomColumnTypeThread( QgsPostgresConn *conn, bool useEstimatedMetaData );
31+
QgsGeomColumnTypeThread( QString connName, bool useEstimatedMetaData, bool allowGeometrylessTables );
3232

3333
// These functions get the layer types and pass that information out
3434
// by emitting the setLayerType() signal.
@@ -40,14 +40,15 @@ class QgsGeomColumnTypeThread : public QThread
4040
void progressMessage( QString );
4141

4242
public slots:
43-
void addGeometryColumn( QgsPostgresLayerProperty layerProperty );
4443
void stop();
4544

4645
private:
4746
QgsGeomColumnTypeThread() {}
4847

4948
QgsPostgresConn *mConn;
49+
QString mName;
5050
bool mUseEstimatedMetadata;
51+
bool mAllowGeometrylessTables;
5152
bool mStopped;
5253
QList<QgsPostgresLayerProperty> layerProperties;
5354
};

src/providers/postgres/qgspgsourceselect.cpp

+25-110
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,18 @@ QgsPgSourceSelect::QgsPgSourceSelect( QWidget *parent, Qt::WFlags fl, bool manag
120120
: QDialog( parent, fl )
121121
, mManagerMode( managerMode )
122122
, mEmbeddedMode( embeddedMode )
123-
, mColumnTypeThread( NULL )
123+
, mColumnTypeThread( 0 )
124124
{
125125
setupUi( this );
126126

127127
if ( mEmbeddedMode )
128128
{
129129
buttonBox->button( QDialogButtonBox::Close )->hide();
130130
}
131+
else
132+
{
133+
setWindowTitle( tr( "Add PostGIS Table(s)" ) );
134+
}
131135

132136
mAddButton = new QPushButton( tr( "&Add" ) );
133137
mAddButton->setEnabled( false );
@@ -352,7 +356,7 @@ void QgsPgSourceSelect::on_mSearchModeComboBox_currentIndexChanged( const QStrin
352356
void QgsPgSourceSelect::setLayerType( QgsPostgresLayerProperty layerProperty )
353357
{
354358
QgsDebugMsg( "entering." );
355-
mTableModel.setGeometryTypesForTable( layerProperty );
359+
mTableModel.addTableEntry( layerProperty );
356360
}
357361

358362
QgsPgSourceSelect::~QgsPgSourceSelect()
@@ -437,80 +441,21 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
437441
mConnInfo = uri.connectionInfo();
438442
mUseEstimatedMetadata = uri.useEstimatedMetadata();
439443

440-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( uri.connectionInfo(), true );
441-
if ( conn )
442-
{
443-
QApplication::setOverrideCursor( Qt::WaitCursor );
444-
445-
bool searchPublicOnly = QgsPostgresConn::publicSchemaOnly( cmbConnections->currentText() );
446-
bool searchGeometryColumnsOnly = QgsPostgresConn::geometryColumnsOnly( cmbConnections->currentText() );
447-
bool dontResolveType = QgsPostgresConn::dontResolveType( cmbConnections->currentText() );
448-
bool allowGeometrylessTables = cbxAllowGeometrylessTables->isChecked();
449-
450-
emit progressMessage( tr( "Retrieving tables from %1..." ).arg( cmbConnections->currentText() ) );
451-
452-
QVector<QgsPostgresLayerProperty> layers;
453-
if ( conn->supportedLayers( layers, searchGeometryColumnsOnly, searchPublicOnly, allowGeometrylessTables ) )
454-
{
455-
// Add the supported layers to the table
456-
foreach ( QgsPostgresLayerProperty layer, layers )
457-
{
458-
QString type = layer.type;
459-
QString srid = layer.srid;
460-
if ( !layer.geometryColName.isNull() )
461-
{
462-
if ( QgsPostgresConn::wkbTypeFromPostgis( type ) == QGis::WKBUnknown || srid.isEmpty() )
463-
{
464-
if ( dontResolveType )
465-
{
466-
QgsDebugMsg( QString( "skipping column %1.%2 without type constraint" ).arg( layer.schemaName ).arg( layer.tableName ) );
467-
continue;
468-
}
469-
470-
addSearchGeometryColumn( layer );
471-
type = "";
472-
srid = "";
473-
}
474-
}
475-
QgsDebugMsg( QString( "adding table %1.%2" ).arg( layer.schemaName ).arg( layer.tableName ) );
476-
477-
layer.type = type;
478-
layer.srid = srid;
479-
mTableModel.addTableEntry( layer );
480-
}
481-
482-
if ( mColumnTypeThread )
483-
{
484-
btnConnect->setText( tr( "Stop" ) );
485-
mColumnTypeThread->start();
486-
}
487-
}
444+
QApplication::setOverrideCursor( Qt::BusyCursor );
488445

489-
//if we have only one schema item, expand it by default
490-
int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
491-
if ( numTopLevelItems < 2 || mTableModel.tableCount() < 20 )
492-
{
493-
//expand all the toplevel items
494-
for ( int i = 0; i < numTopLevelItems; ++i )
495-
{
496-
mTablesTreeView->expand( mProxyModel.mapFromSource( mTableModel.indexFromItem( mTableModel.invisibleRootItem()->child( i ) ) ) );
497-
}
498-
}
446+
mColumnTypeThread = new QgsGeomColumnTypeThread( cmbConnections->currentText(), mUseEstimatedMetadata, cbxAllowGeometrylessTables->isChecked() );
499447

500-
conn->disconnect();
448+
connect( mColumnTypeThread, SIGNAL( setLayerType( QgsPostgresLayerProperty ) ),
449+
this, SLOT( setLayerType( QgsPostgresLayerProperty ) ) );
450+
connect( mColumnTypeThread, SIGNAL( finished() ),
451+
this, SLOT( columnThreadFinished() ) );
452+
connect( mColumnTypeThread, SIGNAL( progress( int, int ) ),
453+
this, SIGNAL( progress( int, int ) ) );
454+
connect( mColumnTypeThread, SIGNAL( progressMessage( QString ) ),
455+
this, SIGNAL( progressMessage( QString ) ) );
501456

502-
if ( !mColumnTypeThread )
503-
{
504-
finishList();
505-
}
506-
}
507-
else
508-
{
509-
// Let user know we couldn't initialise the Postgres/PostGIS provider
510-
QMessageBox::warning( this,
511-
tr( "Postgres/PostGIS Provider" ),
512-
tr( "Could not open the Postgres/PostGIS Provider.\nCheck message log for possible errors." ) );
513-
}
457+
btnConnect->setText( tr( "Stop" ) );
458+
mColumnTypeThread->start();
514459
}
515460

516461
void QgsPgSourceSelect::finishList()
@@ -527,15 +472,6 @@ void QgsPgSourceSelect::finishList()
527472

528473
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
529474
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
530-
531-
emit progress( 0, 0 );
532-
emit progressMessage( tr( "Table retrieval finished." ) );
533-
534-
if ( mTablesTreeView->model()->rowCount() == 0 )
535-
QMessageBox::information( this,
536-
tr( "Postgres/PostGIS Provider" ),
537-
tr( "No accessible tables or views found.\nCheck the message log for possible errors." ) );
538-
539475
}
540476

541477
void QgsPgSourceSelect::columnThreadFinished()
@@ -568,8 +504,14 @@ void QgsPgSourceSelect::setSql( const QModelIndex &index )
568504
QModelIndex idx = mProxyModel.mapToSource( index );
569505
QString tableName = mTableModel.itemFromIndex( idx.sibling( idx.row(), QgsPgTableModel::dbtmTable ) )->text();
570506

571-
QgsVectorLayer *vlayer = new QgsVectorLayer( mTableModel.layerURI( idx, mConnInfo, mUseEstimatedMetadata ), tableName, "postgres" );
507+
QString uri = mTableModel.layerURI( idx, mConnInfo, mUseEstimatedMetadata );
508+
if ( uri.isNull() )
509+
{
510+
QgsDebugMsg( "no uri" );
511+
return;
512+
}
572513

514+
QgsVectorLayer *vlayer = new QgsVectorLayer( uri, tableName, "postgres" );
573515
if ( !vlayer->isValid() )
574516
{
575517
delete vlayer;
@@ -587,33 +529,6 @@ void QgsPgSourceSelect::setSql( const QModelIndex &index )
587529
delete vlayer;
588530
}
589531

590-
void QgsPgSourceSelect::addSearchGeometryColumn( QgsPostgresLayerProperty layerProperty )
591-
{
592-
// store the column details and do the query in a thread
593-
if ( !mColumnTypeThread )
594-
{
595-
QgsPostgresConn *conn = QgsPostgresConn::connectDb( mConnInfo, true /* readonly */ );
596-
if ( conn )
597-
{
598-
599-
mColumnTypeThread = new QgsGeomColumnTypeThread( conn, mUseEstimatedMetadata );
600-
601-
connect( mColumnTypeThread, SIGNAL( setLayerType( QgsPostgresLayerProperty ) ),
602-
this, SLOT( setLayerType( QgsPostgresLayerProperty ) ) );
603-
connect( this, SIGNAL( addGeometryColumn( QgsPostgresLayerProperty ) ),
604-
mColumnTypeThread, SLOT( addGeometryColumn( QgsPostgresLayerProperty ) ) );
605-
connect( mColumnTypeThread, SIGNAL( finished() ),
606-
this, SLOT( columnThreadFinished() ) );
607-
connect( mColumnTypeThread, SIGNAL( progress( int, int ) ),
608-
this, SIGNAL( progress( int, int ) ) );
609-
connect( mColumnTypeThread, SIGNAL( progressMessage( QString ) ),
610-
this, SIGNAL( progressMessage( QString ) ) );
611-
}
612-
}
613-
614-
emit addGeometryColumn( layerProperty );
615-
}
616-
617532
QString QgsPgSourceSelect::fullDescription( QString schema, QString table, QString column, QString type )
618533
{
619534
QString full_desc = "";

0 commit comments

Comments
 (0)