Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsqueryresultmodel.cpp - QgsQueryResultModel 3 : : 4 : : --------------------- 5 : : begin : 24.12.2020 6 : : copyright : (C) 2020 by Alessandro Pasotti 7 : : email : elpaso@itopen.it 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #include "qgsqueryresultmodel.h" 17 : : 18 : 0 : QgsQueryResultModel::QgsQueryResultModel( const QgsAbstractDatabaseProviderConnection::QueryResult &queryResult, QObject *parent ) 19 : 0 : : QAbstractTableModel( parent ) 20 : 0 : , mQueryResult( queryResult ) 21 : 0 : , mColumns( queryResult.columns() ) 22 : 0 : { 23 : 0 : qRegisterMetaType< QList<QList<QVariant>>>( "QList<QList<QVariant>>" ); 24 : 0 : if ( mQueryResult.hasNextRow() ) 25 : : { 26 : 0 : mWorker = new QgsQueryResultFetcher( &mQueryResult ); 27 : 0 : mWorker->moveToThread( &mWorkerThread ); 28 : 0 : connect( &mWorkerThread, &QThread::started, mWorker, &QgsQueryResultFetcher::fetchRows ); 29 : 0 : connect( mWorker, &QgsQueryResultFetcher::rowsReady, this, &QgsQueryResultModel::rowsReady ); 30 : 0 : mWorkerThread.start(); 31 : 0 : } 32 : 0 : } 33 : : 34 : 0 : void QgsQueryResultModel::rowsReady( const QList<QList<QVariant>> &rows ) 35 : : { 36 : 0 : beginInsertRows( QModelIndex(), mRows.count( ), mRows.count( ) + rows.count() - 1 ); 37 : 0 : mRows.append( rows ); 38 : 0 : endInsertRows(); 39 : 0 : } 40 : : 41 : 0 : void QgsQueryResultModel::cancel() 42 : : { 43 : 0 : if ( mWorker ) 44 : : { 45 : 0 : mWorker->stopFetching(); 46 : 0 : } 47 : 0 : } 48 : : 49 : 0 : QgsQueryResultModel::~QgsQueryResultModel() 50 : 0 : { 51 : 0 : if ( mWorker ) 52 : : { 53 : 0 : mWorker->stopFetching(); 54 : 0 : mWorkerThread.quit(); 55 : 0 : mWorkerThread.wait(); 56 : 0 : mWorker->deleteLater(); 57 : 0 : } 58 : 0 : } 59 : : 60 : 0 : int QgsQueryResultModel::rowCount( const QModelIndex &parent ) const 61 : : { 62 : 0 : if ( parent.isValid() ) 63 : 0 : return 0; 64 : 0 : return mRows.count(); 65 : 0 : } 66 : : 67 : 0 : int QgsQueryResultModel::columnCount( const QModelIndex &parent ) const 68 : : { 69 : 0 : if ( parent.isValid() ) 70 : 0 : return 0; 71 : 0 : return mColumns.count(); 72 : 0 : } 73 : : 74 : 0 : QVariant QgsQueryResultModel::data( const QModelIndex &index, int role ) const 75 : : { 76 : 0 : if ( !index.isValid() || index.row() < 0 || index.column() >= mColumns.count() || 77 : 0 : index.row() >= mRows.count( ) ) 78 : 0 : return QVariant(); 79 : : 80 : 0 : switch ( role ) 81 : : { 82 : : case Qt::DisplayRole: 83 : : { 84 : 0 : const QList<QVariant> result = mRows.at( index.row() ); 85 : 0 : if ( index.column() < result.count( ) ) 86 : : { 87 : 0 : return result.at( index.column() ); 88 : : } 89 : 0 : break; 90 : 0 : } 91 : : } 92 : 0 : return QVariant(); 93 : 0 : } 94 : : 95 : 0 : QVariant QgsQueryResultModel::headerData( int section, Qt::Orientation orientation, int role ) const 96 : : { 97 : 0 : if ( orientation == Qt::Orientation::Horizontal && role == Qt::ItemDataRole::DisplayRole && section < mColumns.count() ) 98 : : { 99 : 0 : return mColumns.at( section ); 100 : : } 101 : 0 : return QAbstractTableModel::headerData( section, orientation, role ); 102 : 0 : } 103 : : 104 : : ///@cond private 105 : : 106 : : const int QgsQueryResultFetcher::ROWS_TO_FETCH = 200; 107 : : 108 : 0 : void QgsQueryResultFetcher::fetchRows() 109 : : { 110 : 0 : qlonglong rowCount { 0 }; 111 : 0 : QList<QList<QVariant>> newRows; 112 : 0 : while ( mStopFetching == 0 && mQueryResult->hasNextRow() ) 113 : 0 : { 114 : 0 : newRows.append( mQueryResult->nextRow() ); 115 : 0 : ++rowCount; 116 : 0 : if ( rowCount % ROWS_TO_FETCH == 0 && mStopFetching == 0 ) 117 : : { 118 : 0 : emit rowsReady( newRows ); 119 : 0 : newRows.clear(); 120 : 0 : } 121 : : } 122 : : 123 : 0 : if ( rowCount % ROWS_TO_FETCH && mStopFetching == 0 ) 124 : : { 125 : 0 : emit rowsReady( newRows ); 126 : 0 : } 127 : 0 : } 128 : : 129 : 0 : void QgsQueryResultFetcher::stopFetching() 130 : : { 131 : 0 : mStopFetching = 1; 132 : 0 : } 133 : : 134 : : 135 : : ///@endcond private