Skip to content

Commit

Permalink
Use QgsHanaConnection::getColumnSrid instead QgsHanaProvider::readSrid
Browse files Browse the repository at this point in the history
  • Loading branch information
mrylov committed Dec 7, 2020
1 parent b172ae0 commit c2ca397
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 85 deletions.
121 changes: 61 additions & 60 deletions src/providers/hana/qgshanaconnection.cpp
Expand Up @@ -519,8 +519,8 @@ QVector<QgsHanaLayerProperty> QgsHanaConnection::getLayers(

void QgsHanaConnection::readLayerInfo( QgsHanaLayerProperty &layerProperty )
{
layerProperty.srid = getLayerSRID( layerProperty );
layerProperty.type = getLayerGeometryType( layerProperty );
layerProperty.srid = getColumnSrid( layerProperty.schemaName, layerProperty.tableName, layerProperty.geometryColName );
layerProperty.type = getColumnGeometryType( layerProperty.schemaName, layerProperty.tableName, layerProperty.geometryColName );
layerProperty.pkCols = getLayerPrimaryeKeys( layerProperty );
}

Expand Down Expand Up @@ -556,59 +556,6 @@ QVector<QgsHanaSchemaProperty> QgsHanaConnection::getSchemas( const QString &own
return list;
}

int QgsHanaConnection::getLayerSRID( const QgsHanaLayerProperty &layerProperty )
{
if ( layerProperty.geometryColName.isEmpty() )
return -1;

int srid = -1;

try
{
PreparedStatementRef stmt;
if ( !layerProperty.isView )
{
const char *sql = "SELECT SRS_ID FROM SYS.ST_GEOMETRY_COLUMNS "
"WHERE SCHEMA_NAME = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?";
stmt = mConnection->prepareStatement( sql );
stmt->setNString( 1, NString( layerProperty.schemaName.toStdU16String() ) );
stmt->setNString( 2, NString( layerProperty.tableName.toStdU16String() ) );
stmt->setNString( 3, NString( layerProperty.geometryColName.toStdU16String() ) );
}
else
{
QString sql = QStringLiteral( "SELECT %1.ST_SRID() FROM %2.%3 WHERE %1 IS NOT NULL LIMIT %4" )
.arg( QgsHanaUtils::quotedIdentifier( layerProperty.geometryColName ),
QgsHanaUtils::quotedIdentifier( layerProperty.schemaName ),
QgsHanaUtils::quotedIdentifier( layerProperty.tableName ),
QString::number( GEOMETRIES_SELECT_LIMIT ) );
stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
}

ResultSetRef rsSrid = stmt->executeQuery( );
while ( rsSrid->next() )
{
Int value = rsSrid->getInt( 1 );
if ( value.isNull() )
continue;
if ( srid == -1 )
srid = *value;
else if ( srid != *value )
{
srid = -1;
break;
}
}
rsSrid->close();
}
catch ( const Exception &ex )
{
throw QgsHanaException( ex.what() );
}

return srid;
}

QStringList QgsHanaConnection::getLayerPrimaryeKeys( const QgsHanaLayerProperty &layerProperty )
{
QStringList ret;
Expand Down Expand Up @@ -666,17 +613,17 @@ QStringList QgsHanaConnection::getLayerPrimaryeKeys( const QgsHanaLayerProperty
return ret;
}

QgsWkbTypes::Type QgsHanaConnection::getLayerGeometryType( const QgsHanaLayerProperty &layerProperty )
QgsWkbTypes::Type QgsHanaConnection::getColumnGeometryType( const QString &schemaName, const QString &tableName, const QString &columnName )
{
if ( layerProperty.geometryColName.isEmpty() )
if ( columnName.isEmpty() )
return QgsWkbTypes::NoGeometry;

QgsWkbTypes::Type ret = QgsWkbTypes::Unknown;
QString sql = QStringLiteral( "SELECT upper(%1.ST_GeometryType()), %1.ST_Is3D(), %1.ST_IsMeasured() FROM %2.%3 "
"WHERE %1 IS NOT NULL LIMIT %4" ).arg(
QgsHanaUtils::quotedIdentifier( layerProperty.geometryColName ),
QgsHanaUtils::quotedIdentifier( layerProperty.schemaName ),
QgsHanaUtils::quotedIdentifier( layerProperty.tableName ),
QgsHanaUtils::quotedIdentifier( columnName ),
QgsHanaUtils::quotedIdentifier( schemaName ),
QgsHanaUtils::quotedIdentifier( tableName ),
QString::number( GEOMETRIES_SELECT_LIMIT ) );

try
Expand Down Expand Up @@ -734,6 +681,60 @@ QString QgsHanaConnection::getColumnDataType( const QString &schemaName, const Q
return ret;
}

int QgsHanaConnection::getColumnSrid( const QString &schemaName, const QString &tableName, const QString &columnName )
{
if ( columnName.isEmpty() )
return -1;

auto getSrid = []( PreparedStatementRef & stmt )
{
int srid = -1;
ResultSetRef rsSrid = stmt->executeQuery( );
while ( rsSrid->next() )
{
Int value = rsSrid->getInt( 1 );
if ( value.isNull() )
continue;
if ( srid == -1 )
srid = *value;
else if ( srid != *value )
{
srid = -1;
break;
}
}
rsSrid->close();
return srid;
};

try
{
PreparedStatementRef stmt = mConnection->prepareStatement( "SELECT SRS_ID FROM SYS.ST_GEOMETRY_COLUMNS "
"WHERE SCHEMA_NAME = ? AND TABLE_NAME = ? AND COLUMN_NAME = ?" );
stmt->setNString( 1, NString( schemaName.toStdU16String() ) );
stmt->setNString( 2, NString( tableName.toStdU16String() ) );
stmt->setNString( 3, NString( columnName.toStdU16String() ) );
int srid = getSrid( stmt );

if ( srid == -1 )
{
QString sql = QStringLiteral( "SELECT %1.ST_SRID() FROM %2.%3 WHERE %1 IS NOT NULL LIMIT %4" )
.arg( QgsHanaUtils::quotedIdentifier( columnName ),
QgsHanaUtils::quotedIdentifier( schemaName ),
QgsHanaUtils::quotedIdentifier( tableName ),
QString::number( GEOMETRIES_SELECT_LIMIT ) );
stmt = mConnection->prepareStatement( QgsHanaUtils::toUtf16( sql ) );
srid = getSrid( stmt );
}

return srid;
}
catch ( const Exception &ex )
{
throw QgsHanaException( ex.what() );
}
}

QgsHanaResultSetRef QgsHanaConnection::getColumns( const QString &schemaName, const QString &tableName, const QString &fieldName )
{
try
Expand Down
4 changes: 2 additions & 2 deletions src/providers/hana/qgshanaconnection.h
Expand Up @@ -58,8 +58,9 @@ class QgsHanaConnection : public QObject
bool userTablesOnly = true );
void readLayerInfo( QgsHanaLayerProperty &layerProperty );
QVector<QgsHanaSchemaProperty> getSchemas( const QString &ownerName );
QgsWkbTypes::Type getLayerGeometryType( const QgsHanaLayerProperty &layerProperty );
QgsWkbTypes::Type getColumnGeometryType( const QString &schemaName, const QString &tableName, const QString &columnName );
QString getColumnDataType( const QString &schemaName, const QString &tableName, const QString &columnName );
int getColumnSrid( const QString &schemaName, const QString &tableName, const QString &columnName );
QgsHanaResultSetRef getColumns( const QString &schemaName, const QString &tableName, const QString &fieldName );

static QgsHanaConnection *createConnection( const QgsDataSourceUri &uri );
Expand All @@ -71,7 +72,6 @@ class QgsHanaConnection : public QObject
private:
QgsHanaConnection( odbc::ConnectionRef connection, const QgsDataSourceUri &uri );

int getLayerSRID( const QgsHanaLayerProperty &layerProperty );
QStringList getLayerPrimaryeKeys( const QgsHanaLayerProperty &layerProperty );

odbc::PreparedStatementRef createPreparedStatement( const QString &sql, const QVariantList &args );
Expand Down
25 changes: 2 additions & 23 deletions src/providers/hana/qgshanaprovider.cpp
Expand Up @@ -271,7 +271,7 @@ QgsHanaProvider::QgsHanaProvider(
throw QgsHanaException( tr( "Provider does not have enough permissions" ).toStdString().c_str() );

if ( mSrid < 0 )
mSrid = readSrid();
mSrid = conn->getColumnSrid( mSchemaName, mTableName, mGeometryColumn );

mDatabaseVersion = QgsHanaUtils::toHANAVersion( conn->getDatabaseVersion() );
readGeometryType();
Expand Down Expand Up @@ -1153,23 +1153,6 @@ bool QgsHanaProvider::isSrsRoundEarth( int srsId ) const
return roundEarth.toString() == QLatin1String( "TRUE" );
}

int QgsHanaProvider::readSrid()
{
if ( mGeometryColumn.isEmpty() )
return -1;

QString sql = QStringLiteral( "SELECT SRS_ID FROM SYS.ST_GEOMETRY_COLUMNS WHERE SCHEMA_NAME = ? AND TABLE_NAME = ?" );
QVariantList args = { mSchemaName, mTableName};
if ( !mGeometryColumn.isEmpty() )
{
sql += QStringLiteral( " AND COLUMN_NAME = ?" );
args.append( mGeometryColumn );
}
QgsHanaConnectionRef conn( mUri );
QVariant srid = conn->executeScalar( sql, args );
return srid.isNull() ? -1 : srid.toInt();
}

void QgsHanaProvider::readAttributeFields()
{
mAttributeFields.clear();
Expand Down Expand Up @@ -1293,12 +1276,8 @@ void QgsHanaProvider::readGeometryType()
if ( mGeometryColumn.isNull() || mGeometryColumn.isEmpty() )
mDetectedGeometryType = QgsWkbTypes::NoGeometry;

QgsHanaLayerProperty layerProperty;
layerProperty.tableName = mTableName;
layerProperty.schemaName = mSchemaName;
layerProperty.geometryColName = mGeometryColumn;
QgsHanaConnectionRef conn( mUri );
mDetectedGeometryType = conn->getLayerGeometryType( layerProperty );
mDetectedGeometryType = conn->getColumnGeometryType( mSchemaName, mTableName, mGeometryColumn );
}

void QgsHanaProvider::readMetadata()
Expand Down

0 comments on commit c2ca397

Please sign in to comment.