Skip to content

Commit 60b6ad9

Browse files
committed
postgres provider: support tables with mixed srids
1 parent ff3bdcd commit 60b6ad9

File tree

9 files changed

+230
-159
lines changed

9 files changed

+230
-159
lines changed

src/core/qgsdatasourceuri.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ QgsDataSourceURI::QgsDataSourceURI( QString uri )
136136
{
137137
mGeometryType = QGis::Point;
138138
}
139-
else if ( geomTypeUpper == "LINESTRING" )
139+
else if ( geomTypeUpper == "LINE" )
140140
{
141141
mGeometryType = QGis::Line;
142142
}

src/providers/postgres/qgscolumntypethread.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void QgsGeomColumnTypeThread::run()
5353
else
5454
{
5555
layerProperty.type = "";
56+
layerProperty.srid = "";
5657
}
5758

5859
// Now tell the layer list dialog box...

src/providers/postgres/qgspgsourceselect.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
7777
}
7878
}
7979

80+
if ( index.column() == QgsPgTableModel::dbtmSrid )
81+
{
82+
QLineEdit *le = new QLineEdit( parent );
83+
le->setValidator( new QIntValidator( -1, 999999, parent ) );
84+
le->insert( index.data( Qt::DisplayRole ).toString() );
85+
return le;
86+
}
87+
8088
return 0;
8189
}
8290

@@ -151,13 +159,11 @@ QgsPgSourceSelect::QgsPgSourceSelect( QWidget *parent, Qt::WFlags fl, bool manag
151159
mProxyModel.setParent( this );
152160
mProxyModel.setFilterKeyColumn( -1 );
153161
mProxyModel.setFilterCaseSensitivity( Qt::CaseInsensitive );
154-
mProxyModel.setDynamicSortFilter( true );
155162
mProxyModel.setSourceModel( &mTableModel );
163+
156164
mTablesTreeView->setModel( &mProxyModel );
157165
mTablesTreeView->setSortingEnabled( true );
158-
159166
mTablesTreeView->setEditTriggers( QAbstractItemView::CurrentChanged );
160-
161167
mTablesTreeView->setItemDelegate( new QgsPgSourceSelectDelegate( this ) );
162168

163169
QSettings settings;
@@ -366,9 +372,8 @@ void QgsPgSourceSelect::on_mSearchModeComboBox_currentIndexChanged( const QStrin
366372

367373
void QgsPgSourceSelect::setLayerType( QgsPostgresLayerProperty layerProperty )
368374
{
375+
QgsDebugMsg( "entering." );
369376
mTableModel.setGeometryTypesForTable( layerProperty );
370-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
371-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
372377
}
373378

374379
QgsPgSourceSelect::~QgsPgSourceSelect()
@@ -421,13 +426,18 @@ QString QgsPgSourceSelect::layerURI( const QModelIndex &index )
421426
// no primary key for view selected
422427
return QString::null;
423428

424-
QString schemaName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmSchema ) )->text();
425-
QString tableName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmTable ) )->text();
426-
QString geomColumnName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmGeomCol ) )->text();
429+
QString schemaName = index.sibling( index.row(), QgsPgTableModel::dbtmSchema ).data( Qt::DisplayRole ).toString();
430+
QString tableName = index.sibling( index.row(), QgsPgTableModel::dbtmTable ).data( Qt::DisplayRole ).toString();
431+
QString geomColumnName = index.sibling( index.row(), QgsPgTableModel::dbtmGeomCol ).data( Qt::DisplayRole ).toString();
432+
433+
QString srid = index.sibling( index.row(), QgsPgTableModel::dbtmSrid ).data( Qt::DisplayRole ).toString();
434+
bool ok;
435+
srid.toInt( &ok );
436+
if ( !ok )
437+
return QString::null;
427438

428-
QString srid = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmSrid ) )->text();
429439
bool selectAtId = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmSelectAtId ) )->checkState() == Qt::Checked;
430-
QString sql = mTableModel.itemFromIndex( index.sibling( index.row(), QgsPgTableModel::dbtmSql ) )->text();
440+
QString sql = index.sibling( index.row(), QgsPgTableModel::dbtmSql ).data( Qt::DisplayRole ).toString();
431441

