Skip to content

Commit

Permalink
Make use of DatabaseMetaDataUnicode and ResultSetMetaDataUnicode in H…
Browse files Browse the repository at this point in the history
…ANA provider
  • Loading branch information
Maksim Rylov authored and mrylov committed Dec 7, 2020
1 parent 04c00e6 commit 48ca958
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 40 deletions.
41 changes: 21 additions & 20 deletions src/providers/hana/qgshanaconnection.cpp
Expand Up @@ -32,11 +32,12 @@
#include "qexception.h"

#include "odbc/Connection.h"
#include "odbc/DatabaseMetaData.h"
#include "odbc/DatabaseMetaDataUnicode.h"
#include "odbc/Environment.h"
#include "odbc/Exception.h"
#include "odbc/PreparedStatement.h"
#include "odbc/ResultSet.h"
#include "odbc/ResultSetMetaDataUnicode.h"
#include "odbc/Statement.h"

using namespace odbc;
Expand Down Expand Up @@ -187,7 +188,7 @@ void QgsHanaConnection::execute( const QString &sql )
try
{
StatementRef stmt = mConnection->createStatement();
stmt->execute( QgsHanaUtils::toQueryString( sql ) );
stmt->execute( QgsHanaUtils::toUtf16( sql ) );
}
catch ( const Exception &ex )
{
Expand All @@ -200,7 +201,7 @@ bool QgsHanaConnection::execute( const QString &sql, QString *errorMessage )
try
{
StatementRef stmt = mConnection->createStatement();
stmt->execute( QgsHanaUtils::toQueryString( sql ) );
stmt->execute( QgsHanaUtils::toUtf16( sql ) );
mConnection->commit();
return true;
}
Expand Down Expand Up @@ -244,7 +245,7 @@ size_t QgsHanaConnection::executeCountQuery( const QString &sql )
try
{
StatementRef stmt = mConnection->createStatement();
ResultSetRef rs = stmt->executeQuery( QgsHanaUtils::toQueryString( sql ) );
ResultSetRef rs = stmt->executeQuery( QgsHanaUtils::toUtf16( sql ) );
rs->next();
size_t ret = static_cast<size_t>( *rs->getLong( 1 ) );
rs->close();
Expand Down Expand Up @@ -313,7 +314,7 @@ odbc::PreparedStatementRef QgsHanaConnection::prepareStatement( const QString &s
{
try
{
return mConnection->prepareStatement( QgsHanaUtils::toQueryString( sql ) );
return mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
}
catch ( const Exception &ex )
{
Expand Down Expand Up @@ -351,8 +352,8 @@ const QString &QgsHanaConnection::getDatabaseVersion()
{
try
{
DatabaseMetaDataRef dbmd = mConnection->getDatabaseMetaData();
mDatabaseVersion = dbmd->getDBMSVersion().c_str();
DatabaseMetaDataUnicodeRef dbmd = mConnection->getDatabaseMetaDataUnicode();
mDatabaseVersion = QString::fromStdU16String( dbmd->getDBMSVersion() );
}
catch ( const Exception &ex )
{
Expand Down Expand Up @@ -455,7 +456,7 @@ QVector<QgsHanaLayerProperty> QgsHanaConnection::getLayers(

auto addLayers = [&]( const QString & sql, bool isView )
{
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toQueryString( sql ) );
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
stmt->setNString( 1, NString( schema.isEmpty() ? u"%" : schema.toStdU16String() ) );
QgsHanaResultSetRef rsLayers = QgsHanaResultSet::create( stmt );

Expand Down Expand Up @@ -539,7 +540,7 @@ QVector<QgsHanaSchemaProperty> QgsHanaConnection::getSchemas( const QString &own

try
{
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toQueryString( sql ) );
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
if ( !ownerName.isEmpty() )
stmt->setNString( 1, NString( ownerName.toStdU16String() ) );
QgsHanaResultSetRef rsSchemas = QgsHanaResultSet::create( stmt );
Expand Down Expand Up @@ -586,7 +587,7 @@ int QgsHanaConnection::getLayerSRID( const QgsHanaLayerProperty &layerProperty )
QgsHanaUtils::quotedIdentifier( layerProperty.schemaName ),
QgsHanaUtils::quotedIdentifier( layerProperty.tableName ),
QString::number( GEOM_TYPE_SELECT_LIMIT ) );
stmt = mConnection->prepareStatement( QgsHanaUtils::toQueryString( sql ) );
stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
}

int prevSrid = -1;
Expand Down Expand Up @@ -618,19 +619,19 @@ QStringList QgsHanaConnection::getLayerPrimaryeKeys( const QgsHanaLayerProperty

try
{
DatabaseMetaDataRef dbmd = mConnection->getDatabaseMetaData();
DatabaseMetaDataUnicodeRef dbmd = mConnection->getDatabaseMetaDataUnicode();
ResultSetRef rsPrimaryKeys = dbmd->getPrimaryKeys( nullptr,
layerProperty.schemaName.toStdString().c_str(),
layerProperty.tableName.toStdString().c_str() );
QgsHanaUtils::toUtf16( layerProperty.schemaName ),
QgsHanaUtils::toUtf16( layerProperty.tableName ) );

while ( rsPrimaryKeys->next() )
{
auto keyName = rsPrimaryKeys->getNString( 4 );
QString clmName = QgsHanaUtils::toQString( keyName );
ResultSetRef rsColumns = dbmd->getColumns( nullptr,
layerProperty.schemaName.toStdString().c_str(),
layerProperty.tableName.toStdString().c_str(),
clmName.toStdString().c_str() );
QgsHanaUtils::toUtf16( layerProperty.schemaName ),
QgsHanaUtils::toUtf16( layerProperty.tableName ),
QgsHanaUtils::toUtf16( clmName ) );

if ( rsColumns->next() )
{
Expand Down Expand Up @@ -669,7 +670,7 @@ QgsWkbTypes::Type QgsHanaConnection::getLayerGeometryType( const QgsHanaLayerPro
try
{
StatementRef stmt = mConnection->createStatement();
ResultSetRef rsGeomInfo = stmt->executeQuery( QgsHanaUtils::toQueryString( sql ) );
ResultSetRef rsGeomInfo = stmt->executeQuery( QgsHanaUtils::toUtf16( sql ) );
QgsWkbTypes::Type geomType = QgsWkbTypes::Unknown, prevGeomType = QgsWkbTypes::Unknown;
while ( rsGeomInfo->next() )
{
Expand Down Expand Up @@ -723,9 +724,9 @@ QgsHanaResultSetRef QgsHanaConnection::getColumns( const QString &schemaName, co
{
try
{
DatabaseMetaDataRef metadata = mConnection->getDatabaseMetaData();
DatabaseMetaDataUnicodeRef metadata = mConnection->getDatabaseMetaDataUnicode();
QgsHanaResultSetRef ret( new QgsHanaResultSet( metadata->getColumns( nullptr,
schemaName.toStdString().c_str(), tableName.toStdString().c_str(), fieldName.toStdString().c_str() ) ) );
QgsHanaUtils::toUtf16( schemaName ), QgsHanaUtils::toUtf16( tableName ), QgsHanaUtils::toUtf16( fieldName ) ) ) );
return ret;
}
catch ( const Exception &ex )
Expand All @@ -736,7 +737,7 @@ QgsHanaResultSetRef QgsHanaConnection::getColumns( const QString &schemaName, co

PreparedStatementRef QgsHanaConnection::createPreparedStatement( const QString &sql, const QVariantList &args )
{
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toQueryString( sql ) );
PreparedStatementRef stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
if ( !args.isEmpty() )
{
for ( unsigned short i = 1; i <= args.size(); ++i )
Expand Down
15 changes: 7 additions & 8 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -43,7 +43,8 @@
#include <ctype.h>

#include "odbc/PreparedStatement.h"
#include "odbc/ResultSetMetaData.h"
#include "odbc/ResultSet.h"
#include "odbc/ResultSetMetaDataUnicode.h"

using namespace odbc;
using namespace std;
Expand All @@ -57,7 +58,6 @@ namespace
return query + QStringLiteral( " WHERE " ) + whereClause;
}


void createCoordinateSystem( QgsHanaConnectionRef &conn, const QgsCoordinateReferenceSystem &srs )
{
OGRSpatialReferenceH hCRS = nullptr;
Expand Down Expand Up @@ -1187,16 +1187,16 @@ void QgsHanaProvider::readAttributeFields()

QString sql = QStringLiteral( "SELECT * FROM (%1) LIMIT 0" ).arg( mQuery );
QgsHanaResultSetRef rsAttributes = conn->executeQuery( sql );
ResultSetMetaData &rsmd = rsAttributes->getMetadata();
ResultSetMetaDataUnicode &rsmd = rsAttributes->getMetadata();
for ( unsigned short i = 1; i <= rsmd.getColumnCount(); ++i )
{
const QString fieldName( rsmd.getColumnName( i ).c_str() );
const QString fieldName = QString::fromStdU16String( rsmd.getColumnName( i ) );
if ( fieldName == mGeometryColumn )
continue;

QVariant::Type fieldType = QVariant::Invalid;
const short sqlType = rsmd.getColumnType( i );
const QString fieldTypeName( rsmd.getColumnTypeName( i ).c_str() );
const QString fieldTypeName = QString::fromStdU16String( rsmd.getColumnTypeName( i ) );
const bool isSigned = rsmd.isSigned( i );
int fieldSize = static_cast<int>( rsmd.getColumnLength( i ) );
int fieldPrec = -1;
Expand Down Expand Up @@ -1280,10 +1280,10 @@ void QgsHanaProvider::readAttributeFields()
mAttributeFields.append( newField );
mFieldInfos.append( { sqlType, isAutoIncrement, isNullable, isSigned } );

QString schemaName( rsmd.getSchemaName( i ).c_str() );
QString schemaName = QString::fromStdU16String( rsmd.getSchemaName( i ) );
if ( schemaName.isEmpty() )
schemaName = mSchemaName;
QString tableName( rsmd.getTableName( i ).c_str() );
QString tableName = QString::fromStdU16String( rsmd.getTableName( i ) );
if ( tableName.isEmpty() )
tableName = mTableName;
QgsHanaResultSetRef rsColumns = conn->getColumns( schemaName, tableName, fieldName );
Expand Down Expand Up @@ -1390,7 +1390,6 @@ QgsVectorLayerExporter::ExportError QgsHanaProvider::createEmptyLayer(
)
{
QgsDataSourceUri dsUri( uri );

QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
{
Expand Down
4 changes: 3 additions & 1 deletion src/providers/hana/qgshanaproviderconnection.cpp
Expand Up @@ -25,6 +25,8 @@
#include "qgsexception.h"
#include "qgssettings.h"

#include "odbc/PreparedStatement.h"

QgsHanaProviderConnection::QgsHanaProviderConnection( const QString &name )
: QgsAbstractDatabaseProviderConnection( name )
{
Expand Down Expand Up @@ -196,7 +198,7 @@ QList<QVariantList> QgsHanaProviderConnection::executeSql( const QString &sql )
try
{
PreparedStatementRef stmt = conn->prepareStatement( sql );
isQuery = stmt->getMetaData()->getColumnCount() > 0;
isQuery = stmt->getMetaDataUnicode()->getColumnCount() > 0;
}
catch ( const QgsHanaException &ex )
{
Expand Down
8 changes: 5 additions & 3 deletions src/providers/hana/qgshanaresultset.cpp
Expand Up @@ -21,20 +21,22 @@
#include <QString>

#include "odbc/Exception.h"
#include "odbc/PreparedStatement.h"
#include "odbc/Statement.h"

using namespace odbc;

QgsHanaResultSet::QgsHanaResultSet( ResultSetRef &&resultSet )
: mResultSet( std::move( resultSet ) )
, mMetadata( mResultSet->getMetaData() )
, mMetadata( mResultSet->getMetaDataUnicode() )
{
}

QgsHanaResultSetRef QgsHanaResultSet::create( StatementRef &stmt, const QString &sql )
{
try
{
QgsHanaResultSetRef ret( new QgsHanaResultSet( stmt->executeQuery( QgsHanaUtils::toQueryString( sql ) ) ) );
QgsHanaResultSetRef ret( new QgsHanaResultSet( stmt->executeQuery( QgsHanaUtils::toUtf16( sql ) ) ) );
return ret;
}
catch ( const Exception &ex )
Expand Down Expand Up @@ -165,7 +167,7 @@ QVariant QgsHanaResultSet::getValue( unsigned short columnIndex )
case SQLDataTypes::LongVarBinary:
return QgsHanaUtils::toVariant( mResultSet->getBinary( columnIndex ) );
default:
QgsDebugMsg( QStringLiteral( "Unhandled HANA type %1" ).arg( QString::fromStdString( mMetadata->getColumnTypeName( columnIndex ) ) ) );
QgsDebugMsg( QStringLiteral( "Unhandled HANA type %1" ).arg( QString::fromStdU16String( mMetadata->getColumnTypeName( columnIndex ) ) ) );
return QVariant();
}
}
Expand Down
10 changes: 4 additions & 6 deletions src/providers/hana/qgshanaresultset.h
Expand Up @@ -25,11 +25,9 @@
#include <QString>
#include <QVariant>

#include "odbc/DatabaseMetaData.h"
#include "odbc/PreparedStatement.h"
#include "odbc/Forwards.h"
#include "odbc/ResultSet.h"
#include "odbc/ResultSetMetaData.h"
#include "odbc/Statement.h"
#include "odbc/ResultSetMetaDataUnicode.h"

using namespace odbc;

Expand All @@ -56,11 +54,11 @@ class QgsHanaResultSet
QVariant getValue( unsigned short columnIndex );
QgsGeometry getGeometry( unsigned short columnIndex );

ResultSetMetaData &getMetadata() { return *mMetadata; }
ResultSetMetaDataUnicode &getMetadata() { return *mMetadata; }

private:
ResultSetRef mResultSet;
ResultSetMetaDataRef mMetadata;
ResultSetMetaDataUnicodeRef mMetadata;
std::vector<char> mBuffer;
};

Expand Down
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanautils.cpp
Expand Up @@ -266,7 +266,7 @@ QVariant QgsHanaUtils::toVariant( const Binary &value )
return QByteArray( value->data(), static_cast<int>( value->size() ) );
}

const char16_t *QgsHanaUtils::toQueryString( const QString &sql )
const char16_t *QgsHanaUtils::toUtf16( const QString &sql )
{
return reinterpret_cast<const char16_t *>( sql.utf16() );
}
Expand Down
2 changes: 1 addition & 1 deletion src/providers/hana/qgshanautils.h
Expand Up @@ -64,7 +64,7 @@ class QgsHanaUtils
return QVariant( *value );
}

static const char16_t *toQueryString( const QString &sql );
static const char16_t *toUtf16( const QString &sql );
static QgsWkbTypes::Type toWkbType( const odbc::String &type, const odbc::Int &hasZ, const odbc::Int &hasM );
static QVersionNumber toHANAVersion( const QString &dbVersion );
static int toPlanarSRID( int srid );
Expand Down

0 comments on commit 48ca958

Please sign in to comment.