Skip to content

Instantly share code, notes, and snippets.

@jef-n
Created January 19, 2012 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jef-n/1642427 to your computer and use it in GitHub Desktop.
Save jef-n/1642427 to your computer and use it in GitHub Desktop.
From b3101d96bca779e9809a089ae7a890d44c667be0 Mon Sep 17 00:00:00 2001
From: "Juergen E. Fischer" <jef@norbit.de>
Date: Thu, 19 Jan 2012 21:35:28 +0100
Subject: [PATCH] postgres provider: support tables with mixed srids
---
src/providers/postgres/qgspgtablemodel.cpp | 9 +++++++--
src/providers/postgres/qgspostgresconn.cpp | 13 +++++++++----
src/providers/postgres/qgspostgresconn.h | 2 +-
src/providers/postgres/qgspostgresdataitems.cpp | 14 ++++++++++----
src/providers/postgres/qgspostgresprovider.cpp | 4 ++--
5 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/src/providers/postgres/qgspgtablemodel.cpp b/src/providers/postgres/qgspgtablemodel.cpp
index b9b94d0..3d1c85d 100644
--- a/src/providers/postgres/qgspgtablemodel.cpp
+++ b/src/providers/postgres/qgspgtablemodel.cpp
@@ -89,7 +89,7 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
geomItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
- QStandardItem *sridItem = new QStandardItem( QString::number( layerProperty.srid ) );
+ QStandardItem *sridItem = new QStandardItem( layerProperty.srid );
sridItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
QString pkText, pkCol = "";
@@ -192,6 +192,8 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerProperty )
{
QStringList typeList = layerProperty.type.split( ",", QString::SkipEmptyParts );
+ QStringList sridList = layerProperty.srid.split( ",", QString::SkipEmptyParts );
+ Q_ASSERT( typeList.size() == sridList.size() );
//find schema item and table item
QStandardItem* schemaItem;
@@ -236,7 +238,7 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
if ( tableText == layerProperty.tableName && geomColText == layerProperty.geometryColName )
{
- sridItem->setText( QString::number( layerProperty.srid ) );
+ sridItem->setText( layerProperty.srid );
if ( typeList.isEmpty() )
{
@@ -252,9 +254,12 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
typeItem->setData( false, Qt::UserRole + 1 );
typeItem->setData( geomType, Qt::UserRole + 2 );
+ sridItem->setText( sridList.at( 0 ) );
+
for ( int j = 1; j < typeList.size(); j++ )
{
layerProperty.type = typeList[j];
+ layerProperty.srid = sridList[j];
addTableEntry( layerProperty );
}
}
diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp
index 6d60359..8d24099 100644
--- a/src/providers/postgres/qgspostgresconn.cpp
+++ b/src/providers/postgres/qgspostgresconn.cpp
@@ -1059,20 +1059,25 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
QgsPostgresResult gresult = PQexec( query );
QString type;
- int srid = -1;
+ QString srid;
if ( gresult.PQresultStatus() == PGRES_TUPLES_OK )
{
QStringList types;
+ QStringList srids;
for ( int i = 0; i < gresult.PQntuples(); i++ )
{
QString type = gresult.PQgetvalue( i, 0 );
- if ( !type.isEmpty() )
- types << type;
- srid = gresult.PQgetvalue( i, 1 ).toInt();
+ QString srid = gresult.PQgetvalue( i, 1 );
+ if ( type.isEmpty() )
+ continue;
+
+ types << type;
+ srids << srid;
}
type = types.join( "," );
+ srid = srids.join( "," );
}
QgsDebugMsg( QString( "type:%1 srid:%2" ).arg( type ).arg( srid ) );
diff --git a/src/providers/postgres/qgspostgresconn.h b/src/providers/postgres/qgspostgresconn.h
index 7be81bc..51dda77 100644
--- a/src/providers/postgres/qgspostgresconn.h
+++ b/src/providers/postgres/qgspostgresconn.h
@@ -43,7 +43,7 @@ struct QgsPostgresLayerProperty
QString tableName;
QString geometryColName;
QStringList pkCols;
- int srid;
+ QString srid;
bool isGeography;
QString sql;
};
diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp
index de8d2c9..9c4e22f 100644
--- a/src/providers/postgres/qgspostgresdataitems.cpp
+++ b/src/providers/postgres/qgspostgresdataitems.cpp
@@ -86,15 +86,21 @@ void QgsPGConnectionItem::setLayerType( QgsPostgresLayerProperty layerProperty )
return;
}
- foreach( QString type, layerProperty.type.split( ",", QString::SkipEmptyParts ) )
+ QStringList typeList = layerProperty.type.split( ",", QString::SkipEmptyParts );
+ QStringList sridList = layerProperty.srid.split( ",", QString::SkipEmptyParts );
+ Q_ASSERT( typeList.size() == sridList.size() );
+
+ for ( int i = 0 ; i < typeList.size(); i++ )
{
- QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( type );
+ QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( typeList[i] );
if ( geomType == QGis::UnknownGeometry )
{
- QgsDebugMsg( QString( "unsupported geometry type:%1" ).arg( type ) );
+ QgsDebugMsg( QString( "unsupported geometry type:%1" ).arg( typeList[i] ) );
continue;
}
+ layerProperty.type = typeList[i];
+ layerProperty.srid = sridList[i];
schemaItem->addLayer( layerProperty );
}
}
@@ -171,7 +177,7 @@ QString QgsPGLayerItem::createUri()
QgsDataSourceURI uri( connItem->connection()->connInfo() );
uri.setDataSource( mLayerProperty.schemaName, mLayerProperty.tableName, mLayerProperty.geometryColName, mLayerProperty.sql, pkColName );
- uri.setSrid( QString::number( mLayerProperty.srid ) );
+ uri.setSrid( mLayerProperty.srid );
uri.setGeometryType( QgsPostgresConn::geomTypeFromPostgis( mLayerProperty.type ) );
QgsDebugMsg( QString( "layer uri: %1" ).arg( uri.uri() ) );
return uri.uri();
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index ade032c..3f1089d 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -2709,9 +2709,9 @@ bool QgsPostgresProvider::getGeometryDetails()
mConnectionRO->retrieveLayerTypes( layerProperty, mUseEstimatedMetadata );
- if ( srid.isEmpty() )
+ if ( !srid.isEmpty() && !srid.contains( "," ) )
{
- srid = QString::number( layerProperty.srid );
+ srid = layerProperty.srid;
}
if ( !type.isEmpty() && !type.contains( "," ) )
--
1.7.8.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment