151 changes: 107 additions & 44 deletions src/providers/mssql/qgsmssqltablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,25 +68,25 @@ void QgsMssqlTableModel::addTableEntry( QgsMssqlLayerProperty layerProperty )
invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem );
}

QGis::GeometryType geomType = QgsMssqlTableModel::geomTypeFromMssql( layerProperty.type );
if ( geomType == QGis::UnknownGeometry && layerProperty.geometryColName.isEmpty() )
QGis::WkbType wkbType = QgsMssqlTableModel::wkbTypeFromMssql( layerProperty.type );
if ( wkbType == QGis::WKBUnknown && layerProperty.geometryColName.isEmpty() )
{
geomType = QGis::NoGeometry;
wkbType = QGis::WKBNoGeometry;
}

bool needToDetect = geomType == QGis::UnknownGeometry && layerProperty.type != "GEOMETRYCOLLECTION";
bool needToDetect = wkbType == QGis::WKBUnknown && layerProperty.type != "GEOMETRYCOLLECTION";

QList<QStandardItem*> childItemList;

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

QStandardItem *typeItem = new QStandardItem( iconForGeomType( geomType ),
QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ),
needToDetect
? tr( "Detecting..." )
: QgsMssqlTableModel::displayStringForGeomType( geomType ) );
: QgsMssqlTableModel::displayStringForWkbType( wkbType ) );
typeItem->setData( needToDetect, Qt::UserRole + 1 );
typeItem->setData( geomType, Qt::UserRole + 2 );
typeItem->setData( wkbType, Qt::UserRole + 2 );

QStandardItem *tableItem = new QStandardItem( layerProperty.tableName );
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
Expand Down Expand Up @@ -125,7 +125,7 @@ void QgsMssqlTableModel::addTableEntry( QgsMssqlLayerProperty layerProperty )
childItemList << sqlItem;

bool detailsFromThread = needToDetect ||
( geomType != QGis::NoGeometry && layerProperty.srid.isEmpty() );
( wkbType != QGis::WKBNoGeometry && layerProperty.srid.isEmpty() );

