Skip to content

Commit

Permalink
Rework detection of HANA ODBC driver
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 b1ff0a5 commit b87b63d
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 29 deletions.
54 changes: 43 additions & 11 deletions src/providers/hana/qgshanadriver.cpp
Expand Up @@ -17,40 +17,67 @@
#include "qgshanadriver.h"
#include "qgslogger.h"

#include <QDir>
#include <QFileInfo>

#include "odbc/Connection.h"
#include "odbc/Environment.h"

using namespace odbc;

QgsHanaDriver *QgsHanaDriver::sInstance = nullptr;

static QString detectDriverPath( EnvironmentRef &env, const QString &libName, const QString &defaultPath )
{
QString path = defaultPath + QDir::separator() + libName;
if ( QFileInfo::exists( path ) )
return path;

std::vector<DriverInformation> drivers = env->getDrivers();
for ( const DriverInformation &drv : drivers )
{
for ( const DriverInformation::Attribute &attr : drv.attributes )
{
if ( QString::compare( QString::fromStdString( attr.name ), "DRIVER", Qt::CaseInsensitive ) == 0 )
{
QString path = QString::fromStdString( attr.value );
if ( path.endsWith( libName ) && QFileInfo::exists( path ) )
return path;
}
}
}
return QString();
}

QgsHanaDriver::QgsHanaDriver()
: mEnv( Environment::create() )
{
QgsDebugCall;
mEnv = Environment::create();
#ifdef Q_OS_WIN
#ifdef Q_OS_WIN64
mIsInstalled = mEnv->isDriverInstalled( "HDBODBC" );
#if defined(Q_OS_WIN)
#if defined(Q_OS_WIN64)
mDriver = mEnv->isDriverInstalled( "HDBODBC" ) ? "HDBODBC" : "";
#else
mIsInstalled = mEnv->isDriverInstalled( "HDBODBC32" );
mDriver = mEnv->isDriverInstalled( "HDBODBC32" ) ? "HDBODBC32" : "";
#endif
#elif defined(Q_OS_MAC)
mDriver = detectDriverPath( mEnv, "libodbcHDB.dylib", "/Applications/sap/hdbclient" );
#else
mIsInstalled = true;
mDriver = detectDriverPath( mEnv, "libodbcHDB.so", "/usr/sap/hdbclient" );
#endif
}

QgsHanaDriver::~QgsHanaDriver()
{
QgsDebugCall;
}

QgsHanaDriver *QgsHanaDriver::instance()
{
if ( !sInstance )
sInstance = new QgsHanaDriver();
return sInstance;
}

QgsHanaDriver::~QgsHanaDriver()
{
QgsDebugCall;
}

void QgsHanaDriver::cleanupInstance()
{
delete sInstance;
Expand All @@ -61,3 +88,8 @@ ConnectionRef QgsHanaDriver::createConnection()
{
return mEnv->createConnection();
}

QString QgsHanaDriver::getDriver() const
{
return mDriver;
}
12 changes: 6 additions & 6 deletions src/providers/hana/qgshanadriver.h
Expand Up @@ -18,27 +18,27 @@
#define QGSHANADRIVER_H

#include <qglobal.h>
#include <QString>
#include "odbc/Forwards.h"

class QgsHanaDriver
{
QgsHanaDriver();
~QgsHanaDriver();

public:
odbc::ConnectionRef createConnection();
bool isInstalled() const { return mIsInstalled; }
QString getDriver() const;

static QgsHanaDriver *instance();
static void cleanupInstance();

protected:
Q_DISABLE_COPY( QgsHanaDriver )

private:
QgsHanaDriver();
~QgsHanaDriver();

private:
odbc::EnvironmentRef mEnv;
bool mIsInstalled;
QString mDriver;

static QgsHanaDriver *sInstance;
};
Expand Down
8 changes: 3 additions & 5 deletions src/providers/hana/qgshananewconnection.cpp
Expand Up @@ -15,6 +15,7 @@
*
***************************************************************************/
#include "qgsauthmanager.h"
#include "qgshanadriver.h"
#include "qgshanaconnection.h"
#include "qgshananewconnection.h"
#include "qgshanasettings.h"
Expand Down Expand Up @@ -54,11 +55,8 @@ QgsHanaNewConnection::QgsHanaNewConnection(
connect( btnConnect, &QPushButton::clicked, this, &QgsHanaNewConnection::btnConnect_clicked );
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsHanaNewConnection::showHelp );

#ifdef Q_OS_WIN
txtDriver->setText( QLatin1String( "HDBODBC" ) );
#else
txtDriver->setText( QLatin1String( "/usr/sap/hdbclient/libodbcHDB.so" ) );
#endif
txtDriver->setText( QgsHanaDriver::instance()->getDriver() );

cbxCryptoProvider->addItem( tr( "openssl" ), QLatin1String( "openssl" ) );
cbxCryptoProvider->addItem( tr( "commoncrypto" ), QLatin1String( "commoncrypto" ) );
cbxCryptoProvider->addItem( tr( "sapcrypto" ), QLatin1String( "sapcrypto" ) );
Expand Down
8 changes: 1 addition & 7 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -1711,11 +1711,5 @@ QgsVectorLayerExporter::ExportError QgsHanaProviderMetadata::createEmptyLayer(

QGISEXTERN QgsProviderMetadata *providerMetadataFactory()
{
if ( QgsHanaDriver::instance()->isInstalled() )
return new QgsHanaProviderMetadata();
else
{
QgsMessageLog::logMessage( QStringLiteral( "HANA ODBC driver cannot be found" ), QStringLiteral( "HANA" ) );
return nullptr;
}
return new QgsHanaProviderMetadata();
}

0 comments on commit b87b63d

Please sign in to comment.