Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement QgsAbstractDatabaseProviderConnection::nativeTypes in HANA …
…provider
  • Loading branch information
mrylov committed Dec 7, 2020
1 parent 34625cf commit 3648f23
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 27 deletions.
28 changes: 28 additions & 0 deletions src/providers/hana/qgshanaconnection.cpp
Expand Up @@ -345,6 +345,34 @@ void QgsHanaConnection::rollback()
}
}

QList<QgsVectorDataProvider::NativeType> QgsHanaConnection::getNativeTypes()
{
return QList<QgsVectorDataProvider::NativeType>()
// boolean
<< QgsVectorDataProvider::NativeType( tr( "Boolean" ), QStringLiteral( "BOOLEAN" ), QVariant::Bool, -1, -1, -1, -1 )
// integer types
<< QgsVectorDataProvider::NativeType( tr( "8 bytes integer" ), QStringLiteral( "BIGINT" ), QVariant::LongLong, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "4 bytes integer" ), QStringLiteral( "INTEGER" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "2 bytes integer" ), QStringLiteral( "SMALLINT" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "1 byte integer" ), QStringLiteral( "TINYINT" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (DECIMAL)" ), QStringLiteral( "DECIMAL" ), QVariant::Double, 1, 31, 0, 31 )
// floating point
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (REAL)" ), QStringLiteral( "REAL" ), QVariant::Double )
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (DOUBLE)" ), QStringLiteral( "DOUBLE" ), QVariant::Double )
// date/time types
<< QgsVectorDataProvider::NativeType( tr( "Date" ), QStringLiteral( "DATE" ), QVariant::Date, -1, -1, -1, -1 )
<< QgsVectorDataProvider::NativeType( tr( "Time" ), QStringLiteral( "TIME" ), QVariant::Time, -1, -1, -1, -1 )
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), QStringLiteral( "TIMESTAMP" ), QVariant::DateTime, -1, -1, -1, -1 )
// string types
<< QgsVectorDataProvider::NativeType( tr( "Text, variable length (VARCHAR)" ), QStringLiteral( "VARCHAR" ), QVariant::String, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Unicode text, variable length (NVARCHAR)" ), QStringLiteral( "NVARCHAR" ), QVariant::String, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Text, variable length large object (CLOB)" ), QStringLiteral( "CLOB" ), QVariant::String )
<< QgsVectorDataProvider::NativeType( tr( "Unicode text, variable length large object (NCLOB)" ), QStringLiteral( "NCLOB" ), QVariant::String )
// binary types
<< QgsVectorDataProvider::NativeType( tr( "Binary object (VARBINARY)" ), QStringLiteral( "VARBINARY" ), QVariant::ByteArray, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Binary object (BLOB)" ), QStringLiteral( "BLOB" ), QVariant::ByteArray );
}

