Skip to content

Commit fe05619

Browse files
committedFeb 5, 2014
postgres provider: fix saving of multigeometries to tables without geometry_columns entry
1 parent 9295e6e commit fe05619

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed
 

‎src/providers/postgres/qgspostgresconn.cpp

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ bool QgsPostgresConn::getTableInfo( bool searchGeometryColumnsOnly, bool searchP
324324

325325
mLayersSupported.clear();
326326

327-
for ( int i = 0; i < (hasTopology() ? 3 : 2); i++ )
327+
for ( int i = 0; i < ( hasTopology() ? 3 : 2 ); i++ )
328328
{
329329
QString sql, tableName, schemaName, columnName, typeName, sridName, gtableName;
330330
QgsPostgresGeometryColumnType columnType = sctGeometry;
@@ -727,7 +727,7 @@ QString QgsPostgresConn::postgisVersion()
727727
if ( mPostgisVersionMajor > 1 )
728728
{
729729
QgsPostgresResult result = PQexec( "SELECT EXISTS ( SELECT c.oid FROM pg_class AS c JOIN pg_namespace AS n ON c.relnamespace=n.oid WHERE n.nspname='topology' AND c.relname='topology' )" );
730-
if ( result.PQntuples() >= 1 && result.PQgetvalue(0, 0) == "t" )
730+
if ( result.PQntuples() >= 1 && result.PQgetvalue( 0, 0 ) == "t" )
731731
{
732732
mTopologyAvailable = true;
733733
}
@@ -1137,14 +1137,9 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
11371137
QGis::WkbType type = layerProperty.types.value( 0, QGis::WKBUnknown );
11381138
if ( type == QGis::WKBUnknown )
11391139
{
1140-
query += QString( "CASE"
1141-
" WHEN %1 THEN 'POINT'"
1142-
" WHEN %2 THEN 'LINESTRING'"
1143-
" WHEN %3 THEN 'POLYGON'"
1144-
" END" )
1145-
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPoint, layerProperty.geometryColType == sctGeography ) )
1146-
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBLineString, layerProperty.geometryColType == sctGeography ) )
1147-
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPolygon, layerProperty.geometryColType == sctGeography ) );
1140+
query += QString( "upper(geometrytype(%1%2))" )
1141+
.arg( quotedIdentifier( layerProperty.geometryColName ) )
1142+
.arg( layerProperty.geometryColType == sctGeography ? "::geometry" : "" );
11481143
}
11491144
else
11501145
{
@@ -1181,7 +1176,30 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
11811176
if ( type.isEmpty() )
11821177
continue;
11831178

1184-
layerProperty.types << QgsPostgresConn::wkbTypeFromPostgis( type );
1179+
// if both multi and single types exists, go for the multi type,
1180+
// so that st_multi can be applied if necessary.
1181+
QGis::WkbType wkbType0 = QGis::flatType( QgsPostgresConn::wkbTypeFromPostgis( type ) );
1182+
QGis::WkbType multiType0 = QGis::multiType( wkbType0 );
1183+
1184+
int j;
1185+
for ( j = 0; j < layerProperty.size(); j++ )
1186+
{
1187+
if ( layerProperty.srids[j] != srid.toInt() )
1188+
continue;
1189+
1190+
QGis::WkbType wkbType1 = layerProperty.types[j];
1191+
QGis::WkbType multiType1 = QGis::multiType( wkbType1 );
1192+
if ( multiType0 == multiType1 && wkbType0 != wkbType1 )
1193+
{
1194+
layerProperty.types[j] = multiType0;
1195+
break;
1196+
}
1197+
}
1198+
1199+
if ( j < layerProperty.size() )
1200+
break;
1201+
1202+
layerProperty.types << wkbType0;
11851203
layerProperty.srids << srid.toInt();
11861204
}
11871205
}
@@ -1271,7 +1289,7 @@ QString QgsPostgresConn::postgisTypeFilter( QString geomCol, QGis::WkbType geomT
12711289
case QGis::WKBPolygon25D:
12721290
case QGis::WKBMultiPolygon:
12731291
case QGis::WKBMultiPolygon25D:
1274-
return QString( "upper(geometrytype(%1)) IN ('POLYGON','MULTIPOLYGON','POLYGONM','MULTIPOLYGONM', 'POLYHEDRALSURFACE', 'TIN')" ).arg( geomCol );
1292+
return QString( "upper(geometrytype(%1)) IN ('POLYGON','MULTIPOLYGON','POLYGONM','MULTIPOLYGONM','POLYHEDRALSURFACE','TIN')" ).arg( geomCol );
12751293
case QGis::WKBNoGeometry:
12761294
return QString( "geometrytype(%1) IS NULL" ).arg( geomCol );
12771295
case QGis::WKBUnknown:

0 commit comments

Comments
 (0)
Please sign in to comment.