Skip to content

Commit

Permalink
Use querySublayers to populate database layers in QgsOgrDbSourceSelect
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 23, 2021
1 parent de2e979 commit b34238b
Showing 1 changed file with 48 additions and 29 deletions.
77 changes: 48 additions & 29 deletions src/gui/providers/ogr/qgsogrdbsourceselect.cpp
Expand Up @@ -19,12 +19,14 @@
///@cond PRIVATE

#include "qgsogrdbconnection.h"
#include "qgsogrdataitems.h"
#include "qgsvectorlayer.h"
#include "qgsquerybuilder.h"
#include "qgssettings.h"
#include "qgsproject.h"
#include "qgsgui.h"
#include "qgsogrproviderutils.h"
#include "qgsprovidermetadata.h"
#include "qgsprovidersublayerdetails.h"

#include <QMessageBox>

Expand Down Expand Up @@ -333,48 +335,65 @@ void QgsOgrDbSourceSelect::btnConnect_clicked()

mPath = conn.path();

try
{
const QList<QgsOgrDbLayerInfo *> layers = QgsOgrLayerItem::subLayers( mPath, ogrDriverName() );
const QList< QgsProviderSublayerDetails > sublayers = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "ogr" ) )->querySublayers( mPath );

QModelIndex rootItemIndex = mTableModel.indexFromItem( mTableModel.invisibleRootItem() );
mTableModel.removeRows( 0, mTableModel.rowCount( rootItemIndex ), rootItemIndex );
QModelIndex rootItemIndex = mTableModel.indexFromItem( mTableModel.invisibleRootItem() );
mTableModel.removeRows( 0, mTableModel.rowCount( rootItemIndex ), rootItemIndex );

// populate the table list
// get the list of suitable tables and columns and populate the UI
// populate the table list
// get the list of suitable tables and columns and populate the UI

mTableModel.setPath( mPath );
mTableModel.setPath( mPath );


for ( const QgsOgrDbLayerInfo *table : layers )
for ( const QgsProviderSublayerDetails &layer : sublayers )
{
if ( cbxAllowGeometrylessTables->isChecked() || layer.wkbType() != QgsWkbTypes::NoGeometry )
{
if ( cbxAllowGeometrylessTables->isChecked() || table->geometryType() != QLatin1String( "None" ) )
Qgis::BrowserLayerType layerType = Qgis::BrowserLayerType::Vector;

switch ( QgsWkbTypes::geometryType( layer.wkbType() ) )
{
mTableModel.addTableEntry( table->layerType(), table->name(), table->uri(), table->geometryColumn(), table->geometryType(), QString() );
}
}
case QgsWkbTypes::PointGeometry:
layerType = Qgis::BrowserLayerType::Point;
break;

mTablesTreeView->sortByColumn( 0, Qt::AscendingOrder );
case QgsWkbTypes::LineGeometry:
layerType = Qgis::BrowserLayerType::Line;
break;

//expand all the toplevel items
int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
for ( int i = 0; i < numTopLevelItems; ++i )
{
mTablesTreeView->expand( mProxyModel.mapFromSource( mTableModel.indexFromItem( mTableModel.invisibleRootItem()->child( i ) ) ) );
}
mTablesTreeView->resizeColumnToContents( 0 );
mTablesTreeView->resizeColumnToContents( 1 );
case QgsWkbTypes::PolygonGeometry:
layerType = Qgis::BrowserLayerType::Polygon;
break;

cbxAllowGeometrylessTables->setEnabled( true );
case QgsWkbTypes::NullGeometry:
layerType = Qgis::BrowserLayerType::TableLayer;
break;

// Store selected connection
QgsOgrDbConnection::setSelectedConnection( subKey, ogrDriverName() );
qDeleteAll( layers );
case QgsWkbTypes::UnknownGeometry:
layerType = Qgis::BrowserLayerType::Vector;
break;
}

mTableModel.addTableEntry( layerType, layer.name(), layer.uri(), layer.geometryColumnName(), QgsWkbTypes::displayString( layer.wkbType() ), QString() );
}
}
catch ( QgsOgrLayerNotValidException &ex )

mTablesTreeView->sortByColumn( 0, Qt::AscendingOrder );

//expand all the toplevel items
int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
for ( int i = 0; i < numTopLevelItems; ++i )
{
pushMessage( tr( "Error opening layer" ), ex.what(), Qgis::MessageLevel::Critical );
mTablesTreeView->expand( mProxyModel.mapFromSource( mTableModel.indexFromItem( mTableModel.invisibleRootItem()->child( i ) ) ) );
}
mTablesTreeView->resizeColumnToContents( 0 );
mTablesTreeView->resizeColumnToContents( 1 );

cbxAllowGeometrylessTables->setEnabled( true );

// Store selected connection
QgsOgrDbConnection::setSelectedConnection( subKey, ogrDriverName() );
}


Expand Down

0 comments on commit b34238b

Please sign in to comment.