432442
QgsDataSourceURI uri( m_connInfo );
433443
uri.setDataSource( schemaName, tableName, geomType != QGis::NoGeometry ? geomColumnName : QString::null, sql, pkColumnName );
@@ -514,17 +524,20 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
514524
foreach( QgsPostgresLayerProperty layer, layers )
515525
{
516526
QString type = layer.type;
527+
QString srid = layer.srid;
517528
if ( !searchGeometryColumnsOnly && !layer.geometryColName.isNull() )
518529
{
519-
if ( type == "GEOMETRY" || type == QString::null )
530+
if ( type == "GEOMETRY" || type.isNull() || srid.isEmpty() )
520531
{
521532
addSearchGeometryColumn( layer );
522533
type = "";
534+
srid = "";
523535
}
524536
}
525537
QgsDebugMsg( QString( "adding table %1.%2" ).arg( layer.schemaName ).arg( layer.tableName ) );
526538

527539
layer.type = type;
540+
layer.srid = srid;
528541
mTableModel.addTableEntry( layer );
529542
}
530543

@@ -538,9 +551,6 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
538551
if ( cmbConnections->count() > 0 && !mColumnTypeThread )
539552
mAddButton->setEnabled( true );
540553

541-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
542-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
543-
544554
//if we have only one schema item, expand it by default
545555
int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
546556
if ( numTopLevelItems < 2 || mTableModel.tableCount() < 20 )
@@ -555,7 +565,11 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
555565
conn->disconnect();
556566

557567
if ( !mColumnTypeThread )
568+
{
558569
QApplication::restoreOverrideCursor();
570+
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
571+
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
572+
}
559573
}
560574
else
561575
{
@@ -575,6 +589,9 @@ void QgsPgSourceSelect::columnThreadFinished()
575589

576590
if ( cmbConnections->count() > 0 )
577591
mAddButton->setEnabled( true );
592+
593+
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
594+
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
578595
}
579596

580597
QStringList QgsPgSourceSelect::selectedTables()
@@ -640,8 +657,7 @@ void QgsPgSourceSelect::addSearchGeometryColumn( QgsPostgresLayerProperty layerP
640657
emit addGeometryColumn( layerProperty );
641658
}
642659

643-
QString QgsPgSourceSelect::fullDescription( QString schema, QString table,
644-
QString column, QString type )
660+
QString QgsPgSourceSelect::fullDescription( QString schema, QString table, QString column, QString type )
645661
{
646662
QString full_desc = "";
647663
if ( !schema.isEmpty() )

src/providers/postgres/qgspgtablemodel.cpp

Lines changed: 75 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,18 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
7676
QList<QStandardItem*> childItemList;
7777

7878
QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName );
79-
schemaNameItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
79+
schemaNameItem->setFlags( Qt::ItemIsEnabled );
8080

81-
QStandardItem *typeItem = new QStandardItem( iconForGeomType( geomType ), geomType == QGis::UnknownGeometry ? tr( "Waiting..." ) : QgsPostgresConn::displayStringForGeomType( geomType ) );
81+
QStandardItem *typeItem = new QStandardItem( iconForGeomType( geomType ),
82+
geomType == QGis::UnknownGeometry
83+
? tr( "Detecting..." )
84+
: QgsPostgresConn::displayStringForGeomType( geomType ) );
8285
typeItem->setData( geomType == QGis::UnknownGeometry, Qt::UserRole + 1 );
8386
typeItem->setData( geomType, Qt::UserRole + 2 );
84-
typeItem->setFlags(( geomType != QGis::UnknownGeometry ? Qt::ItemIsEnabled : Qt::NoItemFlags ) | Qt::ItemIsSelectable | Qt::ItemIsEditable );
8587

8688
QStandardItem *tableItem = new QStandardItem( layerProperty.tableName );
87-
tableItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
88-
8989
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
90-
geomItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
91-
92-
QStandardItem *sridItem = new QStandardItem( QString::number( layerProperty.srid ) );
93-
sridItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
90+
QStandardItem *sridItem = new QStandardItem( layerProperty.srid );
9491

