Skip to content

Commit

Permalink
add execute sql with iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
troopa81 authored and nyalldawson committed Jan 29, 2021
1 parent 1d7bfe2 commit d0491b6
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 22 deletions.
67 changes: 48 additions & 19 deletions src/providers/oracle/qgsoracleproviderconnection.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgsapplication.h"

#include <QSqlRecord>
#include <QSqlField>

const QStringList CONFIGURATION_PARAMETERS
{
Expand Down Expand Up @@ -152,15 +153,11 @@ QList<QgsVectorDataProvider::NativeType> QgsOracleProviderConnection::nativeType
return types;
}

QList<QVariantList> QgsOracleProviderConnection::executeSqlPrivate( const QString &sql, QgsFeedback *feedback ) const
QgsAbstractDatabaseProviderConnection::QueryResult QgsOracleProviderConnection::executeSqlPrivate( const QString &sql, QgsFeedback *feedback ) const
{
QList<QVariantList> results;

// Check feedback first!
if ( feedback && feedback->isCanceled() )
{
return results;
}
return QgsAbstractDatabaseProviderConnection::QueryResult();

QgsPoolOracleConn pconn( QgsDataSourceUri{ uri() }.connectionInfo( false ) );
if ( !pconn.get() )
Expand All @@ -169,9 +166,7 @@ QList<QVariantList> QgsOracleProviderConnection::executeSqlPrivate( const QStrin
}

if ( feedback && feedback->isCanceled() )
{
return results;
}
return QgsAbstractDatabaseProviderConnection::QueryResult();

QSqlQuery qry( *pconn.get() );
if ( !qry.exec( sql ) )
Expand All @@ -181,22 +176,50 @@ QList<QVariantList> QgsOracleProviderConnection::executeSqlPrivate( const QStrin
qry.lastError().text() ) );
}

const int nbFields = qry.record().count();
while ( qry.next() )
if ( feedback && feedback->isCanceled() )
return QgsAbstractDatabaseProviderConnection::QueryResult();

if ( qry.isActive() )
{
if ( feedback && feedback->isCanceled() )
const QSqlRecord rec { qry.record() };
const int numCols { rec.count() };
auto iterator = std::make_shared<QgsOracleProviderResultIterator>( numCols, qry );
QgsAbstractDatabaseProviderConnection::QueryResult results( iterator );
results.setRowCount( qry.size() );
for ( int idx = 0; idx < numCols; ++idx )
{
return results;
results.appendColumn( rec.field( idx ).name() );
}
iterator->nextRow();
return results;
}

QVariantList cols;
for ( int i = 0; i < nbFields; i++ )
cols << qry.value( i );
return QgsAbstractDatabaseProviderConnection::QueryResult();
}

results << cols;
}
QVariantList QgsOracleProviderResultIterator::nextRow()
{
const QVariantList currentRow( mNextRow );
mNextRow = nextRowPrivate();
return currentRow;
}

return results;
bool QgsOracleProviderResultIterator::hasNextRow() const
{
return ! mNextRow.isEmpty();
}

QVariantList QgsOracleProviderResultIterator::nextRowPrivate()
{
QVariantList row;
if ( mQuery.next() )
{
for ( int col = 0; col < mColumnCount; ++col )
{
row.push_back( mQuery.value( col ) );
}
}
return row;
}

void QgsOracleProviderConnection::createVectorTable( const QString &schema,
Expand Down Expand Up @@ -326,3 +349,9 @@ void QgsOracleProviderConnection::dropVectorTable( const QString &schema, const
.arg( QgsOracleConn::quotedIdentifier( schema ) )
.arg( QgsOracleConn::quotedIdentifier( name ) ) );
}

QgsAbstractDatabaseProviderConnection::QueryResult QgsOracleProviderConnection::execSql( const QString &sql, QgsFeedback *feedback ) const
{
checkCapability( Capability::ExecuteSql );
return executeSqlPrivate( sql, feedback );
}
25 changes: 24 additions & 1 deletion src/providers/oracle/qgsoracleproviderconnection.h
Expand Up @@ -17,6 +17,28 @@
#define QGSORACLEPROVIDERCONNECTION_H
#include "qgsabstractdatabaseproviderconnection.h"

#include <QSqlQuery>

struct QgsOracleProviderResultIterator: public QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator
{

QgsOracleProviderResultIterator( int columnCount, const QSqlQuery &query )
: mColumnCount( columnCount )
, mQuery( query )
{}

QVariantList nextRow() override;
bool hasNextRow() const override;

private:

int mColumnCount = 0;
QSqlQuery mQuery;
QVariantList mNextRow;

QVariantList nextRowPrivate();

};

class QgsOracleProviderConnection : public QgsAbstractDatabaseProviderConnection

Expand All @@ -38,6 +60,7 @@ class QgsOracleProviderConnection : public QgsAbstractDatabaseProviderConnection
QString tableUri( const QString &schema, const QString &name ) const override;
void dropVectorTable( const QString &schema, const QString &name ) const override;

QgsAbstractDatabaseProviderConnection::QueryResult execSql( const QString &sql, QgsFeedback *feedback = nullptr ) const override;
QList<QgsAbstractDatabaseProviderConnection::TableProperty> tables( const QString &schema,
const TableFlags &flags = TableFlags() ) const override;
void store( const QString &name ) const override;
Expand All @@ -46,7 +69,7 @@ class QgsOracleProviderConnection : public QgsAbstractDatabaseProviderConnection

private:

QList<QVariantList> executeSqlPrivate( const QString &sql, QgsFeedback *feedback = nullptr ) const;
QgsAbstractDatabaseProviderConnection::QueryResult executeSqlPrivate( const QString &sql, QgsFeedback *feedback = nullptr ) const;
void setDefaultCapabilities();
};

Expand Down
4 changes: 2 additions & 2 deletions tests/src/python/test_qgsproviderconnection_base.py
Expand Up @@ -141,6 +141,7 @@ def _test_operations(self, md, conn):
self.assertFalse('myUtf8\U0001f604NewSchema' in schemas)

# Table operations
schema = None
if (capabilities & QgsAbstractDatabaseProviderConnection.CreateVectorTable
and capabilities & QgsAbstractDatabaseProviderConnection.Tables
and capabilities & QgsAbstractDatabaseProviderConnection.DropVectorTable):
Expand Down Expand Up @@ -220,9 +221,8 @@ def _test_operations(self, md, conn):
self.assertTrue(table_property.flags() & QgsAbstractDatabaseProviderConnection.Aspatial)

# Check executeSql
has_schema = capabilities & QgsAbstractDatabaseProviderConnection.Schemas
if capabilities & QgsAbstractDatabaseProviderConnection.ExecuteSql:
if has_schema:
if schema:
table = "\"%s\".\"myNewAspatialTable\"" % schema
else:
table = 'myNewAspatialTable'
Expand Down

0 comments on commit d0491b6

Please sign in to comment.