if ( detailsFromThread || pkText == tr( "Select..." ) )
{
Expand Down Expand Up @@ -259,12 +259,12 @@ void QgsMssqlTableModel::setGeometryTypesForTable( QgsMssqlLayerProperty layerPr
else
{
// update existing row
QGis::GeometryType geomType = QgsMssqlTableModel::geomTypeFromMssql( typeList.at( 0 ) );
QGis::WkbType wkbType = QgsMssqlTableModel::wkbTypeFromMssql( typeList.at( 0 ) );

row[ dbtmType ]->setIcon( iconForGeomType( geomType ) );
row[ dbtmType ]->setText( QgsMssqlTableModel::displayStringForGeomType( geomType ) );
row[ dbtmType ]->setIcon( iconForWkbType( wkbType ) );
row[ dbtmType ]->setText( QgsMssqlTableModel::displayStringForWkbType( wkbType ) );
row[ dbtmType ]->setData( false, Qt::UserRole + 1 );
row[ dbtmType ]->setData( geomType, Qt::UserRole + 2 );
row[ dbtmType ]->setData( wkbType, Qt::UserRole + 2 );

row[ dbtmSrid ]->setText( sridList.at( 0 ) );

Expand All @@ -288,19 +288,28 @@ void QgsMssqlTableModel::setGeometryTypesForTable( QgsMssqlLayerProperty layerPr
}
}

QIcon QgsMssqlTableModel::iconForGeomType( QGis::GeometryType type )
QIcon QgsMssqlTableModel::iconForWkbType( QGis::WkbType type )
{
switch ( type )
{
case QGis::Point:
case QGis::WKBPoint:
case QGis::WKBPoint25D:
case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconPointLayer.png" ) );
case QGis::Line:
case QGis::WKBLineString:
case QGis::WKBLineString25D:
case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconLineLayer.png" ) );
case QGis::Polygon:
case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconPolygonLayer.png" ) );
case QGis::NoGeometry:
case QGis::WKBNoGeometry:
return QIcon( QgsDataItem::getThemePixmap( "/mIconTableLayer.png" ) );
default:
case QGis::WKBUnknown:
return QIcon( QgsDataItem::getThemePixmap( "/mIconLayer.png" ) );
}
}
Expand All @@ -316,11 +325,11 @@ bool QgsMssqlTableModel::setData( const QModelIndex &idx, const QVariant &value,

bool ok = geomType != QGis::UnknownGeometry;

if ( geomType != QGis::NoGeometry )
if ( ok && geomType != QGis::NoGeometry )
idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );

QStringList pkCols = idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toStringList();
if ( pkCols.size() > 0 )
if ( ok && pkCols.size() > 0 )
ok = pkCols.contains( idx.sibling( idx.row(), dbtmPkCol ).data().toString() );

for ( int i = 0; i < dbtmColumns; i++ )
Expand All @@ -341,8 +350,8 @@ QString QgsMssqlTableModel::layerURI( const QModelIndex &index, QString connInfo
if ( !index.isValid() )
return QString::null;

QGis::GeometryType geomType = ( QGis::GeometryType ) itemFromIndex( index.sibling( index.row(), dbtmType ) )->data( Qt::UserRole + 2 ).toInt();
if ( geomType == QGis::UnknownGeometry )
QGis::WkbType wkbType = ( QGis::WkbType ) itemFromIndex( index.sibling( index.row(), dbtmType ) )->data( Qt::UserRole + 2 ).toInt();
if ( wkbType == QGis::WKBUnknown )
// no geometry type selected
return QString::null;

Expand All @@ -359,7 +368,7 @@ QString QgsMssqlTableModel::layerURI( const QModelIndex &index, QString connInfo

QString geomColumnName;
QString srid;
if ( geomType != QGis::NoGeometry )
if ( wkbType != QGis::WKBNoGeometry )
{
geomColumnName = index.sibling( index.row(), dbtmGeomCol ).data( Qt::DisplayRole ).toString();

Expand All @@ -376,56 +385,110 @@ QString QgsMssqlTableModel::layerURI( const QModelIndex &index, QString connInfo
QgsDataSourceURI uri( connInfo );
uri.setDataSource( schemaName, tableName, geomColumnName, sql, pkColumnName );
uri.setUseEstimatedMetadata( useEstimatedMetadata );
uri.setGeometryType( geomType );
uri.setWkbType( wkbType );
uri.setSrid( srid );
uri.disableSelectAtId( !selectAtId );

return uri.uri();
}

QGis::GeometryType QgsMssqlTableModel::geomTypeFromMssql( QString dbType )
QGis::WkbType QgsMssqlTableModel::wkbTypeFromMssql( QString type )
{
dbType = dbType.toUpper();
type = type.toUpper();

if ( dbType == "POINT" || dbType == "MULTIPOINT" || dbType == "POINTM" || dbType == "MULTIPOINTM" )
if ( type == "POINT" )
{
return QGis::Point;
return QGis::WKBPoint;
}
else if ( dbType == "LINESTRING" || dbType == "MULTILINESTRING" || dbType == "LINESTRINGM" || dbType == "MULTILINESTRINGM" )
else if ( type == "POINTM" )
{
return QGis::Line;
return QGis::WKBPoint25D;
}
else if ( dbType == "POLYGON" || dbType == "MULTIPOLYGON" || dbType == "POLYGONM" || dbType == "MULTIPOLYGONM" )
else if ( type == "MULTIPOINT" )
{
return QGis::Polygon;
return QGis::WKBMultiPoint;
}
else if ( dbType == "NONE" )
else if ( type == "MULTIPOINTM" )
{
return QGis::NoGeometry;
return QGis::WKBMultiPoint25D;
}
else if ( type == "LINESTRING" )
{
return QGis::WKBLineString;
}
else if ( type == "LINESTRINGM" )
{
return QGis::WKBLineString25D;
}
else if ( type == "MULTILINESTRING" )
{
return QGis::WKBMultiLineString;
}
else if ( type == "MULTILINESTRINGM" )
{
return QGis::WKBMultiLineString25D;
}
else if ( type == "POLYGON" )
{
return QGis::WKBPolygon;
}
else if ( type == "POLYGONM" )
{
return QGis::WKBPolygon25D;
}
else if ( type == "MULTIPOLYGON" )
{
return QGis::WKBMultiPolygon;
}
else if ( type == "MULTIPOLYGONM" )
{
return QGis::WKBMultiPolygon25D;
}
else if ( type == "NONE" )
{
return QGis::WKBNoGeometry;
}
else
{
return QGis::UnknownGeometry;
return QGis::WKBUnknown;
}
}

QString QgsMssqlTableModel::displayStringForGeomType( QGis::GeometryType type )
QString QgsMssqlTableModel::displayStringForWkbType( QGis::WkbType type )
{
switch ( type )
{
case QGis::Point:
case QGis::WKBPoint:
case QGis::WKBPoint25D:
return tr( "Point" );
case QGis::Line:

case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
return tr( "Multipoint" );

case QGis::WKBLineString:
case QGis::WKBLineString25D:
return tr( "Line" );
case QGis::Polygon:

case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
return tr( "Multiline" );

case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
return tr( "Polygon" );
case QGis::NoGeometry:

case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
return tr( "Multipolygon" );

case QGis::WKBNoGeometry:
return tr( "No Geometry" );
case QGis::UnknownGeometry:
return tr( "Unknown" );

case QGis::WKBUnknown:
return tr( "Unknown Geometry" );
}

Q_ASSERT( !"unexpected geometryType" );
Q_ASSERT( !"unexpected wkbType" );
return QString::null;
}

6 changes: 3 additions & 3 deletions src/providers/mssql/qgsmssqltablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ class QgsMssqlTableModel : public QStandardItemModel

QString layerURI( const QModelIndex &index, QString connInfo, bool useEstimatedMetadata );

static QIcon iconForGeomType( QGis::GeometryType type );
static QIcon iconForWkbType( QGis::WkbType type );

static QGis::GeometryType geomTypeFromMssql( QString dbType );
static QGis::WkbType wkbTypeFromMssql( QString dbType );

static QString displayStringForGeomType( QGis::GeometryType type );
static QString displayStringForWkbType( QGis::WkbType type );

private:
/**Number of tables in the model*/
Expand Down
23 changes: 13 additions & 10 deletions src/providers/postgres/qgspgsourceselect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,17 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
if ( index.column() == QgsPgTableModel::dbtmType && index.data( Qt::UserRole + 1 ).toBool() )
{
QComboBox *cb = new QComboBox( parent );
foreach( QGis::GeometryType type,
QList<QGis::GeometryType>()
<< QGis::Point
<< QGis::Line
<< QGis::Polygon
<< QGis::NoGeometry )
foreach( QGis::WkbType type,
QList<QGis::WkbType>()
<< QGis::WKBPoint
<< QGis::WKBLineString
<< QGis::WKBPolygon
<< QGis::WKBMultiPoint
<< QGis::WKBMultiLineString
<< QGis::WKBMultiPolygon
<< QGis::WKBNoGeometry )
{
cb->addItem( QgsPgTableModel::iconForGeomType( type ), QgsPostgresConn::displayStringForGeomType( type ), type );
cb->addItem( QgsPgTableModel::iconForWkbType( type ), QgsPostgresConn::displayStringForWkbType( type ), type );
}
cb->setCurrentIndex( cb->findData( index.data( Qt::UserRole + 2 ).toInt() ) );
return cb;
Expand Down Expand Up @@ -95,10 +98,10 @@ void QgsPgSourceSelectDelegate::setModelData( QWidget *editor, QAbstractItemMode
{
if ( index.column() == QgsPgTableModel::dbtmType )
{
QGis::GeometryType type = ( QGis::GeometryType ) cb->itemData( cb->currentIndex() ).toInt();
QGis::WkbType type = ( QGis::WkbType ) cb->itemData( cb->currentIndex() ).toInt();

model->setData( index, QgsPgTableModel::iconForGeomType( type ), Qt::DecorationRole );
model->setData( index, type != QGis::UnknownGeometry ? QgsPostgresConn::displayStringForGeomType( type ) : tr( "Select..." ) );
model->setData( index, QgsPgTableModel::iconForWkbType( type ), Qt::DecorationRole );
model->setData( index, type != QGis::WKBUnknown ? QgsPostgresConn::displayStringForWkbType( type ) : tr( "Select..." ) );
model->setData( index, type, Qt::UserRole + 2 );
}
else if ( index.column() == QgsPgTableModel::dbtmPkCol )
Expand Down
57 changes: 33 additions & 24 deletions src/providers/postgres/qgspgtablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,23 +67,23 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem );
}

QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( layerProperty.type );
if ( geomType == QGis::UnknownGeometry && layerProperty.geometryColName.isEmpty() )
QGis::WkbType wkbType = QgsPostgresConn::wkbTypeFromPostgis( layerProperty.type );
if ( wkbType == QGis::WKBUnknown && layerProperty.geometryColName.isEmpty() )
{
geomType = QGis::NoGeometry;
wkbType = QGis::WKBNoGeometry;
}

QList<QStandardItem*> childItemList;

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

QStandardItem *typeItem = new QStandardItem( iconForGeomType( geomType ),
geomType == QGis::UnknownGeometry
QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ),
wkbType == QGis::WKBUnknown
? tr( "Detecting..." )
: QgsPostgresConn::displayStringForGeomType( geomType ) );
typeItem->setData( geomType == QGis::UnknownGeometry, Qt::UserRole + 1 );
typeItem->setData( geomType, Qt::UserRole + 2 );
: QgsPostgresConn::displayStringForWkbType( wkbType ) );
typeItem->setData( wkbType == QGis::WKBUnknown, Qt::UserRole + 1 );
typeItem->setData( wkbType, Qt::UserRole + 2 );

QStandardItem *tableItem = new QStandardItem( layerProperty.tableName );
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
Expand Down Expand Up @@ -125,8 +125,8 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
childItemList << selItem;
childItemList << sqlItem;

bool detailsFromThread = geomType == QGis::UnknownGeometry ||
( geomType != QGis::NoGeometry && layerProperty.srid.isEmpty() );
bool detailsFromThread = wkbType == QGis::WKBUnknown ||
( wkbType != QGis::WKBNoGeometry && layerProperty.srid.isEmpty() );

if ( detailsFromThread || pkText == tr( "Select..." ) )
{
Expand Down Expand Up @@ -260,12 +260,12 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
else
{
// update existing row
QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( typeList.at( 0 ) );
QGis::WkbType wkbType = QgsPostgresConn::wkbTypeFromPostgis( typeList.at( 0 ) );

row[ dbtmType ]->setIcon( iconForGeomType( geomType ) );
row[ dbtmType ]->setText( QgsPostgresConn::displayStringForGeomType( geomType ) );
row[ dbtmType ]->setIcon( iconForWkbType( wkbType ) );
row[ dbtmType ]->setText( QgsPostgresConn::displayStringForWkbType( wkbType ) );
row[ dbtmType ]->setData( false, Qt::UserRole + 1 );
row[ dbtmType ]->setData( geomType, Qt::UserRole + 2 );
row[ dbtmType ]->setData( wkbType, Qt::UserRole + 2 );

row[ dbtmSrid ]->setText( sridList.at( 0 ) );

Expand All @@ -289,19 +289,28 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
}
}

QIcon QgsPgTableModel::iconForGeomType( QGis::GeometryType type )
QIcon QgsPgTableModel::iconForWkbType( QGis::WkbType type )
{
switch ( type )
{
case QGis::Point:
case QGis::WKBPoint:
case QGis::WKBPoint25D:
case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconPointLayer.png" ) );
case QGis::Line:
case QGis::WKBLineString:
case QGis::WKBLineString25D:
case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconLineLayer.png" ) );
case QGis::Polygon:
case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
return QIcon( QgsDataItem::getThemePixmap( "/mIconPolygonLayer.png" ) );
case QGis::NoGeometry:
case QGis::WKBNoGeometry:
return QIcon( QgsDataItem::getThemePixmap( "/mIconTableLayer.png" ) );
default:
case QGis::WKBUnknown:
return QIcon( QgsDataItem::getThemePixmap( "/mIconLayer.png" ) );
}
}
Expand Down Expand Up @@ -342,8 +351,8 @@ QString QgsPgTableModel::layerURI( const QModelIndex &index, QString connInfo, b
if ( !index.isValid() )
return QString::null;

QGis::GeometryType geomType = ( QGis::GeometryType ) itemFromIndex( index.sibling( index.row(), dbtmType ) )->data( Qt::UserRole + 2 ).toInt();
if ( geomType == QGis::UnknownGeometry )
QGis::WkbType wkbType = ( QGis::WkbType ) itemFromIndex( index.sibling( index.row(), dbtmType ) )->data( Qt::UserRole + 2 ).toInt();
if ( wkbType == QGis::WKBUnknown )
// no geometry type selected
return QString::null;

Expand All @@ -360,7 +369,7 @@ QString QgsPgTableModel::layerURI( const QModelIndex &index, QString connInfo, b

QString geomColumnName;
QString srid;
if ( geomType != QGis::NoGeometry )
if ( wkbType != QGis::WKBNoGeometry )
{
geomColumnName = index.sibling( index.row(), dbtmGeomCol ).data( Qt::DisplayRole ).toString();

Expand All @@ -377,7 +386,7 @@ QString QgsPgTableModel::layerURI( const QModelIndex &index, QString connInfo, b
QgsDataSourceURI uri( connInfo );
uri.setDataSource( schemaName, tableName, geomColumnName, sql, pkColumnName );
uri.setUseEstimatedMetadata( useEstimatedMetadata );
uri.setGeometryType( geomType );
uri.setWkbType( wkbType );
uri.setSrid( srid );
uri.disableSelectAtId( !selectAtId );

Expand Down
2 changes: 1 addition & 1 deletion src/providers/postgres/qgspgtablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class QgsPgTableModel : public QStandardItemModel

QString layerURI( const QModelIndex &index, QString connInfo, bool useEstimatedMetadata );

static QIcon iconForGeomType( QGis::GeometryType type );
static QIcon iconForWkbType( QGis::WkbType type );

private:
/**Number of tables in the model*/
Expand Down
105 changes: 48 additions & 57 deletions src/providers/postgres/qgspostgresconn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1053,9 +1053,9 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
" END,"
" %4(%5)"
" FROM %6" )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::Point, layerProperty.isGeography ) )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::Line, layerProperty.isGeography ) )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::Polygon, layerProperty.isGeography ) )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPoint, layerProperty.isGeography ) )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBLineString, layerProperty.isGeography ) )
.arg( postgisTypeFilter( layerProperty.geometryColName, QGis::WKBPolygon, layerProperty.isGeography ) )
.arg( majorVersion() < 2 ? "srid" : "st_srid" )
.arg( quotedIdentifier( layerProperty.geometryColName, layerProperty.isGeography ) )
.arg( table );
Expand Down Expand Up @@ -1152,21 +1152,30 @@ QString QgsPostgresConn::postgisWkbTypeName( QGis::WkbType wkbType )
return geometryType;
}

