5#include "private/qsqlcachedresult_p.h"
8#include <QtSql/private/qsqldriver_p.h>
13
14
15
16
17
18
19
20
21
22
26void QSqlCachedResultPrivate::cleanup()
34void QSqlCachedResultPrivate::init(
int count,
bool fo)
44 cache.resize(initial_cache_size * count);
48int QSqlCachedResultPrivate::nextIndex()
52 int newIdx = rowCacheEnd;
53 if (newIdx + colCount > cache.size())
54 cache.resize(qMin(cache.size() * 2, cache.size() + 10000));
55 rowCacheEnd += colCount;
60bool QSqlCachedResultPrivate::canSeek(
int i)
const
62 if (forwardOnly || i < 0)
64 return rowCacheEnd >= (i + 1) * colCount;
67void QSqlCachedResultPrivate::revertLast()
71 rowCacheEnd -= colCount;
74inline int QSqlCachedResultPrivate::cacheCount()
const
76 Q_ASSERT(!forwardOnly);
78 return rowCacheEnd / colCount;
83QSqlCachedResult::QSqlCachedResult(QSqlCachedResultPrivate &d)
88void QSqlCachedResult::init(
int colCount)
90 Q_D(QSqlCachedResult);
91 d->init(colCount, isForwardOnly());
94bool QSqlCachedResult::fetch(
int i)
96 Q_D(QSqlCachedResult);
97 if ((!isActive()) || (i < 0))
101 if (d->forwardOnly) {
103 if (at() > i || at() == QSql::AfterLastRow)
105 while(at() < i - 1) {
106 if (!gotoNext(d->cache, -1))
110 if (!gotoNext(d->cache, 0))
119 if (d->rowCacheEnd > 0)
120 setAt(d->cacheCount());
121 while (at() < i + 1) {
133bool QSqlCachedResult::fetchNext()
135 Q_D(QSqlCachedResult);
136 if (d->canSeek(at() + 1)) {
143bool QSqlCachedResult::fetchPrevious()
145 return fetch(at() - 1);
148bool QSqlCachedResult::fetchFirst()
150 Q_D(QSqlCachedResult);
151 if (d->forwardOnly && at() != QSql::BeforeFirstRow) {
161bool QSqlCachedResult::fetchLast()
163 Q_D(QSqlCachedResult);
168 return fetch(d->cacheCount() - 1);
174 if (d->forwardOnly && at() == QSql::AfterLastRow) {
182QVariant QSqlCachedResult::data(
int i)
184 Q_D(
const QSqlCachedResult);
185 int idx = d->forwardOnly ? i : at() * d->colCount + i;
186 if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd)
189 return d->cache.at(idx);
192bool QSqlCachedResult::isNull(
int i)
194 Q_D(
const QSqlCachedResult);
195 int idx = d->forwardOnly ? i : at() * d->colCount + i;
196 if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd)
199 return d->cache.at(idx).isNull();
202void QSqlCachedResult::cleanup()
204 Q_D(QSqlCachedResult);
205 setAt(QSql::BeforeFirstRow);
210void QSqlCachedResult::clearValues()
212 Q_D(QSqlCachedResult);
213 setAt(QSql::BeforeFirstRow);
218bool QSqlCachedResult::cacheNext()
220 Q_D(QSqlCachedResult);
224 if (isForwardOnly()) {
225 d->cache.resize(d->colCount);
228 if (!gotoNext(d->cache, d->nextIndex())) {
237int QSqlCachedResult::colCount()
const
239 Q_D(
const QSqlCachedResult);
243QSqlCachedResult::ValueCache &QSqlCachedResult::cache()
245 Q_D(QSqlCachedResult);
249void QSqlCachedResult::virtual_hook(
int id,
void *data)
251 QSqlResult::virtual_hook(id, data);
254void QSqlCachedResult::detachFromResultSet()
259void QSqlCachedResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy)
261 QSqlResult::setNumericalPrecisionPolicy(policy);
static QT_BEGIN_NAMESPACE constexpr qsizetype initial_cache_size