Skip to content

Commit

Permalink
Rework how query is determined in QgsHanaProviderConnection
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 af3d5af commit 550abfd
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 34 deletions.
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanaconnection.cpp
Expand Up @@ -177,7 +177,7 @@ QStringList QgsHanaConnection::connectionList()
return settings.childGroups();
}

QString QgsHanaConnection::connInfo()
QString QgsHanaConnection::connInfo() const
{
return QgsHanaUtils::connectionInfo( mUri );
}
Expand Down
7 changes: 3 additions & 4 deletions src/providers/hana/qgshanaconnection.h
Expand Up @@ -33,7 +33,7 @@ class QgsHanaConnection : public QObject
public:
~QgsHanaConnection() override;

QString connInfo();
QString connInfo() const;

void execute( const QString &sql );
bool execute( const QString &sql, QString *errorMessage );
Expand Down Expand Up @@ -78,7 +78,7 @@ class QgsHanaConnection : public QObject

private:
odbc::ConnectionRef mConnection;
QgsDataSourceUri mUri;
const QgsDataSourceUri mUri;
QString mDatabaseVersion;
QString mUserName;
};
Expand All @@ -92,8 +92,7 @@ class QgsHanaConnectionRef
~QgsHanaConnectionRef();

bool isNull() const { return mConnection.get() == nullptr; }
QgsHanaConnection &connection() const { return *mConnection; }

QgsHanaConnection &operator*() { return *mConnection; }
QgsHanaConnection *operator->() { return mConnection.get(); }

private:
Expand Down
7 changes: 3 additions & 4 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -50,7 +50,6 @@ using namespace std;

namespace
{

QString buildQuery( const QString &query, const QString &whereClause )
{
if ( whereClause.trimmed().isEmpty() )
Expand Down Expand Up @@ -255,8 +254,8 @@ QgsHanaProvider::QgsHanaProvider(
mQuery = QStringLiteral( "SELECT * FROM " ) + mQuery;
}

QgsHanaConnectionRef connRef( mUri );
if ( connRef.isNull() )
QgsHanaConnectionRef conn( mUri );
if ( conn.isNull() )
return;

if ( !checkPermissionsAndSetCapabilities() )
Expand All @@ -268,7 +267,7 @@ QgsHanaProvider::QgsHanaProvider(
if ( mSrid < 0 )
mSrid = readSrid();

mDatabaseVersion = QgsHanaUtils::toHANAVersion( connRef->getDatabaseVersion() );
mDatabaseVersion = QgsHanaUtils::toHANAVersion( conn->getDatabaseVersion() );
readGeometryType();
readAttributeFields();
readSrsInformation();
Expand Down
66 changes: 43 additions & 23 deletions src/providers/hana/qgshanaproviderconnection.cpp
Expand Up @@ -184,26 +184,41 @@ void QgsHanaProviderConnection::renameSchema( const QString &name, const QString
QList<QVariantList> QgsHanaProviderConnection::executeSql( const QString &sql ) const
{
checkCapability( Capability::ExecuteSql );
if ( sql.trimmed().startsWith( "SELECT", Qt::CaseSensitivity::CaseInsensitive ) )
return executeSqlQuery( sql );

const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );

if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );

bool isQuery = false;

try
{
PreparedStatementRef stmt = conn->prepareStatement( sql );
isQuery = stmt->getMetaData()->getColumnCount() > 0;
}
catch ( const QgsHanaException &ex )
{
throw QgsProviderConnectionException( ex.what() );
}

if ( isQuery )
return executeSqlQuery( *conn, sql );
else
{
executeSqlStatement( sql );
return QList<QVariantList>();
}
}

QList<QVariantList> QgsHanaProviderConnection::executeSqlQuery( const QString &sql ) const
QList<QVariantList> QgsHanaProviderConnection::executeSqlQuery( QgsHanaConnection &conn, const QString &sql ) const
{
const QgsDataSourceUri dsUri { uri() };
QList<QVariantList> results;
QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );

try
{
QgsHanaResultSetRef resultSet = conn->executeQuery( sql );
QgsHanaResultSetRef resultSet = conn.executeQuery( sql );
const unsigned short nColumns = resultSet->getMetadata().getColumnCount();
while ( resultSet->next() )
{
Expand All @@ -216,36 +231,41 @@ QList<QVariantList> QgsHanaProviderConnection::executeSqlQuery( const QString &s
}
catch ( const QgsHanaException &ex )
{
throw QgsProviderConnectionException( QString( ex.what() ) );
throw QgsProviderConnectionException( ex.what() );
}

return results;
}

void QgsHanaProviderConnection::executeSqlStatement( const QString &sql ) const
void QgsHanaProviderConnection::executeSqlStatement( QgsHanaConnection &conn, const QString &sql ) const
{
const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );

try
{
conn->execute( sql );
conn->commit();
conn.execute( sql );
conn.commit();
}
catch ( const QgsHanaException &ex )
{
throw QgsProviderConnectionException( QString( ex.what() ) );
throw QgsProviderConnectionException( ex.what() );
}
}

void QgsHanaProviderConnection::executeSqlStatement( const QString &sql ) const
{
const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );

executeSqlStatement( *conn, sql );
}

QList<QgsHanaProviderConnection::TableProperty> QgsHanaProviderConnection::tables( const QString &schema, const TableFlags &flags ) const
{
checkCapability( Capability::Tables );
QList<QgsHanaProviderConnection::TableProperty> tables;
const QgsDataSourceUri dsUri { uri() };

const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );
Expand Down Expand Up @@ -290,7 +310,7 @@ QList<QgsHanaProviderConnection::TableProperty> QgsHanaProviderConnection::table
}
catch ( const QgsHanaException &ex )
{
throw QgsProviderConnectionException( QObject::tr( "Could not retrieve tables: %1, %2" ).arg( uri(), QString( ex.what() ) ) );
throw QgsProviderConnectionException( QObject::tr( "Could not retrieve tables: %1, %2" ).arg( uri(), ex.what() ) );
}

