Skip to content

Commit

Permalink
Multiple fixes in QgsHanaUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
Maksim Rylov authored and mrylov committed Dec 7, 2020
1 parent 9a380df commit 85960cc
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 114 deletions.
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanadataitemguiprovider.cpp
Expand Up @@ -66,7 +66,7 @@ bool QgsHanaDataItemGuiProvider::deleteLayer( QgsLayerItem *item, QgsDataItemGui
if ( QgsHanaLayerItem *layerItem = qobject_cast<QgsHanaLayerItem *>( item ) )
{
const QgsHanaLayerProperty &layerInfo = layerItem->layerInfo();
QString objectName = QStringLiteral("%1.%2").arg( layerInfo.schemaName, layerInfo.tableName );
QString objectName = QStringLiteral( "%1.%2" ).arg( layerInfo.schemaName, layerInfo.tableName );
QString typeName = layerInfo.isView ? tr( "View" ) : tr( "Table" );

if ( QMessageBox::question( nullptr, tr( "Delete %1" ).arg( typeName ),
Expand Down
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanaresultset.cpp
Expand Up @@ -98,7 +98,7 @@ QVariant QgsHanaResultSet::getValue( unsigned short columnIndex )
{
case SQLDataTypes::Bit:
case SQLDataTypes::Boolean:
return QgsHanaUtils::toVariant( mResultSet->getBoolean( columnIndex ), QVariant::Bool );
return QgsHanaUtils::toVariant( mResultSet->getBoolean( columnIndex ) );
case SQLDataTypes::Char:
{
String str = mResultSet->getString( columnIndex );
Expand Down
159 changes: 55 additions & 104 deletions src/providers/hana/qgshanautils.cpp
Expand Up @@ -134,6 +134,14 @@ QString QgsHanaUtils::toQString( const String &str )
return QString::fromUtf8( str->c_str() );
}

QVariant QgsHanaUtils::toVariant( const odbc::Boolean &value )
{
if ( value.isNull() )
return QVariant( QVariant::Bool );
else
return QVariant( *value );
}

QVariant QgsHanaUtils::toVariant( const Byte &value )
{
if ( value.isNull() )
Expand Down Expand Up @@ -280,87 +288,22 @@ QgsWkbTypes::Type QgsHanaUtils::toWkbType( const odbc::String &type, const odbc:
bool hasMValue = hasM.isNull() ? false : *hasM == 1;
QString hanaType( type->c_str() );

if ( hanaType == QStringLiteral( "ST_POINT" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::PointZM;
if ( hasZValue )
return QgsWkbTypes::PointZ;
if ( hasMValue )
return QgsWkbTypes::PointM;
return QgsWkbTypes::Point;
}
else if ( hanaType == QStringLiteral( "ST_MULTIPOINT" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::MultiPointZM;
if ( hasZValue )
return QgsWkbTypes::MultiPointZ;
if ( hasMValue )
return QgsWkbTypes::MultiPointM;
return QgsWkbTypes::MultiPoint;
}
else if ( hanaType == QStringLiteral( "ST_LINESTRING" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::LineStringZM;
if ( hasZValue )
return QgsWkbTypes::LineStringZ;
if ( hasMValue )
return QgsWkbTypes::LineStringM;
return QgsWkbTypes::LineString;
}
else if ( hanaType == QStringLiteral( "ST_MULTILINESTRING" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::MultiLineStringZM;
if ( hasZValue )
return QgsWkbTypes::MultiLineStringZ;
if ( hasMValue )
return QgsWkbTypes::MultiLineStringM;
return QgsWkbTypes::MultiLineString;
}
else if ( hanaType == QStringLiteral( "ST_POLYGON" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::PolygonZM;
if ( hasZValue )
return QgsWkbTypes::PolygonZ;
if ( hasMValue )
return QgsWkbTypes::PolygonM;
return QgsWkbTypes::Polygon;
}
else if ( hanaType == QStringLiteral( "ST_MULTIPOLYGON" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::MultiPolygonZM;
if ( hasZValue )
return QgsWkbTypes::MultiPolygonZ;
if ( hasMValue )
return QgsWkbTypes::MultiPolygonM;
return QgsWkbTypes::MultiPolygon;
}
else if ( hanaType == QStringLiteral( "ST_GEOMETRYCOLLECTION" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::GeometryCollectionZM;
if ( hasZValue )
return QgsWkbTypes::GeometryCollectionZ;
if ( hasMValue )
return QgsWkbTypes::GeometryCollectionM;
return QgsWkbTypes::Type::GeometryCollection;
}
else if ( hanaType == QStringLiteral( "ST_CIRCULARSTRING" ) )
{
if ( hasZValue && hasMValue )
return QgsWkbTypes::CircularStringZM;
if ( hasZValue )
return QgsWkbTypes::CircularStringZ;
if ( hasMValue )
return QgsWkbTypes::CircularStringM;
return QgsWkbTypes::Type::CircularString;
}

if ( hanaType == QLatin1String( "ST_POINT" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::Point, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_MULTIPOINT" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::MultiPoint, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_LINESTRING" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::LineString, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_MULTILINESTRING" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::MultiLineString, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_POLYGON" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::Polygon, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_MULTIPOLYGON" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::MultiPolygon, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_GEOMETRYCOLLECTION" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::GeometryCollection, hasZValue, hasMValue );
else if ( hanaType == QLatin1String( "ST_CIRCULARSTRING" ) )
return QgsWkbTypes::zmType( QgsWkbTypes::CircularString, hasZValue, hasMValue );
return QgsWkbTypes::Type::Unknown;
}

Expand Down Expand Up @@ -398,16 +341,26 @@ bool QgsHanaUtils::convertField( QgsField &field )
fieldSize = -1;
fieldPrec = 0;
break;
case QVariant::Char:
fieldType = QStringLiteral( "TINYINT" );
case QVariant::Int:
fieldType = QStringLiteral( "INTEGER" );
fieldSize = -1;
fieldPrec = 0;
break;
case QVariant::UInt:
fieldType = QStringLiteral( "DECIMAL" );
fieldSize = 10;
fieldPrec = 0;
break;
case QVariant::LongLong:
fieldType = QStringLiteral( "BIGINT" );
fieldSize = -1;
fieldPrec = 0;
break;
case QVariant::ULongLong:
fieldType = QStringLiteral( "DECIMAL" );
fieldSize = 20;
fieldPrec = 0;
break;
case QVariant::Date:
fieldType = QStringLiteral( "DATE" );
fieldPrec = -1;
Expand All @@ -420,23 +373,6 @@ bool QgsHanaUtils::convertField( QgsField &field )
fieldType = QStringLiteral( "TIMESTAMP" );
fieldPrec = -1;
break;
case QVariant::String:
if ( fieldSize > 0 )
{
if ( fieldSize <= 5000 )
fieldType = QStringLiteral( "NVARCHAR(%1)" ).arg( QString::number( fieldSize ) );
else
fieldType = QStringLiteral( "NCLOB" );
}
else
fieldType = QStringLiteral( "NVARCHAR(5000)" );
fieldPrec = -1;
break;
case QVariant::Int:
fieldType = QStringLiteral( "INTEGER" );
fieldSize = -1;
fieldPrec = 0;
break;
case QVariant::Double:
if ( fieldSize <= 0 || fieldPrec <= 0 )
{
Expand All @@ -446,14 +382,28 @@ bool QgsHanaUtils::convertField( QgsField &field )
}
else
{
if ( fieldPrec > 0 )
fieldType = QStringLiteral( "DECIMAL(%1,%2)" ).arg( fieldSize, fieldPrec );
fieldType = QStringLiteral( "DECIMAL(%1,%2)" ).arg( fieldSize, fieldPrec );
}
break;
case QVariant::Char:
fieldType = QStringLiteral( "NCHAR(1)" );
fieldSize = 1;
fieldPrec = 0;
break;
case QVariant::String:
if ( fieldSize > 0 )
{
if ( fieldSize <= 5000 )
fieldType = QStringLiteral( "NVARCHAR(%1)" ).arg( QString::number( fieldSize ) );
else
fieldType = QStringLiteral( "DECIMAL" );
fieldType = QStringLiteral( "NCLOB" );
}
else
fieldType = QStringLiteral( "NVARCHAR(5000)" );
fieldPrec = -1;
break;
case QVariant::ByteArray:
if ( fieldSize > 1 && fieldSize <= 5000 )
if ( fieldSize >= 1 && fieldSize <= 5000 )
fieldType = QStringLiteral( "VARBINARY(%1)" ).arg( QString::number( fieldSize ) );
else
fieldType = QStringLiteral( "BLOB" );
Expand All @@ -465,6 +415,7 @@ bool QgsHanaUtils::convertField( QgsField &field )
field.setTypeName( fieldType );
field.setLength( fieldSize );
field.setPrecision( fieldPrec );

return true;
}

Expand Down
9 changes: 1 addition & 8 deletions src/providers/hana/qgshanautils.h
Expand Up @@ -39,6 +39,7 @@ class QgsHanaUtils

static QString toQString( const odbc::NString &str );
static QString toQString( const odbc::String &str );
static QVariant toVariant( const odbc::Boolean &value );
static QVariant toVariant( const odbc::Byte &value );
static QVariant toVariant( const odbc::UByte &value );
static QVariant toVariant( const odbc::Short &value );
Expand All @@ -55,14 +56,6 @@ class QgsHanaUtils
static QVariant toVariant( const odbc::String &value );
static QVariant toVariant( const odbc::NString &value );
static QVariant toVariant( const odbc::Binary &value );
template<typename T>
static QVariant toVariant( const odbc::Nullable<T> &value, QVariant::Type nullType )
{
if ( value.isNull() )
return QVariant( nullType );
else
return QVariant( *value );
}

static const char16_t *toUtf16( const QString &sql );
static QgsWkbTypes::Type toWkbType( const odbc::String &type, const odbc::Int &hasZ, const odbc::Int &hasM );
Expand Down

0 comments on commit 85960cc

Please sign in to comment.