9592
QString pkText, pkCol = "";
9693
switch ( layerProperty.pkCols.size() )
@@ -101,17 +98,18 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
10198
}
10299

103100
QStandardItem *pkItem = new QStandardItem( pkText );
101+
if ( pkText == tr( "Select..." ) )
102+
pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable );
103+
104104
pkItem->setData( layerProperty.pkCols, Qt::UserRole + 1 );
105105
pkItem->setData( pkCol, Qt::UserRole + 2 );
106-
pkItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
107106

108107
QStandardItem *selItem = new QStandardItem( "" );
109-
selItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
108+
selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable );
110109
selItem->setCheckState( Qt::Checked );
111110
selItem->setToolTip( tr( "Disable 'Fast Access to Features at ID' capability to force keeping the attribute table in memory (e.g. in case of expensive views)." ) );
112111

113112
QStandardItem* sqlItem = new QStandardItem( layerProperty.sql );
114-
sqlItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
115113

116114
childItemList << schemaNameItem;
117115
childItemList << tableItem;
@@ -122,6 +120,14 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
122120
childItemList << selItem;
123121
childItemList << sqlItem;
124122

123+
if ( geomType == QGis::UnknownGeometry || layerProperty.srid.isEmpty() )
124+
{
125+
foreach( QStandardItem *item, childItemList )
126+
{
127+
item->setFlags( item->flags() & ~( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable ) );
128+
}
129+
}
130+
125131
schemaItem->appendRow( childItemList );
126132

127133
++mTableCount;
@@ -164,6 +170,7 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
164170
{
165171
continue;
166172
}
173+
167174
QModelIndex currentTableIndex = currentChildIndex.sibling( i, dbtmTable );
168175
if ( !currentTableIndex.isValid() )
169176
{
@@ -176,8 +183,7 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
176183
continue;
177184
}
178185

179-
if ( itemFromIndex( currentTableIndex )->text() == tableName &&
180-
itemFromIndex( currentGeomIndex )->text() == geomName )
186+
if ( itemFromIndex( currentTableIndex )->text() == tableName && itemFromIndex( currentGeomIndex )->text() == geomName )
181187
{
182188
QModelIndex sqlIndex = currentChildIndex.sibling( i, dbtmSql );
183189
if ( sqlIndex.isValid() )
@@ -192,6 +198,8 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
192198
void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerProperty )
193199
{
194200
QStringList typeList = layerProperty.type.split( ",", QString::SkipEmptyParts );
201+
QStringList sridList = layerProperty.srid.split( ",", QString::SkipEmptyParts );
202+
Q_ASSERT( typeList.size() == sridList.size() );
195203

196204
//find schema item and table item
197205
QStandardItem* schemaItem;
@@ -213,53 +221,54 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
213221
continue;
214222
}
215223

216-
QModelIndex currentTypeIndex = currentChildIndex.sibling( i, dbtmType );
217-
QModelIndex currentTableIndex = currentChildIndex.sibling( i, dbtmTable );
218-
QModelIndex currentGeomColumnIndex = currentChildIndex.sibling( i, dbtmGeomCol );
219-
QModelIndex currentPkColumnIndex = currentChildIndex.sibling( i, dbtmPkCol );
220-
QModelIndex currentSridIndex = currentChildIndex.sibling( i, dbtmSrid );
221-
222-
if ( !currentTypeIndex.isValid()
223-
|| !currentTableIndex.isValid()
224-
|| !currentGeomColumnIndex.isValid()
225-
|| !currentPkColumnIndex.isValid()
226-
|| !currentSridIndex.isValid()
227-
)
224+
QList<QStandardItem *> row;
225+
226+
for ( int j = 0; j < dbtmColumns; j++ )
228227
{
229-
continue;
228+
row << itemFromIndex( currentChildIndex.sibling( i, j ) );
230229
}
231230