const QString &QgsHanaConnection::getDatabaseVersion()
{
if ( mDatabaseVersion.isEmpty() )
Expand Down
6 changes: 6 additions & 0 deletions src/providers/hana/qgshanaconnection.h
Expand Up @@ -22,6 +22,7 @@
#include "qgshanatablemodel.h"
#include "qgshanaresultset.h"
#include "qgslogger.h"
#include "qgsvectordataprovider.h"

#include "odbc/Forwards.h"

Expand Down Expand Up @@ -49,6 +50,11 @@ class QgsHanaConnection : public QObject
void commit();
void rollback();

/**
* Returns a list of supported native types for this connection.
* \since QGIS 3.16
*/
QList<QgsVectorDataProvider::NativeType> getNativeTypes();
const QString &getDatabaseVersion();
const QString &getUserName();
QgsCoordinateReferenceSystem getCrs( int srid );
Expand Down
29 changes: 2 additions & 27 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -293,39 +293,14 @@ QgsHanaProvider::QgsHanaProvider(
readAttributeFields();
readSrsInformation();
readMetadata();

setNativeTypes( conn->getNativeTypes() );
}
catch ( const QgsHanaException & )
{
return;
}

//fill type names into sets
setNativeTypes( QList< NativeType >()
// boolean
<< QgsVectorDataProvider::NativeType( tr( "Boolean" ), QStringLiteral( "BOOLEAN" ), QVariant::Bool, -1, -1, -1, -1 )
// integer types
<< QgsVectorDataProvider::NativeType( tr( "8 bytes integer" ), QStringLiteral( "BIGINT" ), QVariant::LongLong, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "4 bytes integer" ), QStringLiteral( "INTEGER" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "2 bytes integer" ), QStringLiteral( "SMALLINT" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "1 byte integer" ), QStringLiteral( "TINYINT" ), QVariant::Int, -1, -1, 0, 0 )
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (DECIMAL)" ), QStringLiteral( "DECIMAL" ), QVariant::Double, 1, 31, 0, 31 )
// floating point
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (REAL)" ), QStringLiteral( "REAL" ), QVariant::Double )
<< QgsVectorDataProvider::NativeType( tr( "Decimal number (DOUBLE)" ), QStringLiteral( "DOUBLE" ), QVariant::Double )
// date/time types
<< QgsVectorDataProvider::NativeType( tr( "Date" ), QStringLiteral( "DATE" ), QVariant::Date, -1, -1, -1, -1 )
<< QgsVectorDataProvider::NativeType( tr( "Time" ), QStringLiteral( "TIME" ), QVariant::Time, -1, -1, -1, -1 )
<< QgsVectorDataProvider::NativeType( tr( "Date & Time" ), QStringLiteral( "TIMESTAMP" ), QVariant::DateTime, -1, -1, -1, -1 )
// string types
<< QgsVectorDataProvider::NativeType( tr( "Text, variable length (VARCHAR)" ), QStringLiteral( "VARCHAR" ), QVariant::String, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Unicode text, variable length (NVARCHAR)" ), QStringLiteral( "NVARCHAR" ), QVariant::String, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Text, variable length large object (CLOB)" ), QStringLiteral( "CLOB" ), QVariant::String )
<< QgsVectorDataProvider::NativeType( tr( "Unicode text, variable length large object (NCLOB)" ), QStringLiteral( "NCLOB" ), QVariant::String )
// binary types
<< QgsVectorDataProvider::NativeType( tr( "Binary object (VARBINARY)" ), QStringLiteral( "VARBINARY" ), QVariant::ByteArray, 1, 5000 )
<< QgsVectorDataProvider::NativeType( tr( "Binary object (BLOB)" ), QStringLiteral( "BLOB" ), QVariant::ByteArray )
);

mValid = true;

QgsDebugMsgLevel( QStringLiteral( "Connection info is %1" ).arg( QgsHanaUtils::connectionInfo( mUri ) ), 4 );
Expand Down
15 changes: 15 additions & 0 deletions src/providers/hana/qgshanaproviderconnection.cpp
Expand Up @@ -30,6 +30,7 @@
QgsHanaProviderConnection::QgsHanaProviderConnection( const QString &name )
: QgsAbstractDatabaseProviderConnection( name )
{
mProviderKey = QStringLiteral( "hana" );
QgsHanaSettings settings( name, true );
setUri( settings.toDataSourceUri().uri() );
setCapabilities();
Expand All @@ -38,6 +39,7 @@ QgsHanaProviderConnection::QgsHanaProviderConnection( const QString &name )
QgsHanaProviderConnection::QgsHanaProviderConnection( const QString &uri, const QVariantMap &configuration ):
QgsAbstractDatabaseProviderConnection( QgsHanaUtils::connectionInfo( QgsDataSourceUri( uri ) ), configuration )
{
mProviderKey = QStringLiteral( "hana" );
setCapabilities();
}

Expand Down Expand Up @@ -360,3 +362,16 @@ QIcon QgsHanaProviderConnection::icon() const
{
return QgsApplication::getThemeIcon( QStringLiteral( "mIconHana.svg" ) );
}

QList<QgsVectorDataProvider::NativeType> QgsHanaProviderConnection::nativeTypes() const
{
const QgsDataSourceUri dsUri { uri() };
QgsHanaConnectionRef conn( dsUri );
if ( conn.isNull() )
throw QgsProviderConnectionException( QObject::tr( "Connection failed: %1" ).arg( uri() ) );

QList<QgsVectorDataProvider::NativeType> types = conn->getNativeTypes();
if ( types.isEmpty() )
throw QgsProviderConnectionException( QObject::tr( "Error retrieving native types for connection %1" ).arg( uri() ) );
return types;
}
1 change: 1 addition & 0 deletions src/providers/hana/qgshanaproviderconnection.h
Expand Up @@ -47,6 +47,7 @@ class QgsHanaProviderConnection : public QgsAbstractDatabaseProviderConnection
void store( const QString &name ) const override;
void remove( const QString &name ) const override;
QIcon icon() const override;
QList<QgsVectorDataProvider::NativeType> nativeTypes() const override;

private:
QList<QVariantList> executeSqlQuery( QgsHanaConnection &conn, const QString &sql ) const;
Expand Down

0 comments on commit 3648f23

Please sign in to comment.