QString QgsPostgresConn::postgisTypeFilter( QString geomCol, QGis::GeometryType geomType, bool isGeography )
QString QgsPostgresConn::postgisTypeFilter( QString geomCol, QGis::WkbType geomType, bool isGeography )
{
geomCol = quotedIdentifier( geomCol, isGeography );

switch ( geomType )
{
case QGis::Point:
case QGis::WKBPoint:
case QGis::WKBPoint25D:
case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
return QString( "upper(geometrytype(%1)) IN ('POINT','MULTIPOINT','POINTM','MULTIPOINTM')" ).arg( geomCol );
case QGis::Line:
case QGis::WKBLineString:
case QGis::WKBLineString25D:
case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
return QString( "upper(geometrytype(%1)) IN ('LINESTRING','MULTILINESTRING','LINESTRINGM','MULTILINESTRINGM')" ).arg( geomCol );
case QGis::Polygon:
case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
return QString( "upper(geometrytype(%1)) IN ('POLYGON','MULTIPOLYGON','POLYGONM','MULTIPOLYGONM')" ).arg( geomCol );
case QGis::NoGeometry:
case QGis::WKBNoGeometry:
return QString( "geometrytype(%1) IS NULL" ).arg( geomCol );
case QGis::UnknownGeometry:
case QGis::WKBUnknown:
Q_ASSERT( !"unknown geometry unexpected" );
return QString::null;
}
Expand All @@ -1187,54 +1196,58 @@ int QgsPostgresConn::postgisWkbTypeDim( QGis::WkbType wkbType )

QGis::WkbType QgsPostgresConn::wkbTypeFromPostgis( QString type )
{
if ( type == "POINT" || type == "POINTM" )
if ( type == "POINT" )
{
return QGis::WKBPoint;
}
else if ( type == "MULTIPOINT" || type == "MULTIPOINTM" )
else if ( type == "POINTM" )
{
return QGis::WKBPoint25D;
}
else if ( type == "MULTIPOINT" )
{
return QGis::WKBMultiPoint;
}
else if ( type == "LINESTRING" || type == "LINESTRINGM" )
else if ( type == "MULTIPOINTM" )
{
return QGis::WKBMultiPoint25D;
}
else if ( type == "LINESTRING" )
{
return QGis::WKBLineString;
}
else if ( type == "MULTILINESTRING" || type == "MULTILINESTRINGM" )
else if ( type == "LINESTRINGM" )
{
return QGis::WKBLineString25D;
}
else if ( type == "MULTILINESTRING" )
{
return QGis::WKBMultiLineString;
}
else if ( type == "POLYGON" || type == "POLYGONM" )
else if ( type == "MULTILINESTRINGM" )
{
return QGis::WKBMultiLineString25D;
}
else if ( type == "POLYGON" )
{
return QGis::WKBPolygon;
}
else if ( type == "MULTIPOLYGON" || type == "MULTIPOLYGONM" )
else if ( type == "POLYGONM" )
{
return QGis::WKBPolygon25D;
}
else if ( type == "MULTIPOLYGON" )
{
return QGis::WKBMultiPolygon;
}
else
else if ( type == "MULTIPOLYGONM" )
{
return QGis::WKBUnknown;
return QGis::WKBMultiPolygon25D;
}
}

QString QgsPostgresConn::displayStringForGeomType( QGis::GeometryType type )
{
switch ( type )
else
{
case QGis::Point:
return tr( "Point" );
case QGis::Line:
return tr( "Line" );
case QGis::Polygon:
return tr( "Polygon" );
case QGis::NoGeometry:
return tr( "No Geometry" );
case QGis::UnknownGeometry:
return tr( "Unknown" );
return QGis::WKBUnknown;
}

Q_ASSERT( !"unexpected geometryType" );
return QString::null;
}

QString QgsPostgresConn::displayStringForWkbType( QGis::WkbType type )
Expand Down Expand Up @@ -1276,28 +1289,6 @@ QString QgsPostgresConn::displayStringForWkbType( QGis::WkbType type )
return QString::null;
}