232-
QString tableText = itemFromIndex( currentTableIndex )->text();
233-
QString geomColText = itemFromIndex( currentGeomColumnIndex )->text();
234-
QStandardItem *typeItem = itemFromIndex( currentTypeIndex );
235-
QStandardItem *sridItem = itemFromIndex( currentSridIndex );
236-
237-
if ( tableText == layerProperty.tableName && geomColText == layerProperty.geometryColName )
231+
if ( row[ dbtmTable ]->text() == layerProperty.tableName && row[ dbtmGeomCol ]->text() == layerProperty.geometryColName )
238232
{
239-
sridItem->setText( QString::number( layerProperty.srid ) );
233+
row[ dbtmSrid ]->setText( layerProperty.srid );
240234

241235
if ( typeList.isEmpty() )
242236
{
243-
typeItem->setText( tr( "Select..." ) );
237+
row[ dbtmType ]->setText( tr( "Select..." ) );
238+
row[ dbtmType ]->setFlags( row[ dbtmType ]->flags() | Qt::ItemIsEditable );
239+
240+
row[ dbtmSrid ]->setText( tr( "Enter..." ) );
241+
row[ dbtmSrid ]->setFlags( row[ dbtmSrid ]->flags() | Qt::ItemIsEditable );
242+
243+
foreach( QStandardItem *item, row )
244+
{
245+
item->setFlags( item->flags() | Qt::ItemIsEnabled );
246+
}
244247
}
245248
else
246249
{
247250
// update existing row
248251
QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( typeList.at( 0 ) );
249252

250-
typeItem->setIcon( iconForGeomType( geomType ) );
251-
typeItem->setText( QgsPostgresConn::displayStringForGeomType( geomType ) );
252-
typeItem->setData( false, Qt::UserRole + 1 );
253-
typeItem->setData( geomType, Qt::UserRole + 2 );
253+
row[ dbtmType ]->setIcon( iconForGeomType( geomType ) );
254+
row[ dbtmType ]->setText( QgsPostgresConn::displayStringForGeomType( geomType ) );
255+
row[ dbtmType ]->setData( false, Qt::UserRole + 1 );
256+
row[ dbtmType ]->setData( geomType, Qt::UserRole + 2 );
257+
258+
row[ dbtmSrid ]->setText( sridList.at( 0 ) );
259+
260+
foreach( QStandardItem *item, row )
261+
{
262+
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
263+
}
254264

255265
for ( int j = 1; j < typeList.size(); j++ )
256266
{
257267
layerProperty.type = typeList[j];
268+
layerProperty.srid = sridList[j];
258269
addTableEntry( layerProperty );
259270
}
260271
}
261-
262-
typeItem->setFlags( typeItem->flags() | Qt::ItemIsEnabled );
263272
}
264273
}
265274
}
@@ -280,3 +289,28 @@ QIcon QgsPgTableModel::iconForGeomType( QGis::GeometryType type )
280289
return QIcon( QgsDataItem::getThemePixmap( "/mIconLayer.png" ) );
281290
}
282291
}
292+
293+
bool QgsPgTableModel::setData( const QModelIndex &idx, const QVariant &value, int role )
294+
{
295+
if ( !QStandardItemModel::setData( idx, value, role ) )
296+
return false;
297+
298+
if ( idx.column() == dbtmType || idx.column() == dbtmSrid )
299+
{
300+
bool ok;
301+
idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
302+
303+
ok &= idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt() != QGis::UnknownGeometry;
304+
305+
for ( int i = 0; i < dbtmColumns; i++ )
306+
{
307+
QStandardItem *item = itemFromIndex( idx.sibling( idx.row(), i ) );
308+
if ( ok )
309+
item->setFlags( item->flags() | Qt::ItemIsSelectable );
310+
else
311+
item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
312+
}
313+
}
314+
315+
return true;
316+
}

src/providers/postgres/qgspgtablemodel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class QgsPgTableModel : public QStandardItemModel
5858
dbtmColumns
5959
};
6060

61+
bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole );
62+
63+
6164
static QIcon iconForGeomType( QGis::GeometryType type );
6265

6366
private:

0 commit comments

Comments
 (0)