24#include "moc_qgsqueryresultmodel.cpp"
26const int QgsQueryResultModel::FETCH_MORE_ROWS_COUNT = 400;
29 : QAbstractTableModel( parent )
30 , mQueryResult( queryResult )
31 , mColumns( queryResult.columns() )
33 qRegisterMetaType< QList<QList<QVariant>>>(
"QList<QList<QVariant>>" );
34 mWorker = std::make_unique<QgsQueryResultFetcher>( &mQueryResult );
35 mWorker->moveToThread( &mWorkerThread );
37 connect( mWorker.get(), &QgsQueryResultFetcher::rowsReady,
this, &QgsQueryResultModel::rowsReady );
38 connect( mWorker.get(), &QgsQueryResultFetcher::fetchingComplete,
this, &QgsQueryResultModel::fetchingComplete );
39 connect(
this, &QgsQueryResultModel::fetchMoreRows, mWorker.get(), &QgsQueryResultFetcher::fetchRows );
40 mWorkerThread.start();
41 if ( mQueryResult.rowCount() > 0 )
43 mRows.reserve( mQueryResult.rowCount() );
47void QgsQueryResultModel::rowsReady(
const QList<QList<QVariant>> &rows )
49 beginInsertRows( QModelIndex(), mRows.count(), mRows.count() + rows.count() - 1 );
55bool QgsQueryResultModel::canFetchMore(
const QModelIndex &parent )
const
57 if ( parent.isValid() )
59 return mQueryResult.rowCount() < 0 || mRows.length() < mQueryResult.rowCount();
63void QgsQueryResultModel::fetchMore(
const QModelIndex &parent )
65 if ( !parent.isValid() )
67 emit fetchingStarted();
68 emit fetchMoreRows( FETCH_MORE_ROWS_COUNT );
72void QgsQueryResultModel::cancel()
76 mWorker->stopFetching();
85QStringList QgsQueryResultModel::columns()
const
90QgsQueryResultModel::~QgsQueryResultModel()
94 mWorker->stopFetching();
100 emit fetchingComplete();
104int QgsQueryResultModel::rowCount(
const QModelIndex &parent )
const
106 if ( parent.isValid() )
108 return mRows.count();
111int QgsQueryResultModel::columnCount(
const QModelIndex &parent )
const
113 if ( parent.isValid() )
115 return mColumns.count();
118QVariant QgsQueryResultModel::data(
const QModelIndex &index,
int role )
const
120 if ( !index.isValid() || index.row() < 0 || index.column() >= mColumns.count() || index.row() >= mRows.count() )
125 case Qt::DisplayRole:
127 const QList<QVariant> result = mRows.at( index.row() );
128 if ( index.column() < result.count() )
130 const QVariant value = result.at( index.column() );
136 else if ( value.type() == QVariant::ByteArray )
150 const QList<QVariant> result = mRows.at( index.row() );
151 if ( index.column() < result.count() )
153 const QVariant value = result.at( index.column() );
165 case Qt::ForegroundRole:
167 const QList<QVariant> result = mRows.at( index.row() );
168 if ( index.column() < result.count() )
170 const QVariant value = result.at( index.column() );
174 return QColor( 128, 128, 128 );
180 case Qt::ToolTipRole:
182 const QList<QVariant> result = mRows.at( index.row() );
183 if ( index.column() < result.count() )
185 const QVariant value = result.at( index.column() );
204QVariant QgsQueryResultModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
206 if ( orientation == Qt::Orientation::Horizontal && section < mColumns.count() )
210 case Qt::ItemDataRole::DisplayRole:
211 case Qt::ItemDataRole::ToolTipRole:
212 return mColumns.at( section );
218 return QAbstractTableModel::headerData( section, orientation, role );
223const int QgsQueryResultFetcher::ROWS_BATCH_COUNT = 200;
225void QgsQueryResultFetcher::fetchRows(
long long maxRows )
227 long long rowCount { 0 };
228 QList<QList<QVariant>> newRows;
229 newRows.reserve( ROWS_BATCH_COUNT );
230 while ( mStopFetching == 0 && mQueryResult->hasNextRow() && ( maxRows < 0 || rowCount < maxRows ) )
232 newRows.append( mQueryResult->nextRow() );
234 if ( rowCount % ROWS_BATCH_COUNT == 0 && mStopFetching == 0 )
236 emit rowsReady( newRows );
241 if ( rowCount % ROWS_BATCH_COUNT && mStopFetching == 0 )
243 emit rowsReady( newRows );
246 emit fetchingComplete();
249void QgsQueryResultFetcher::stopFetching()
static QString nullRepresentation()
Returns the string used to represent the value NULL throughout QGIS.
static QString formatPreviewString(const QVariant &value, bool htmlOutput=true, int maximumPreviewLength=60)
Formats an expression result for friendly display to the user.
static QString representFileSize(qint64 bytes)
Returns the human size from bytes.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
The QueryResult class represents the result of a query executed by execSql().