QGis::GeometryType QgsPostgresConn::geomTypeFromPostgis( QString dbType )
{
dbType = dbType.toUpper();

if ( dbType == "POINT" || dbType == "MULTIPOINT" || dbType == "POINTM" || dbType == "MULTIPOINTM" )
{
return QGis::Point;
}
else if ( dbType == "LINESTRING" || dbType == "MULTILINESTRING" || dbType == "LINESTRINGM" || dbType == "MULTILINESTRINGM" )
{
return QGis::Line;
}
else if ( dbType == "POLYGON" || dbType == "MULTIPOLYGON" || dbType == "POLYGONM" || dbType == "MULTIPOLYGONM" )
{
return QGis::Polygon;
}
else
{
return QGis::UnknownGeometry;
}
}

QGis::WkbType QgsPostgresConn::wkbTypeFromGeomType( QGis::GeometryType geomType )
{
switch ( geomType )
Expand Down
9 changes: 3 additions & 6 deletions src/providers/postgres/qgspostgresconn.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,19 +163,16 @@ class QgsPostgresConn : public QObject

static const int sGeomTypeSelectLimit;

static QString displayStringForGeomType( QGis::GeometryType geomType );
static QString displayStringForWkbType( QGis::WkbType wkbType );

static QGis::WkbType wkbTypeFromPostgis( QString type );
static QGis::GeometryType geomTypeFromPostgis( QString dbType );
static QGis::WkbType wkbTypeFromPostgis( QString dbType );

static QString postgisWkbTypeName( QGis::WkbType wkbType );
static int postgisWkbTypeDim( QGis::WkbType wkbType );
static void postgisWkbType( QGis::WkbType wkbType, QString &geometryType, int &dim );

static QString postgisTypeFilter( QString geomCol, QGis::GeometryType geomtype, bool isGeography );
static QString postgisTypeFilter( QString geomCol, QGis::WkbType wkbType, bool isGeography );

static QGis::WkbType wkbTypeFromGeomType( QGis::GeometryType geomtype );
static QGis::WkbType wkbTypeFromGeomType( QGis::GeometryType geomType );

static QStringList connectionList();
static QString selectedConnection();
Expand Down
27 changes: 18 additions & 9 deletions src/providers/postgres/qgspostgresdataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ void QgsPGConnectionItem::setLayerType( QgsPostgresLayerProperty layerProperty )

for ( int i = 0 ; i < typeList.size(); i++ )
{
QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( typeList[i] );
if ( geomType == QGis::UnknownGeometry )
QGis::WkbType wkbType = QgsPostgresConn::wkbTypeFromPostgis( typeList[i] );
if ( wkbType == QGis::WKBUnknown )
{
QgsDebugMsg( QString( "unsupported geometry type:%1" ).arg( typeList[i] ) );
continue;
Expand Down Expand Up @@ -253,7 +253,7 @@ QString QgsPGLayerItem::createUri()
QgsDataSourceURI uri( connItem->connection()->connInfo() );
uri.setDataSource( mLayerProperty.schemaName, mLayerProperty.tableName, mLayerProperty.geometryColName, mLayerProperty.sql, pkColName );
uri.setSrid( mLayerProperty.srid );
uri.setGeometryType( QgsPostgresConn::geomTypeFromPostgis( mLayerProperty.type ) );
uri.setWkbType( QgsPostgresConn::wkbTypeFromPostgis( mLayerProperty.type ) );
QgsDebugMsg( QString( "layer uri: %1" ).arg( uri.uri() ) );
return uri.uri();
}
Expand All @@ -277,19 +277,28 @@ QgsPGSchemaItem::~QgsPGSchemaItem()

void QgsPGSchemaItem::addLayer( QgsPostgresLayerProperty layerProperty )
{
QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( layerProperty.type );
QString tip = tr( "%1 as %2 in %3" ).arg( layerProperty.geometryColName ).arg( QgsPostgresConn::displayStringForGeomType( geomType ) ).arg( layerProperty.srid );
QGis::WkbType wkbType = QgsPostgresConn::wkbTypeFromPostgis( layerProperty.type );
QString tip = tr( "%1 as %2 in %3" ).arg( layerProperty.geometryColName ).arg( QgsPostgresConn::displayStringForWkbType( wkbType ) ).arg( layerProperty.srid );

QgsLayerItem::LayerType layerType;
switch ( geomType )
switch ( wkbType )
{
case QGis::Point:
case QGis::WKBPoint:
case QGis::WKBPoint25D:
case QGis::WKBMultiPoint:
case QGis::WKBMultiPoint25D:
layerType = QgsLayerItem::Point;
break;
case QGis::Line:
case QGis::WKBLineString:
case QGis::WKBLineString25D:
case QGis::WKBMultiLineString:
case QGis::WKBMultiLineString25D:
layerType = QgsLayerItem::Line;
break;
case QGis::Polygon:
case QGis::WKBPolygon:
case QGis::WKBPolygon25D:
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPolygon25D:
layerType = QgsLayerItem::Polygon;
break;
default:
Expand Down
88 changes: 65 additions & 23 deletions src/providers/postgres/qgspostgresprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
, mFetching( false )
, mValid( false )
, mPrimaryKeyType( pktUnknown )
, mDetectedGeomType( QGis::UnknownGeometry )
, mRequestedGeomType( QGis::UnknownGeometry )
, mDetectedGeomType( QGis::WKBUnknown )
, mRequestedGeomType( QGis::WKBUnknown )
, mFeatureQueueSize( sFeatureQueueSize )
, mUseEstimatedMetadata( false )
, mSelectAtIdDisabled( false )
Expand All @@ -65,7 +65,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
mGeometryColumn = mUri.geometryColumn();
mSqlWhereClause = mUri.sql();
mRequestedSrid = mUri.srid();
mRequestedGeomType = mUri.geometryType();
mRequestedGeomType = mUri.wkbType();
mIsGeography = false;

if ( mSchemaName.isEmpty() &&
Expand Down Expand Up @@ -568,7 +568,7 @@ void QgsPostgresProvider::select( QgsAttributeList fetchAttributes, QgsRectangle
.arg( mRequestedSrid );
}

if ( mRequestedGeomType != QGis::UnknownGeometry && mRequestedGeomType != mDetectedGeomType )
if ( mRequestedGeomType != QGis::WKBUnknown && mRequestedGeomType != mDetectedGeomType )
{
whereClause += QString( " AND %1" ).arg( QgsPostgresConn::postgisTypeFilter( mGeometryColumn, mRequestedGeomType, mIsGeography ) );
}
Expand Down Expand Up @@ -906,9 +906,7 @@ void QgsPostgresProvider::setExtent( QgsRectangle& newExtent )
*/
QGis::WkbType QgsPostgresProvider::geometryType() const
{
return mRequestedGeomType != QGis::UnknownGeometry
? QgsPostgresConn::wkbTypeFromGeomType( mRequestedGeomType )
: QgsPostgresConn::wkbTypeFromGeomType( mDetectedGeomType );
return mRequestedGeomType != QGis::WKBUnknown ? mRequestedGeomType : mDetectedGeomType;
}

const QgsField &QgsPostgresProvider::field( int index ) const
Expand Down Expand Up @@ -1798,6 +1796,54 @@ QString QgsPostgresProvider::paramValue( QString fieldValue, const QString &defa
return fieldValue;
}

QString QgsPostgresProvider::geomParam( int offset ) const
{
QString geometry;

bool forceMulti;
switch ( geometryType() )
{
case QGis::WKBPoint:
case QGis::WKBLineString:
case QGis::WKBPolygon:
case QGis::WKBPoint25D:
case QGis::WKBLineString25D:
case QGis::WKBPolygon25D:
case QGis::WKBUnknown:
case QGis::WKBNoGeometry:
forceMulti = false;
break;

case QGis::WKBMultiPoint:
case QGis::WKBMultiLineString:
case QGis::WKBMultiPolygon:
case QGis::WKBMultiPoint25D:
case QGis::WKBMultiLineString25D:
case QGis::WKBMultiPolygon25D:
forceMulti = true;
break;
}


if ( forceMulti )
{
geometry += mConnectionRO->majorVersion() < 2 ? "multi(" : "st_multi(";
}

geometry += QString( "%1($%2%3,%4)" )
.arg( mConnectionRO->majorVersion() < 2 ? "geomfromwkb" : "st_geomfromwkb" )
.arg( offset )
.arg( mConnectionRW->useWkbHex() ? "" : "::bytea" )
.arg( mRequestedSrid.isEmpty() ? mDetectedSrid : mRequestedSrid );

if ( forceMulti )
{
geometry += ")";
}

return geometry;
}

bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
{
if ( flist.size() == 0 )
Expand Down Expand Up @@ -1827,11 +1873,9 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist )
if ( !mGeometryColumn.isNull() )
{
insert += quotedIdentifier( mGeometryColumn );
values += QString( "%1($%2%3,%4)" )
.arg( mConnectionRO->majorVersion() < 2 ? "geomfromwkb" : "st_geomfromwkb" )
.arg( offset++ )
.arg( mConnectionRW->useWkbHex() ? "" : "::bytea" )
.arg( mRequestedSrid.isEmpty() ? mDetectedSrid : mRequestedSrid );

values += geomParam( offset++ );

delim = ",";
}

Expand Down Expand Up @@ -2332,12 +2376,10 @@ bool QgsPostgresProvider::changeGeometryValues( QgsGeometryMap & geometry_map )
// Start the PostGIS transaction
mConnectionRW->PQexecNR( "BEGIN" );

QString update = QString( "UPDATE %1 SET %2=%3($1%4,%5) WHERE %6" )
QString update = QString( "UPDATE %1 SET %2=%3 WHERE %4" )
.arg( mQuery )
.arg( quotedIdentifier( mGeometryColumn ) )
.arg( mConnectionRW->majorVersion() < 2 ? "geomfromwkb" : "st_geomfromwkb" )
.arg( mConnectionRW->useWkbHex() ? "" : "::bytea" )
.arg( mRequestedSrid.isEmpty() ? mDetectedSrid : mRequestedSrid )
.arg( geomParam( 1 ) )
.arg( pkParamWhereClause( 2 ) );

QgsDebugMsg( "updating: " + update );
Expand Down Expand Up @@ -2601,7 +2643,7 @@ bool QgsPostgresProvider::getGeometryDetails()
{
if ( mGeometryColumn.isNull() )
{
mDetectedGeomType = QGis::NoGeometry;
mDetectedGeomType = QGis::WKBNoGeometry;
mValid = true;
return true;
}
Expand Down Expand Up @@ -2712,7 +2754,7 @@ bool QgsPostgresProvider::getGeometryDetails()
}
}

if ( QgsPostgresConn::geomTypeFromPostgis( detectedType ) == QGis::UnknownGeometry )
if ( QgsPostgresConn::wkbTypeFromPostgis( detectedType ) == QGis::WKBUnknown )
{
QgsPostgresLayerProperty layerProperty;
layerProperty.schemaName = schemaName;
Expand All @@ -2737,7 +2779,7 @@ bool QgsPostgresProvider::getGeometryDetails()
if ( typeList.size() == 0 )
{
// no data - so take what's requested
if ( mRequestedGeomType == QGis::UnknownGeometry || mRequestedSrid.isEmpty() )
if ( mRequestedGeomType == QGis::WKBUnknown || mRequestedSrid.isEmpty() )
{
QgsMessageLog::logMessage( tr( "Geometry type and srid for empty column %1 of %2 undefined." ).arg( mGeometryColumn ).arg( mQuery ) );
}
Expand All @@ -2750,9 +2792,9 @@ bool QgsPostgresProvider::getGeometryDetails()
int i;
for ( i = 0; i < typeList.size(); i++ )
{
QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis( typeList.at( i ) );
QGis::WkbType wkbType = QgsPostgresConn::wkbTypeFromPostgis( typeList.at( i ) );

if (( geomType != QGis::UnknownGeometry && ( mRequestedGeomType == QGis::UnknownGeometry || mRequestedGeomType == geomType ) ) &&
if (( wkbType != QGis::WKBUnknown && ( mRequestedGeomType == QGis::WKBUnknown || mRequestedGeomType == wkbType ) ) &&
( mRequestedSrid.isEmpty() || sridList.at( i ) == mRequestedSrid ) )
break;
}
Expand Down Expand Up @@ -2783,15 +2825,15 @@ bool QgsPostgresProvider::getGeometryDetails()
}
}

mDetectedGeomType = QgsPostgresConn::geomTypeFromPostgis( detectedType );
mDetectedGeomType = QgsPostgresConn::wkbTypeFromPostgis( detectedType );
mDetectedSrid = detectedSrid;

QgsDebugMsg( QString( "Detected SRID is %1" ).arg( mDetectedSrid ) );
QgsDebugMsg( QString( "Requested SRID is %1" ).arg( mRequestedSrid ) );
QgsDebugMsg( QString( "Detected type is %1" ).arg( mDetectedGeomType ) );
QgsDebugMsg( QString( "Requested type is %1" ).arg( mRequestedGeomType ) );

mValid = ( mDetectedGeomType != QGis::UnknownGeometry || mRequestedGeomType != QGis::UnknownGeometry )
mValid = ( mDetectedGeomType != QGis::WKBUnknown || mRequestedGeomType != QGis::WKBUnknown )
&& ( !mDetectedSrid.isEmpty() || !mRequestedSrid.isEmpty() );

if ( !mValid )
Expand Down
15 changes: 8 additions & 7 deletions src/providers/postgres/qgspostgresprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ class QgsPostgresProvider : public QgsVectorDataProvider
QgsFeature &feature,
const QgsAttributeList &fetchAttributes );

QString geomParam( int offset ) const;
QString pkParamWhereClause( int offset ) const;
QString whereClause( QgsFeatureId featureId ) const;

Expand Down Expand Up @@ -417,14 +418,14 @@ class QgsPostgresProvider : public QgsVectorDataProvider
QList<int> mPrimaryKeyAttrs;
QString mPrimaryKeyDefault;

QString mGeometryColumn; //! name of the geometry column
QgsRectangle mLayerExtent; //! Rectangle that contains the extent (bounding box) of the layer
mutable long mFeaturesCounted; //! Number of features in the layer
QString mGeometryColumn; //! name of the geometry column
QgsRectangle mLayerExtent; //! Rectangle that contains the extent (bounding box) of the layer
mutable long mFeaturesCounted; //! Number of features in the layer

QGis::GeometryType mDetectedGeomType; //! geometry type detected in the database
QGis::GeometryType mRequestedGeomType; //! geometry type requested in the uri
QString mDetectedSrid; //! Spatial reference detected in the database
QString mRequestedSrid; //! Spatial reference requested in the uri
QGis::WkbType mDetectedGeomType; //! geometry type detected in the database
QGis::WkbType mRequestedGeomType; //! geometry type requested in the uri
QString mDetectedSrid; //! Spatial reference detected in the database
QString mRequestedSrid; //! Spatial reference requested in the uri

/**
* Feature queue that GetNextFeature will retrieve from
Expand Down