Skip to content

Commit

Permalink
Fix HANA issues found in #41222
Browse files Browse the repository at this point in the history
  • Loading branch information
mrylov authored and nyalldawson committed Jan 29, 2021
1 parent 91a2742 commit 2155c81
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 28 deletions.
6 changes: 3 additions & 3 deletions src/providers/hana/qgshanadataitems.cpp
Expand Up @@ -38,7 +38,7 @@ QgsHanaConnectionItem::QgsHanaConnectionItem(
QgsDataItem *parent,
const QString &name,
const QString &path )
: QgsDataCollectionItem( parent, name, path )
: QgsDataCollectionItem( parent, name, path, QStringLiteral( "SAP HANA" ) )
{
mIconName = QStringLiteral( "mIconConnect.svg" );
mCapabilities |= Collapse;
Expand Down Expand Up @@ -285,7 +285,7 @@ QgsHanaSchemaItem::QgsHanaSchemaItem(
const QString &connectionName,
const QString &name,
const QString &path )
: QgsDatabaseSchemaItem( parent, name, path, QStringLiteral( "HANA" ) )
: QgsDatabaseSchemaItem( parent, name, path, QStringLiteral( "SAP HANA" ) )
, mConnectionName( connectionName )
{
mIconName = QStringLiteral( "mIconDbSchema.svg" );
Expand Down Expand Up @@ -362,7 +362,7 @@ QgsHanaLayerItem *QgsHanaSchemaItem::createLayer( const QgsHanaLayerProperty &la
}

QgsHanaRootItem::QgsHanaRootItem( QgsDataItem *parent, const QString &name, const QString &path )
: QgsConnectionsRootItem( parent, name, path, QStringLiteral( "HANA" ) )
: QgsConnectionsRootItem( parent, name, path, QStringLiteral( "SAP HANA" ) )
{
mCapabilities |= Fast;
mIconName = QStringLiteral( "mIconHana.svg" );
Expand Down
4 changes: 3 additions & 1 deletion src/providers/hana/qgshanadataitems.h
Expand Up @@ -74,6 +74,9 @@ class QgsHanaSchemaItem : public QgsDatabaseSchemaItem

QVector<QgsDataItem *> createChildren() override;

// QgsDataItem interface
bool layerCollection() const override { return true; }

private:
QgsHanaLayerItem *createLayer( const QgsHanaLayerProperty &layerProperty );

Expand Down Expand Up @@ -108,5 +111,4 @@ class QgsHanaDataItemProvider : public QgsDataItemProvider
QgsDataItem *createDataItem( const QString &pathIn, QgsDataItem *parentItem ) override;
};


#endif // QGSHANADATAITEMS_H
63 changes: 39 additions & 24 deletions src/providers/hana/qgshanaproviderconnection.cpp
Expand Up @@ -23,6 +23,7 @@
#include "qgshanautils.h"
#include "qgsapplication.h"
#include "qgsexception.h"
#include "qgsmessagelog.h"
#include "qgssettings.h"

#include "odbc/PreparedStatement.h"
Expand Down Expand Up @@ -98,36 +99,51 @@ void QgsHanaProviderConnection::setCapabilities()

const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );
const QString sql = QStringLiteral( "SELECT OBJECT_TYPE, PRIVILEGE, SCHEMA_NAME, OBJECT_NAME FROM PUBLIC.EFFECTIVE_PRIVILEGES "
"WHERE USER_NAME = CURRENT_USER AND IS_VALID = 'TRUE'" );
QgsHanaResultSetRef rsPrivileges = conn->executeQuery( sql );
while ( rsPrivileges->next() )
if ( !conn.isNull() )
{
QString objType = rsPrivileges->getString( 1 );
QString privType = rsPrivileges->getString( 2 );
if ( objType == QLatin1String( "SYSTEMPRIVILEGE" ) )
const QString sql = QStringLiteral( "SELECT OBJECT_TYPE, PRIVILEGE, SCHEMA_NAME, OBJECT_NAME FROM PUBLIC.EFFECTIVE_PRIVILEGES "
"WHERE USER_NAME = CURRENT_USER AND IS_VALID = 'TRUE'" );
try
{
if ( privType == QLatin1String( "CREATE SCHEMA" ) )
mCapabilities |= Capability::CreateSchema | Capability::DropSchema | Capability::RenameSchema;
else if ( privType == QLatin1String( "CATALOG READ" ) || privType == QLatin1String( "DATA ADMIN" ) )
mCapabilities |= Capability::Schemas | Capability::Tables | Capability::TableExists;
}
else if ( objType == QLatin1String( "TABLE" ) || objType == QLatin1String( "VIEW" ) )
{
if ( privType == QLatin1String( "SELECT" ) )
QgsHanaResultSetRef rsPrivileges = conn->executeQuery( sql );
while ( rsPrivileges->next() )
{
QString schemaName = rsPrivileges->getString( 3 );
QString objName = rsPrivileges->getString( 4 );

if ( schemaName == QLatin1String( "SYS" ) && objName == QLatin1String( "SCHEMAS" ) )
mCapabilities |= Capability::Schemas;
else if ( objName == QLatin1String( "TABLE_COLUMNS" ) )
mCapabilities |= Capability::Tables | Capability::TableExists;
QString objType = rsPrivileges->getString( 1 );
QString privType = rsPrivileges->getString( 2 );
if ( objType == QLatin1String( "SYSTEMPRIVILEGE" ) )
{
if ( privType == QLatin1String( "CREATE SCHEMA" ) )
mCapabilities |= Capability::CreateSchema | Capability::DropSchema | Capability::RenameSchema;
else if ( privType == QLatin1String( "CATALOG READ" ) || privType == QLatin1String( "DATA ADMIN" ) )
mCapabilities |= Capability::Schemas | Capability::Tables | Capability::TableExists;
}
else if ( objType == QLatin1String( "TABLE" ) || objType == QLatin1String( "VIEW" ) )
{
if ( privType == QLatin1String( "SELECT" ) )
{
QString schemaName = rsPrivileges->getString( 3 );
QString objName = rsPrivileges->getString( 4 );

if ( schemaName == QLatin1String( "SYS" ) && objName == QLatin1String( "SCHEMAS" ) )
mCapabilities |= Capability::Schemas;
else if ( objName == QLatin1String( "TABLE_COLUMNS" ) )
mCapabilities |= Capability::Tables | Capability::TableExists;
}
}
}
rsPrivileges->close();

return;
}
catch ( const QgsHanaException &ex )
{
QgsMessageLog::logMessage( QObject::tr( "Unable to retrieve user privileges: %1" ).arg( QgsHanaUtils::formatErrorMessage( ex.what(), false ) ), QObject::tr( "SAP HANA" ) );
}
}

rsPrivileges->close();
// We enable all capabilities, if we were not able to retrieve them from the database.
mCapabilities |= Capability::CreateSchema | Capability::DropSchema | Capability::RenameSchema |
Capability::Schemas | Capability::Tables | Capability::TableExists;
}

void QgsHanaProviderConnection::dropTable( const QString &schema, const QString &name ) const
Expand Down Expand Up @@ -270,7 +286,6 @@ QgsAbstractDatabaseProviderConnection::QueryResult QgsHanaProviderConnection::ex
{
throw QgsProviderConnectionException( ex.what() );
}

}

void QgsHanaProviderConnection::executeSqlStatement( const QString &sql ) const
Expand Down

0 comments on commit 2155c81

Please sign in to comment.