return tables;
Expand All @@ -300,7 +320,6 @@ QStringList QgsHanaProviderConnection::schemas( ) const
{
checkCapability( Capability::Schemas );

QStringList schemas;
const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );

Expand All @@ -309,15 +328,16 @@ QStringList QgsHanaProviderConnection::schemas( ) const

try
{
QStringList schemas;
QVector<QgsHanaSchemaProperty> schemaProperties = conn->getSchemas( "" );
for ( const auto &s : qgis::as_const( schemaProperties ) )
schemas.push_back( s.name );
return schemas;
}
catch ( const QgsHanaException &ex )
{
throw QgsProviderConnectionException( QObject::tr( "Could not retrieve schemas: %1, %2" ).arg( uri(), QString( ex.what() ) ) );
throw QgsProviderConnectionException( QObject::tr( "Could not retrieve schemas: %1, %2" ).arg( uri(), ex.what() ) );
}
return schemas;
}

void QgsHanaProviderConnection::store( const QString &name ) const
Expand Down
5 changes: 3 additions & 2 deletions src/providers/hana/qgshanaproviderconnection.h
Expand Up @@ -18,6 +18,7 @@
#define QGSHANAPROVIDERCONNECTION_H

#include "qgsabstractdatabaseproviderconnection.h"
#include "qgshanaconnection.h"

class QgsHanaProviderConnection : public QgsAbstractDatabaseProviderConnection
{
Expand Down Expand Up @@ -52,8 +53,8 @@ class QgsHanaProviderConnection : public QgsAbstractDatabaseProviderConnection
QIcon icon() const override;

private:

QList<QVariantList> executeSqlQuery( const QString &sql ) const;
QList<QVariantList> executeSqlQuery( QgsHanaConnection &conn, const QString &sql ) const;
void executeSqlStatement( QgsHanaConnection &conn, const QString &sql ) const;
void executeSqlStatement( const QString &sql ) const;
void setCapabilities();
void dropTable( const QString &schema, const QString &name ) const;
Expand Down

0 comments on commit 550abfd

Please sign in to comment.