| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtSql module of the Qt Toolkit. | - |
| 7 | ** | - |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
| 9 | ** Commercial License Usage | - |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
| 11 | ** accordance with the commercial license agreement provided with the | - |
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - |
| 13 | ** a written agreement between you and Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
| 16 | ** | - |
| 17 | ** GNU Lesser General Public License Usage | - |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
| 19 | ** General Public License version 2.1 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include "qsqlresult.h" | - |
| 43 | | - |
| 44 | #include "qvariant.h" | - |
| 45 | #include "qhash.h" | - |
| 46 | #include "qregexp.h" | - |
| 47 | #include "qsqlerror.h" | - |
| 48 | #include "qsqlfield.h" | - |
| 49 | #include "qsqlrecord.h" | - |
| 50 | #include "qvector.h" | - |
| 51 | #include "qsqldriver.h" | - |
| 52 | #include "qpointer.h" | - |
| 53 | #include "qsqlresult_p.h" | - |
| 54 | #include <QDebug> | - |
| 55 | | - |
| 56 | QT_BEGIN_NAMESPACE | - |
| 57 | | - |
| 58 | QString QSqlResultPrivate::holderAt(int index) const | - |
| 59 | { | - |
| 60 | return holders.size() > index ? holders.at(index).holderName : fieldSerial(index); executed: return holders.size() > index ? holders.at(index).holderName : fieldSerial(index);Execution Count:136 | 136 |
| 61 | } | - |
| 62 | | - |
| 63 | // return a unique id for bound names | - |
| 64 | QString QSqlResultPrivate::fieldSerial(int i) | - |
| 65 | { | - |
| 66 | ushort arr[] = { ':', 'f', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; executed (the execution status of this line is deduced): ushort arr[] = { ':', 'f', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | - |
| 67 | ushort *ptr = &arr[1]; executed (the execution status of this line is deduced): ushort *ptr = &arr[1]; | - |
| 68 | | - |
| 69 | while (i > 0) { evaluated: i > 0| yes Evaluation Count:116817 | yes Evaluation Count:233566 |
| 116817-233566 |
| 70 | *(++ptr) = 'a' + i % 16; executed (the execution status of this line is deduced): *(++ptr) = 'a' + i % 16; | - |
| 71 | i >>= 4; executed (the execution status of this line is deduced): i >>= 4; | - |
| 72 | } executed: }Execution Count:116817 | 116817 |
| 73 | | - |
| 74 | return QString(reinterpret_cast<const QChar *>(arr), int(ptr - arr) + 1); executed: return QString(reinterpret_cast<const QChar *>(arr), int(ptr - arr) + 1);Execution Count:233566 | 233566 |
| 75 | } | - |
| 76 | | - |
| 77 | static bool qIsAlnum(QChar ch) | - |
| 78 | { | - |
| 79 | uint u = uint(ch.unicode()); executed (the execution status of this line is deduced): uint u = uint(ch.unicode()); | - |
| 80 | // matches [a-zA-Z0-9_] | - |
| 81 | return u - 'a' < 26 || u - 'A' < 26 || u - '0' < 10 || u == '_'; executed: return u - 'a' < 26 || u - 'A' < 26 || u - '0' < 10 || u == '_';Execution Count:86 | 86 |
| 82 | } | - |
| 83 | | - |
| 84 | QString QSqlResultPrivate::positionalToNamedBinding(const QString &query, QString (fieldSerialFunc)(int idx)) | - |
| 85 | { | - |
| 86 | int n = query.size(); executed (the execution status of this line is deduced): int n = query.size(); | - |
| 87 | | - |
| 88 | QString result; executed (the execution status of this line is deduced): QString result; | - |
| 89 | result.reserve(n * 5 / 4); executed (the execution status of this line is deduced): result.reserve(n * 5 / 4); | - |
| 90 | QChar closingQuote; executed (the execution status of this line is deduced): QChar closingQuote; | - |
| 91 | int count = 0; executed (the execution status of this line is deduced): int count = 0; | - |
| 92 | | - |
| 93 | for (int i = 0; i < n; ++i) { evaluated: i < n| yes Evaluation Count:253 | yes Evaluation Count:13 |
| 13-253 |
| 94 | QChar ch = query.at(i); executed (the execution status of this line is deduced): QChar ch = query.at(i); | - |
| 95 | if (!closingQuote.isNull()) { evaluated: !closingQuote.isNull()| yes Evaluation Count:38 | yes Evaluation Count:215 |
| 38-215 |
| 96 | if (ch == closingQuote) { evaluated: ch == closingQuote| yes Evaluation Count:16 | yes Evaluation Count:22 |
| 16-22 |
| 97 | if (closingQuote == QLatin1Char(']') evaluated: closingQuote == QLatin1Char(']')| yes Evaluation Count:8 | yes Evaluation Count:8 |
| 8 |
| 98 | && i + 1 < n && query.at(i + 1) == closingQuote) { evaluated: i + 1 < n| yes Evaluation Count:3 | yes Evaluation Count:5 |
partially evaluated: query.at(i + 1) == closingQuote| yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-5 |
| 99 | // consume the extra character. don't close. | - |
| 100 | ++i; executed (the execution status of this line is deduced): ++i; | - |
| 101 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 102 | } else { executed: }Execution Count:3 | 3 |
| 103 | closingQuote = QChar(); executed (the execution status of this line is deduced): closingQuote = QChar(); | - |
| 104 | } executed: }Execution Count:13 | 13 |
| 105 | } | - |
| 106 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 107 | } else { executed: }Execution Count:38 | 38 |
| 108 | if (ch == QLatin1Char('?')) { evaluated: ch == QLatin1Char('?')| yes Evaluation Count:10 | yes Evaluation Count:205 |
| 10-205 |
| 109 | result += fieldSerialFunc(count++); executed (the execution status of this line is deduced): result += fieldSerialFunc(count++); | - |
| 110 | } else { executed: }Execution Count:10 | 10 |
| 111 | if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`')) evaluated: ch == QLatin1Char('\'')| yes Evaluation Count:5 | yes Evaluation Count:200 |
evaluated: ch == QLatin1Char('"')| yes Evaluation Count:3 | yes Evaluation Count:197 |
partially evaluated: ch == QLatin1Char('`')| no Evaluation Count:0 | yes Evaluation Count:197 |
| 0-200 |
| 112 | closingQuote = ch; executed: closingQuote = ch;Execution Count:8 | 8 |
| 113 | else if (ch == QLatin1Char('[')) evaluated: ch == QLatin1Char('[')| yes Evaluation Count:5 | yes Evaluation Count:192 |
| 5-192 |
| 114 | closingQuote = QLatin1Char(']'); executed: closingQuote = QLatin1Char(']');Execution Count:5 | 5 |
| 115 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 116 | } executed: }Execution Count:205 | 205 |
| 117 | } | - |
| 118 | } | - |
| 119 | result.squeeze(); executed (the execution status of this line is deduced): result.squeeze(); | - |
| 120 | return result; executed: return result;Execution Count:13 | 13 |
| 121 | } | - |
| 122 | | - |
| 123 | QString QSqlResultPrivate::namedToPositionalBinding(const QString &query) | - |
| 124 | { | - |
| 125 | int n = query.size(); executed (the execution status of this line is deduced): int n = query.size(); | - |
| 126 | | - |
| 127 | QString result; executed (the execution status of this line is deduced): QString result; | - |
| 128 | result.reserve(n); executed (the execution status of this line is deduced): result.reserve(n); | - |
| 129 | QChar closingQuote; executed (the execution status of this line is deduced): QChar closingQuote; | - |
| 130 | int count = 0; executed (the execution status of this line is deduced): int count = 0; | - |
| 131 | int i = 0; executed (the execution status of this line is deduced): int i = 0; | - |
| 132 | | - |
| 133 | while (i < n) { evaluated: i < n| yes Evaluation Count:12759 | yes Evaluation Count:247 |
| 247-12759 |
| 134 | QChar ch = query.at(i); executed (the execution status of this line is deduced): QChar ch = query.at(i); | - |
| 135 | if (!closingQuote.isNull()) { evaluated: !closingQuote.isNull()| yes Evaluation Count:1302 | yes Evaluation Count:11457 |
| 1302-11457 |
| 136 | if (ch == closingQuote) { evaluated: ch == closingQuote| yes Evaluation Count:244 | yes Evaluation Count:1058 |
| 244-1058 |
| 137 | if (closingQuote == QLatin1Char(']') evaluated: closingQuote == QLatin1Char(']')| yes Evaluation Count:10 | yes Evaluation Count:234 |
| 10-234 |
| 138 | && i + 1 < n && query.at(i + 1) == closingQuote) { evaluated: i + 1 < n| yes Evaluation Count:3 | yes Evaluation Count:7 |
partially evaluated: query.at(i + 1) == closingQuote| yes Evaluation Count:3 | no Evaluation Count:0 |
| 0-7 |
| 139 | // consume the extra character. don't close. | - |
| 140 | ++i; executed (the execution status of this line is deduced): ++i; | - |
| 141 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 142 | } else { executed: }Execution Count:3 | 3 |
| 143 | closingQuote = QChar(); executed (the execution status of this line is deduced): closingQuote = QChar(); | - |
| 144 | } executed: }Execution Count:241 | 241 |
| 145 | } | - |
| 146 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 147 | ++i; executed (the execution status of this line is deduced): ++i; | - |
| 148 | } else { executed: }Execution Count:1302 | 1302 |
| 149 | if (ch == QLatin1Char(':') evaluated: ch == QLatin1Char(':')| yes Evaluation Count:30 | yes Evaluation Count:11427 |
| 30-11427 |
| 150 | && (i == 0 || query.at(i - 1) != QLatin1Char(':')) partially evaluated: i == 0| no Evaluation Count:0 | yes Evaluation Count:30 |
partially evaluated: query.at(i - 1) != QLatin1Char(':')| yes Evaluation Count:30 | no Evaluation Count:0 |
| 0-30 |
| 151 | && (i + 1 < n && qIsAlnum(query.at(i + 1)))) { partially evaluated: i + 1 < n| yes Evaluation Count:30 | no Evaluation Count:0 |
partially evaluated: qIsAlnum(query.at(i + 1))| yes Evaluation Count:30 | no Evaluation Count:0 |
| 0-30 |
| 152 | int pos = i + 2; executed (the execution status of this line is deduced): int pos = i + 2; | - |
| 153 | while (pos < n && qIsAlnum(query.at(pos))) evaluated: pos < n| yes Evaluation Count:56 | yes Evaluation Count:3 |
evaluated: qIsAlnum(query.at(pos))| yes Evaluation Count:29 | yes Evaluation Count:27 |
| 3-56 |
| 154 | ++pos; executed: ++pos;Execution Count:29 | 29 |
| 155 | QString holder(query.mid(i, pos - i)); executed (the execution status of this line is deduced): QString holder(query.mid(i, pos - i)); | - |
| 156 | indexes[holder].append(count++); executed (the execution status of this line is deduced): indexes[holder].append(count++); | - |
| 157 | holders.append(QHolder(holder, i)); executed (the execution status of this line is deduced): holders.append(QHolder(holder, i)); | - |
| 158 | result += QLatin1Char('?'); executed (the execution status of this line is deduced): result += QLatin1Char('?'); | - |
| 159 | i = pos; executed (the execution status of this line is deduced): i = pos; | - |
| 160 | } else { executed: }Execution Count:30 | 30 |
| 161 | if (ch == QLatin1Char('\'') || ch == QLatin1Char('"') || ch == QLatin1Char('`')) evaluated: ch == QLatin1Char('\'')| yes Evaluation Count:12 | yes Evaluation Count:11415 |
evaluated: ch == QLatin1Char('"')| yes Evaluation Count:223 | yes Evaluation Count:11192 |
partially evaluated: ch == QLatin1Char('`')| no Evaluation Count:0 | yes Evaluation Count:11192 |
| 0-11415 |
| 162 | closingQuote = ch; executed: closingQuote = ch;Execution Count:235 | 235 |
| 163 | else if (ch == QLatin1Char('[')) evaluated: ch == QLatin1Char('[')| yes Evaluation Count:7 | yes Evaluation Count:11185 |
| 7-11185 |
| 164 | closingQuote = QLatin1Char(']'); executed: closingQuote = QLatin1Char(']');Execution Count:7 | 7 |
| 165 | result += ch; executed (the execution status of this line is deduced): result += ch; | - |
| 166 | ++i; executed (the execution status of this line is deduced): ++i; | - |
| 167 | } executed: }Execution Count:11427 | 11427 |
| 168 | } | - |
| 169 | } | - |
| 170 | result.squeeze(); executed (the execution status of this line is deduced): result.squeeze(); | - |
| 171 | values.resize(holders.size()); executed (the execution status of this line is deduced): values.resize(holders.size()); | - |
| 172 | return result; executed: return result;Execution Count:247 | 247 |
| 173 | } | - |
| 174 | | - |
| 175 | /*! | - |
| 176 | \class QSqlResult | - |
| 177 | \brief The QSqlResult class provides an abstract interface for | - |
| 178 | accessing data from specific SQL databases. | - |
| 179 | | - |
| 180 | \ingroup database | - |
| 181 | \inmodule QtSql | - |
| 182 | | - |
| 183 | Normally, you would use QSqlQuery instead of QSqlResult, since | - |
| 184 | QSqlQuery provides a generic wrapper for database-specific | - |
| 185 | implementations of QSqlResult. | - |
| 186 | | - |
| 187 | If you are implementing your own SQL driver (by subclassing | - |
| 188 | QSqlDriver), you will need to provide your own QSqlResult | - |
| 189 | subclass that implements all the pure virtual functions and other | - |
| 190 | virtual functions that you need. | - |
| 191 | | - |
| 192 | \sa QSqlDriver | - |
| 193 | */ | - |
| 194 | | - |
| 195 | /*! | - |
| 196 | \enum QSqlResult::BindingSyntax | - |
| 197 | | - |
| 198 | This enum type specifies the different syntaxes for specifying | - |
| 199 | placeholders in prepared queries. | - |
| 200 | | - |
| 201 | \value PositionalBinding Use the ODBC-style positional syntax, with "?" as placeholders. | - |
| 202 | \value NamedBinding Use the Oracle-style syntax with named placeholders (e.g., ":id") | - |
| 203 | | - |
| 204 | \sa bindingSyntax() | - |
| 205 | */ | - |
| 206 | | - |
| 207 | /*! | - |
| 208 | \enum QSqlResult::VirtualHookOperation | - |
| 209 | \internal | - |
| 210 | */ | - |
| 211 | | - |
| 212 | /*! | - |
| 213 | Creates a QSqlResult using database driver \a db. The object is | - |
| 214 | initialized to an inactive state. | - |
| 215 | | - |
| 216 | \sa isActive(), driver() | - |
| 217 | */ | - |
| 218 | | - |
| 219 | QSqlResult::QSqlResult(const QSqlDriver *db) | - |
| 220 | { | - |
| 221 | d = new QSqlResultPrivate(this); executed (the execution status of this line is deduced): d = new QSqlResultPrivate(this); | - |
| 222 | d->sqldriver = const_cast<QSqlDriver *>(db); executed (the execution status of this line is deduced): d->sqldriver = const_cast<QSqlDriver *>(db); | - |
| 223 | if(db) { partially evaluated: db| yes Evaluation Count:2186 | no Evaluation Count:0 |
| 0-2186 |
| 224 | setNumericalPrecisionPolicy(db->numericalPrecisionPolicy()); executed (the execution status of this line is deduced): setNumericalPrecisionPolicy(db->numericalPrecisionPolicy()); | - |
| 225 | } executed: }Execution Count:2186 | 2186 |
| 226 | } executed: }Execution Count:2186 | 2186 |
| 227 | | - |
| 228 | /*! | - |
| 229 | Destroys the object and frees any allocated resources. | - |
| 230 | */ | - |
| 231 | | - |
| 232 | QSqlResult::~QSqlResult() | - |
| 233 | { | - |
| 234 | delete d; executed (the execution status of this line is deduced): delete d; | - |
| 235 | } executed: }Execution Count:2186 | 2186 |
| 236 | | - |
| 237 | /*! | - |
| 238 | Sets the current query for the result to \a query. You must call | - |
| 239 | reset() to execute the query on the database. | - |
| 240 | | - |
| 241 | \sa reset(), lastQuery() | - |
| 242 | */ | - |
| 243 | | - |
| 244 | void QSqlResult::setQuery(const QString& query) | - |
| 245 | { | - |
| 246 | d->sql = query; executed (the execution status of this line is deduced): d->sql = query; | - |
| 247 | } executed: }Execution Count:2555 | 2555 |
| 248 | | - |
| 249 | /*! | - |
| 250 | Returns the current SQL query text, or an empty string if there | - |
| 251 | isn't one. | - |
| 252 | | - |
| 253 | \sa setQuery() | - |
| 254 | */ | - |
| 255 | | - |
| 256 | QString QSqlResult::lastQuery() const | - |
| 257 | { | - |
| 258 | return d->sql; executed: return d->sql;Execution Count:124 | 124 |
| 259 | } | - |
| 260 | | - |
| 261 | /*! | - |
| 262 | Returns the current (zero-based) row position of the result. May | - |
| 263 | return the special values QSql::BeforeFirstRow or | - |
| 264 | QSql::AfterLastRow. | - |
| 265 | | - |
| 266 | \sa setAt(), isValid() | - |
| 267 | */ | - |
| 268 | int QSqlResult::at() const | - |
| 269 | { | - |
| 270 | return d->idx; executed: return d->idx;Execution Count:103908 | 103908 |
| 271 | } | - |
| 272 | | - |
| 273 | | - |
| 274 | /*! | - |
| 275 | Returns true if the result is positioned on a valid record (that | - |
| 276 | is, the result is not positioned before the first or after the | - |
| 277 | last record); otherwise returns false. | - |
| 278 | | - |
| 279 | \sa at() | - |
| 280 | */ | - |
| 281 | | - |
| 282 | bool QSqlResult::isValid() const | - |
| 283 | { | - |
| 284 | return d->idx != QSql::BeforeFirstRow && d->idx != QSql::AfterLastRow; executed: return d->idx != QSql::BeforeFirstRow && d->idx != QSql::AfterLastRow;Execution Count:9868 | 9868 |
| 285 | } | - |
| 286 | | - |
| 287 | /*! | - |
| 288 | \fn bool QSqlResult::isNull(int index) | - |
| 289 | | - |
| 290 | Returns true if the field at position \a index in the current row | - |
| 291 | is null; otherwise returns false. | - |
| 292 | */ | - |
| 293 | | - |
| 294 | /*! | - |
| 295 | Returns true if the result has records to be retrieved; otherwise | - |
| 296 | returns false. | - |
| 297 | */ | - |
| 298 | | - |
| 299 | bool QSqlResult::isActive() const | - |
| 300 | { | - |
| 301 | return d->active; executed: return d->active;Execution Count:20602 | 20602 |
| 302 | } | - |
| 303 | | - |
| 304 | /*! | - |
| 305 | This function is provided for derived classes to set the | - |
| 306 | internal (zero-based) row position to \a index. | - |
| 307 | | - |
| 308 | \sa at() | - |
| 309 | */ | - |
| 310 | | - |
| 311 | void QSqlResult::setAt(int index) | - |
| 312 | { | - |
| 313 | d->idx = index; executed (the execution status of this line is deduced): d->idx = index; | - |
| 314 | } executed: }Execution Count:292716 | 292716 |
| 315 | | - |
| 316 | | - |
| 317 | /*! | - |
| 318 | This function is provided for derived classes to indicate whether | - |
| 319 | or not the current statement is a SQL \c SELECT statement. The \a | - |
| 320 | select parameter should be true if the statement is a \c SELECT | - |
| 321 | statement; otherwise it should be false. | - |
| 322 | | - |
| 323 | \sa isSelect() | - |
| 324 | */ | - |
| 325 | | - |
| 326 | void QSqlResult::setSelect(bool select) | - |
| 327 | { | - |
| 328 | d->isSel = select; executed (the execution status of this line is deduced): d->isSel = select; | - |
| 329 | } executed: }Execution Count:121885 | 121885 |
| 330 | | - |
| 331 | /*! | - |
| 332 | Returns true if the current result is from a \c SELECT statement; | - |
| 333 | otherwise returns false. | - |
| 334 | | - |
| 335 | \sa setSelect() | - |
| 336 | */ | - |
| 337 | | - |
| 338 | bool QSqlResult::isSelect() const | - |
| 339 | { | - |
| 340 | return d->isSel; executed: return d->isSel;Execution Count:7816 | 7816 |
| 341 | } | - |
| 342 | | - |
| 343 | /*! | - |
| 344 | Returns the driver associated with the result. This is the object | - |
| 345 | that was passed to the constructor. | - |
| 346 | */ | - |
| 347 | | - |
| 348 | const QSqlDriver *QSqlResult::driver() const | - |
| 349 | { | - |
| 350 | return d->sqldriver; executed: return d->sqldriver;Execution Count:17682 | 17682 |
| 351 | } | - |
| 352 | | - |
| 353 | | - |
| 354 | /*! | - |
| 355 | This function is provided for derived classes to set the internal | - |
| 356 | active state to \a active. | - |
| 357 | | - |
| 358 | \sa isActive() | - |
| 359 | */ | - |
| 360 | | - |
| 361 | void QSqlResult::setActive(bool active) | - |
| 362 | { | - |
| 363 | if (active && d->executedQuery.isEmpty()) evaluated: active| yes Evaluation Count:26827 | yes Evaluation Count:107253 |
evaluated: d->executedQuery.isEmpty()| yes Evaluation Count:1239 | yes Evaluation Count:25588 |
| 1239-107253 |
| 364 | d->executedQuery = d->sql; executed: d->executedQuery = d->sql;Execution Count:1239 | 1239 |
| 365 | | - |
| 366 | d->active = active; executed (the execution status of this line is deduced): d->active = active; | - |
| 367 | } executed: }Execution Count:134080 | 134080 |
| 368 | | - |
| 369 | /*! | - |
| 370 | This function is provided for derived classes to set the last | - |
| 371 | error to \a error. | - |
| 372 | | - |
| 373 | \sa lastError() | - |
| 374 | */ | - |
| 375 | | - |
| 376 | void QSqlResult::setLastError(const QSqlError &error) | - |
| 377 | { | - |
| 378 | d->error = error; executed (the execution status of this line is deduced): d->error = error; | - |
| 379 | } executed: }Execution Count:306675 | 306675 |
| 380 | | - |
| 381 | | - |
| 382 | /*! | - |
| 383 | Returns the last error associated with the result. | - |
| 384 | */ | - |
| 385 | | - |
| 386 | QSqlError QSqlResult::lastError() const | - |
| 387 | { | - |
| 388 | return d->error; executed: return d->error;Execution Count:246904 | 246904 |
| 389 | } | - |
| 390 | | - |
| 391 | /*! | - |
| 392 | \fn int QSqlResult::size() | - |
| 393 | | - |
| 394 | Returns the size of the \c SELECT result, or -1 if it cannot be | - |
| 395 | determined or if the query is not a \c SELECT statement. | - |
| 396 | | - |
| 397 | \sa numRowsAffected() | - |
| 398 | */ | - |
| 399 | | - |
| 400 | /*! | - |
| 401 | \fn int QSqlResult::numRowsAffected() | - |
| 402 | | - |
| 403 | Returns the number of rows affected by the last query executed, or | - |
| 404 | -1 if it cannot be determined or if the query is a \c SELECT | - |
| 405 | statement. | - |
| 406 | | - |
| 407 | \sa size() | - |
| 408 | */ | - |
| 409 | | - |
| 410 | /*! | - |
| 411 | \fn QVariant QSqlResult::data(int index) | - |
| 412 | | - |
| 413 | Returns the data for field \a index in the current row as | - |
| 414 | a QVariant. This function is only called if the result is in | - |
| 415 | an active state and is positioned on a valid record and \a index is | - |
| 416 | non-negative. Derived classes must reimplement this function and | - |
| 417 | return the value of field \a index, or QVariant() if it cannot be | - |
| 418 | determined. | - |
| 419 | */ | - |
| 420 | | - |
| 421 | /*! | - |
| 422 | \fn bool QSqlResult::reset(const QString &query) | - |
| 423 | | - |
| 424 | Sets the result to use the SQL statement \a query for subsequent | - |
| 425 | data retrieval. | - |
| 426 | | - |
| 427 | Derived classes must reimplement this function and apply the \a | - |
| 428 | query to the database. This function is only called after the | - |
| 429 | result is set to an inactive state and is positioned before the | - |
| 430 | first record of the new result. Derived classes should return | - |
| 431 | true if the query was successful and ready to be used, or false | - |
| 432 | otherwise. | - |
| 433 | | - |
| 434 | \sa setQuery() | - |
| 435 | */ | - |
| 436 | | - |
| 437 | /*! | - |
| 438 | \fn bool QSqlResult::fetch(int index) | - |
| 439 | | - |
| 440 | Positions the result to an arbitrary (zero-based) row \a index. | - |
| 441 | | - |
| 442 | This function is only called if the result is in an active state. | - |
| 443 | Derived classes must reimplement this function and position the | - |
| 444 | result to the row \a index, and call setAt() with an appropriate | - |
| 445 | value. Return true to indicate success, or false to signify | - |
| 446 | failure. | - |
| 447 | | - |
| 448 | \sa isActive(), fetchFirst(), fetchLast(), fetchNext(), fetchPrevious() | - |
| 449 | */ | - |
| 450 | | - |
| 451 | /*! | - |
| 452 | \fn bool QSqlResult::fetchFirst() | - |
| 453 | | - |
| 454 | Positions the result to the first record (row 0) in the result. | - |
| 455 | | - |
| 456 | This function is only called if the result is in an active state. | - |
| 457 | Derived classes must reimplement this function and position the | - |
| 458 | result to the first record, and call setAt() with an appropriate | - |
| 459 | value. Return true to indicate success, or false to signify | - |
| 460 | failure. | - |
| 461 | | - |
| 462 | \sa fetch(), fetchLast() | - |
| 463 | */ | - |
| 464 | | - |
| 465 | /*! | - |
| 466 | \fn bool QSqlResult::fetchLast() | - |
| 467 | | - |
| 468 | Positions the result to the last record (last row) in the result. | - |
| 469 | | - |
| 470 | This function is only called if the result is in an active state. | - |
| 471 | Derived classes must reimplement this function and position the | - |
| 472 | result to the last record, and call setAt() with an appropriate | - |
| 473 | value. Return true to indicate success, or false to signify | - |
| 474 | failure. | - |
| 475 | | - |
| 476 | \sa fetch(), fetchFirst() | - |
| 477 | */ | - |
| 478 | | - |
| 479 | /*! | - |
| 480 | Positions the result to the next available record (row) in the | - |
| 481 | result. | - |
| 482 | | - |
| 483 | This function is only called if the result is in an active | - |
| 484 | state. The default implementation calls fetch() with the next | - |
| 485 | index. Derived classes can reimplement this function and position | - |
| 486 | the result to the next record in some other way, and call setAt() | - |
| 487 | with an appropriate value. Return true to indicate success, or | - |
| 488 | false to signify failure. | - |
| 489 | | - |
| 490 | \sa fetch(), fetchPrevious() | - |
| 491 | */ | - |
| 492 | | - |
| 493 | bool QSqlResult::fetchNext() | - |
| 494 | { | - |
| 495 | return fetch(at() + 1); never executed: return fetch(at() + 1); | 0 |
| 496 | } | - |
| 497 | | - |
| 498 | /*! | - |
| 499 | Positions the result to the previous record (row) in the result. | - |
| 500 | | - |
| 501 | This function is only called if the result is in an active state. | - |
| 502 | The default implementation calls fetch() with the previous index. | - |
| 503 | Derived classes can reimplement this function and position the | - |
| 504 | result to the next record in some other way, and call setAt() | - |
| 505 | with an appropriate value. Return true to indicate success, or | - |
| 506 | false to signify failure. | - |
| 507 | */ | - |
| 508 | | - |
| 509 | bool QSqlResult::fetchPrevious() | - |
| 510 | { | - |
| 511 | return fetch(at() - 1); never executed: return fetch(at() - 1); | 0 |
| 512 | } | - |
| 513 | | - |
| 514 | /*! | - |
| 515 | Returns true if you can only scroll forward through the result | - |
| 516 | set; otherwise returns false. | - |
| 517 | | - |
| 518 | \sa setForwardOnly() | - |
| 519 | */ | - |
| 520 | bool QSqlResult::isForwardOnly() const | - |
| 521 | { | - |
| 522 | return d->forwardOnly; executed: return d->forwardOnly;Execution Count:42501 | 42501 |
| 523 | } | - |
| 524 | | - |
| 525 | /*! | - |
| 526 | Sets forward only mode to \a forward. If \a forward is true, only | - |
| 527 | fetchNext() is allowed for navigating the results. Forward only | - |
| 528 | mode needs much less memory since results do not have to be | - |
| 529 | cached. By default, this feature is disabled. | - |
| 530 | | - |
| 531 | Setting forward only to false is a suggestion to the database engine, | - |
| 532 | which has the final say on whether a result set is forward only or | - |
| 533 | scrollable. isForwardOnly() will always return the correct status of | - |
| 534 | the result set. | - |
| 535 | | - |
| 536 | \note Calling setForwardOnly after execution of the query will result | - |
| 537 | in unexpected results at best, and crashes at worst. | - |
| 538 | | - |
| 539 | \sa isForwardOnly(), fetchNext(), QSqlQuery::setForwardOnly() | - |
| 540 | */ | - |
| 541 | void QSqlResult::setForwardOnly(bool forward) | - |
| 542 | { | - |
| 543 | d->forwardOnly = forward; executed (the execution status of this line is deduced): d->forwardOnly = forward; | - |
| 544 | } executed: }Execution Count:644 | 644 |
| 545 | | - |
| 546 | /*! | - |
| 547 | Prepares the given \a query, using the underlying database | - |
| 548 | functionality where possible. Returns true if the query is | - |
| 549 | prepared successfully; otherwise returns false. | - |
| 550 | | - |
| 551 | Note: This method should have been called "safePrepare()". | - |
| 552 | | - |
| 553 | \sa prepare() | - |
| 554 | */ | - |
| 555 | bool QSqlResult::savePrepare(const QString& query) | - |
| 556 | { | - |
| 557 | if (!driver()) partially evaluated: !driver()| no Evaluation Count:0 | yes Evaluation Count:239 |
| 0-239 |
| 558 | return false; never executed: return false; | 0 |
| 559 | d->clear(); executed (the execution status of this line is deduced): d->clear(); | - |
| 560 | d->sql = query; executed (the execution status of this line is deduced): d->sql = query; | - |
| 561 | if (!driver()->hasFeature(QSqlDriver::PreparedQueries)) partially evaluated: !driver()->hasFeature(QSqlDriver::PreparedQueries)| no Evaluation Count:0 | yes Evaluation Count:239 |
| 0-239 |
| 562 | return prepare(query); never executed: return prepare(query); | 0 |
| 563 | | - |
| 564 | // parse the query to memorize parameter location | - |
| 565 | d->executedQuery = d->namedToPositionalBinding(query); executed (the execution status of this line is deduced): d->executedQuery = d->namedToPositionalBinding(query); | - |
| 566 | | - |
| 567 | if (driver()->hasFeature(QSqlDriver::NamedPlaceholders)) evaluated: driver()->hasFeature(QSqlDriver::NamedPlaceholders)| yes Evaluation Count:13 | yes Evaluation Count:226 |
| 13-226 |
| 568 | d->executedQuery = QSqlResultPrivate::positionalToNamedBinding(query); executed: d->executedQuery = QSqlResultPrivate::positionalToNamedBinding(query);Execution Count:13 | 13 |
| 569 | | - |
| 570 | return prepare(d->executedQuery); executed: return prepare(d->executedQuery);Execution Count:239 | 239 |
| 571 | } | - |
| 572 | | - |
| 573 | /*! | - |
| 574 | Prepares the given \a query for execution; the query will normally | - |
| 575 | use placeholders so that it can be executed repeatedly. Returns | - |
| 576 | true if the query is prepared successfully; otherwise returns false. | - |
| 577 | | - |
| 578 | \sa exec() | - |
| 579 | */ | - |
| 580 | bool QSqlResult::prepare(const QString& query) | - |
| 581 | { | - |
| 582 | d->sql = query; executed (the execution status of this line is deduced): d->sql = query; | - |
| 583 | if (d->holders.isEmpty()) { evaluated: d->holders.isEmpty()| yes Evaluation Count:8 | yes Evaluation Count:5 |
| 5-8 |
| 584 | // parse the query to memorize parameter location | - |
| 585 | d->namedToPositionalBinding(query); executed (the execution status of this line is deduced): d->namedToPositionalBinding(query); | - |
| 586 | } executed: }Execution Count:8 | 8 |
| 587 | return true; // fake prepares should always succeed executed: return true;Execution Count:13 | 13 |
| 588 | } | - |
| 589 | | - |
| 590 | /*! | - |
| 591 | Executes the query, returning true if successful; otherwise returns | - |
| 592 | false. | - |
| 593 | | - |
| 594 | \sa prepare() | - |
| 595 | */ | - |
| 596 | bool QSqlResult::exec() | - |
| 597 | { | - |
| 598 | bool ret; never executed (the execution status of this line is deduced): bool ret; | - |
| 599 | // fake preparation - just replace the placeholders.. | - |
| 600 | QString query = lastQuery(); never executed (the execution status of this line is deduced): QString query = lastQuery(); | - |
| 601 | if (d->binds == NamedBinding) { never evaluated: d->binds == NamedBinding | 0 |
| 602 | int i; never executed (the execution status of this line is deduced): int i; | - |
| 603 | QVariant val; never executed (the execution status of this line is deduced): QVariant val; | - |
| 604 | QString holder; never executed (the execution status of this line is deduced): QString holder; | - |
| 605 | for (i = d->holders.count() - 1; i >= 0; --i) { | 0 |
| 606 | holder = d->holders.at(i).holderName; never executed (the execution status of this line is deduced): holder = d->holders.at(i).holderName; | - |
| 607 | val = d->values.value(d->indexes.value(holder).value(0,-1)); never executed (the execution status of this line is deduced): val = d->values.value(d->indexes.value(holder).value(0,-1)); | - |
| 608 | QSqlField f(QLatin1String(""), val.type()); never executed (the execution status of this line is deduced): QSqlField f(QLatin1String(""), val.type()); | - |
| 609 | f.setValue(val); never executed (the execution status of this line is deduced): f.setValue(val); | - |
| 610 | query = query.replace(d->holders.at(i).holderPos, never executed (the execution status of this line is deduced): query = query.replace(d->holders.at(i).holderPos, | - |
| 611 | holder.length(), driver()->formatValue(f)); never executed (the execution status of this line is deduced): holder.length(), driver()->formatValue(f)); | - |
| 612 | } | 0 |
| 613 | } else { | 0 |
| 614 | QString val; never executed (the execution status of this line is deduced): QString val; | - |
| 615 | int i = 0; never executed (the execution status of this line is deduced): int i = 0; | - |
| 616 | int idx = 0; never executed (the execution status of this line is deduced): int idx = 0; | - |
| 617 | for (idx = 0; idx < d->values.count(); ++idx) { never evaluated: idx < d->values.count() | 0 |
| 618 | i = query.indexOf(QLatin1Char('?'), i); never executed (the execution status of this line is deduced): i = query.indexOf(QLatin1Char('?'), i); | - |
| 619 | if (i == -1) | 0 |
| 620 | continue; never executed: continue; | 0 |
| 621 | QVariant var = d->values.value(idx); never executed (the execution status of this line is deduced): QVariant var = d->values.value(idx); | - |
| 622 | QSqlField f(QLatin1String(""), var.type()); never executed (the execution status of this line is deduced): QSqlField f(QLatin1String(""), var.type()); | - |
| 623 | if (var.isNull()) never evaluated: var.isNull() | 0 |
| 624 | f.clear(); never executed: f.clear(); | 0 |
| 625 | else | - |
| 626 | f.setValue(var); never executed: f.setValue(var); | 0 |
| 627 | val = driver()->formatValue(f); never executed (the execution status of this line is deduced): val = driver()->formatValue(f); | - |
| 628 | query = query.replace(i, 1, driver()->formatValue(f)); never executed (the execution status of this line is deduced): query = query.replace(i, 1, driver()->formatValue(f)); | - |
| 629 | i += val.length(); never executed (the execution status of this line is deduced): i += val.length(); | - |
| 630 | } | 0 |
| 631 | } | 0 |
| 632 | | - |
| 633 | // have to retain the original query with placeholders | - |
| 634 | QString orig = lastQuery(); never executed (the execution status of this line is deduced): QString orig = lastQuery(); | - |
| 635 | ret = reset(query); never executed (the execution status of this line is deduced): ret = reset(query); | - |
| 636 | d->executedQuery = query; never executed (the execution status of this line is deduced): d->executedQuery = query; | - |
| 637 | setQuery(orig); never executed (the execution status of this line is deduced): setQuery(orig); | - |
| 638 | d->resetBindCount(); never executed (the execution status of this line is deduced): d->resetBindCount(); | - |
| 639 | return ret; never executed: return ret; | 0 |
| 640 | } | - |
| 641 | | - |
| 642 | /*! | - |
| 643 | Binds the value \a val of parameter type \a paramType to position \a index | - |
| 644 | in the current record (row). | - |
| 645 | | - |
| 646 | \sa addBindValue() | - |
| 647 | */ | - |
| 648 | void QSqlResult::bindValue(int index, const QVariant& val, QSql::ParamType paramType) | - |
| 649 | { | - |
| 650 | d->binds = PositionalBinding; executed (the execution status of this line is deduced): d->binds = PositionalBinding; | - |
| 651 | d->indexes[QSqlResultPrivate::fieldSerial(index)].append(index); executed (the execution status of this line is deduced): d->indexes[QSqlResultPrivate::fieldSerial(index)].append(index); | - |
| 652 | if (d->values.count() <= index) evaluated: d->values.count() <= index| yes Evaluation Count:447 | yes Evaluation Count:232985 |
| 447-232985 |
| 653 | d->values.resize(index + 1); executed: d->values.resize(index + 1);Execution Count:447 | 447 |
| 654 | d->values[index] = val; executed (the execution status of this line is deduced): d->values[index] = val; | - |
| 655 | if (paramType != QSql::In || !d->types.isEmpty()) partially evaluated: paramType != QSql::In| no Evaluation Count:0 | yes Evaluation Count:233432 |
partially evaluated: !d->types.isEmpty()| no Evaluation Count:0 | yes Evaluation Count:233432 |
| 0-233432 |
| 656 | d->types[index] = paramType; never executed: d->types[index] = paramType; | 0 |
| 657 | } executed: }Execution Count:233432 | 233432 |
| 658 | | - |
| 659 | /*! | - |
| 660 | \overload | - |
| 661 | | - |
| 662 | Binds the value \a val of parameter type \a paramType to the \a | - |
| 663 | placeholder name in the current record (row). | - |
| 664 | | - |
| 665 | Values cannot be bound to multiple locations in the query, eg: | - |
| 666 | \code | - |
| 667 | INSERT INTO testtable (id, name, samename) VALUES (:id, :name, :name) | - |
| 668 | \endcode | - |
| 669 | Binding to name will bind to the first :name, but not the second. | - |
| 670 | | - |
| 671 | \note Binding an undefined placeholder will result in undefined behavior. | - |
| 672 | | - |
| 673 | \sa QSqlQuery::bindValue() | - |
| 674 | */ | - |
| 675 | void QSqlResult::bindValue(const QString& placeholder, const QVariant& val, | - |
| 676 | QSql::ParamType paramType) | - |
| 677 | { | - |
| 678 | d->binds = NamedBinding; executed (the execution status of this line is deduced): d->binds = NamedBinding; | - |
| 679 | // if the index has already been set when doing emulated named | - |
| 680 | // bindings - don't reset it | - |
| 681 | QList<int> indexes = d->indexes.value(placeholder); executed (the execution status of this line is deduced): QList<int> indexes = d->indexes.value(placeholder); | - |
| 682 | foreach (int idx, indexes) { executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(indexes)> _container_(indexes); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (int idx = *_container_.i;; __extension__ ({--_container_.brk; break;})) { | - |
| 683 | if (d->values.count() <= idx) partially evaluated: d->values.count() <= idx| no Evaluation Count:0 | yes Evaluation Count:38 |
| 0-38 |
| 684 | d->values.resize(idx + 1); never executed: d->values.resize(idx + 1); | 0 |
| 685 | d->values[idx] = val; executed (the execution status of this line is deduced): d->values[idx] = val; | - |
| 686 | if (paramType != QSql::In || !d->types.isEmpty()) partially evaluated: paramType != QSql::In| no Evaluation Count:0 | yes Evaluation Count:38 |
partially evaluated: !d->types.isEmpty()| no Evaluation Count:0 | yes Evaluation Count:38 |
| 0-38 |
| 687 | d->types[idx] = paramType; never executed: d->types[idx] = paramType; | 0 |
| 688 | } executed: }Execution Count:38 | 38 |
| 689 | } executed: }Execution Count:46 | 46 |
| 690 | | - |
| 691 | /*! | - |
| 692 | Binds the value \a val of parameter type \a paramType to the next | - |
| 693 | available position in the current record (row). | - |
| 694 | | - |
| 695 | \sa bindValue() | - |
| 696 | */ | - |
| 697 | void QSqlResult::addBindValue(const QVariant& val, QSql::ParamType paramType) | - |
| 698 | { | - |
| 699 | d->binds = PositionalBinding; executed (the execution status of this line is deduced): d->binds = PositionalBinding; | - |
| 700 | bindValue(d->bindCount, val, paramType); executed (the execution status of this line is deduced): bindValue(d->bindCount, val, paramType); | - |
| 701 | ++d->bindCount; executed (the execution status of this line is deduced): ++d->bindCount; | - |
| 702 | } executed: }Execution Count:233361 | 233361 |
| 703 | | - |
| 704 | /*! | - |
| 705 | Returns the value bound at position \a index in the current record | - |
| 706 | (row). | - |
| 707 | | - |
| 708 | \sa bindValue(), boundValues() | - |
| 709 | */ | - |
| 710 | QVariant QSqlResult::boundValue(int index) const | - |
| 711 | { | - |
| 712 | return d->values.value(index); executed: return d->values.value(index);Execution Count:1 | 1 |
| 713 | } | - |
| 714 | | - |
| 715 | /*! | - |
| 716 | \overload | - |
| 717 | | - |
| 718 | Returns the value bound by the given \a placeholder name in the | - |
| 719 | current record (row). | - |
| 720 | | - |
| 721 | \sa bindValueType() | - |
| 722 | */ | - |
| 723 | QVariant QSqlResult::boundValue(const QString& placeholder) const | - |
| 724 | { | - |
| 725 | QList<int> indexes = d->indexes.value(placeholder); never executed (the execution status of this line is deduced): QList<int> indexes = d->indexes.value(placeholder); | - |
| 726 | return d->values.value(indexes.value(0,-1)); never executed: return d->values.value(indexes.value(0,-1)); | 0 |
| 727 | } | - |
| 728 | | - |
| 729 | /*! | - |
| 730 | Returns the parameter type for the value bound at position \a index. | - |
| 731 | | - |
| 732 | \sa boundValue() | - |
| 733 | */ | - |
| 734 | QSql::ParamType QSqlResult::bindValueType(int index) const | - |
| 735 | { | - |
| 736 | return d->types.value(index, QSql::In); never executed: return d->types.value(index, QSql::In); | 0 |
| 737 | } | - |
| 738 | | - |
| 739 | /*! | - |
| 740 | \overload | - |
| 741 | | - |
| 742 | Returns the parameter type for the value bound with the given \a | - |
| 743 | placeholder name. | - |
| 744 | */ | - |
| 745 | QSql::ParamType QSqlResult::bindValueType(const QString& placeholder) const | - |
| 746 | { | - |
| 747 | return d->types.value(d->indexes.value(placeholder).value(0,-1), QSql::In); never executed: return d->types.value(d->indexes.value(placeholder).value(0,-1), QSql::In); | 0 |
| 748 | } | - |
| 749 | | - |
| 750 | /*! | - |
| 751 | Returns the number of bound values in the result. | - |
| 752 | | - |
| 753 | \sa boundValues() | - |
| 754 | */ | - |
| 755 | int QSqlResult::boundValueCount() const | - |
| 756 | { | - |
| 757 | return d->values.count(); never executed: return d->values.count(); | 0 |
| 758 | } | - |
| 759 | | - |
| 760 | /*! | - |
| 761 | Returns a vector of the result's bound values for the current | - |
| 762 | record (row). | - |
| 763 | | - |
| 764 | \sa boundValueCount() | - |
| 765 | */ | - |
| 766 | QVector<QVariant>& QSqlResult::boundValues() const | - |
| 767 | { | - |
| 768 | return d->values; executed: return d->values;Execution Count:119169 | 119169 |
| 769 | } | - |
| 770 | | - |
| 771 | /*! | - |
| 772 | Returns the binding syntax used by prepared queries. | - |
| 773 | */ | - |
| 774 | QSqlResult::BindingSyntax QSqlResult::bindingSyntax() const | - |
| 775 | { | - |
| 776 | return d->binds; never executed: return d->binds; | 0 |
| 777 | } | - |
| 778 | | - |
| 779 | /*! | - |
| 780 | Clears the entire result set and releases any associated | - |
| 781 | resources. | - |
| 782 | */ | - |
| 783 | void QSqlResult::clear() | - |
| 784 | { | - |
| 785 | d->clear(); executed (the execution status of this line is deduced): d->clear(); | - |
| 786 | } executed: }Execution Count:2552 | 2552 |
| 787 | | - |
| 788 | /*! | - |
| 789 | Returns the query that was actually executed. This may differ from | - |
| 790 | the query that was passed, for example if bound values were used | - |
| 791 | with a prepared query and the underlying database doesn't support | - |
| 792 | prepared queries. | - |
| 793 | | - |
| 794 | \sa exec(), setQuery() | - |
| 795 | */ | - |
| 796 | QString QSqlResult::executedQuery() const | - |
| 797 | { | - |
| 798 | return d->executedQuery; executed: return d->executedQuery;Execution Count:1 | 1 |
| 799 | } | - |
| 800 | | - |
| 801 | void QSqlResult::resetBindCount() | - |
| 802 | { | - |
| 803 | d->resetBindCount(); executed (the execution status of this line is deduced): d->resetBindCount(); | - |
| 804 | } executed: }Execution Count:116724 | 116724 |
| 805 | | - |
| 806 | /*! | - |
| 807 | Returns the name of the bound value at position \a index in the | - |
| 808 | current record (row). | - |
| 809 | | - |
| 810 | \sa boundValue() | - |
| 811 | */ | - |
| 812 | QString QSqlResult::boundValueName(int index) const | - |
| 813 | { | - |
| 814 | return d->holderAt(index); executed: return d->holderAt(index);Execution Count:136 | 136 |
| 815 | } | - |
| 816 | | - |
| 817 | /*! | - |
| 818 | Returns true if at least one of the query's bound values is a \c | - |
| 819 | QSql::Out or a QSql::InOut; otherwise returns false. | - |
| 820 | | - |
| 821 | \sa bindValueType() | - |
| 822 | */ | - |
| 823 | bool QSqlResult::hasOutValues() const | - |
| 824 | { | - |
| 825 | if (d->types.isEmpty()) never evaluated: d->types.isEmpty() | 0 |
| 826 | return false; never executed: return false; | 0 |
| 827 | QHash<int, QSql::ParamType>::ConstIterator it; never executed (the execution status of this line is deduced): QHash<int, QSql::ParamType>::ConstIterator it; | - |
| 828 | for (it = d->types.constBegin(); it != d->types.constEnd(); ++it) { never evaluated: it != d->types.constEnd() | 0 |
| 829 | if (it.value() != QSql::In) never evaluated: it.value() != QSql::In | 0 |
| 830 | return true; never executed: return true; | 0 |
| 831 | } | 0 |
| 832 | return false; never executed: return false; | 0 |
| 833 | } | - |
| 834 | | - |
| 835 | /*! | - |
| 836 | Returns the current record if the query is active; otherwise | - |
| 837 | returns an empty QSqlRecord. | - |
| 838 | | - |
| 839 | The default implementation always returns an empty QSqlRecord. | - |
| 840 | | - |
| 841 | \sa isActive() | - |
| 842 | */ | - |
| 843 | QSqlRecord QSqlResult::record() const | - |
| 844 | { | - |
| 845 | return QSqlRecord(); never executed: return QSqlRecord(); | 0 |
| 846 | } | - |
| 847 | | - |
| 848 | /*! | - |
| 849 | Returns the object ID of the most recent inserted row if the | - |
| 850 | database supports it. | - |
| 851 | An invalid QVariant will be returned if the query did not | - |
| 852 | insert any value or if the database does not report the id back. | - |
| 853 | If more than one row was touched by the insert, the behavior is | - |
| 854 | undefined. | - |
| 855 | | - |
| 856 | Note that for Oracle databases the row's ROWID will be returned, | - |
| 857 | while for MySQL databases the row's auto-increment field will | - |
| 858 | be returned. | - |
| 859 | | - |
| 860 | \sa QSqlDriver::hasFeature() | - |
| 861 | */ | - |
| 862 | QVariant QSqlResult::lastInsertId() const | - |
| 863 | { | - |
| 864 | return QVariant(); never executed: return QVariant(); | 0 |
| 865 | } | - |
| 866 | | - |
| 867 | /*! \internal | - |
| 868 | */ | - |
| 869 | void QSqlResult::virtual_hook(int, void *) | - |
| 870 | { | - |
| 871 | } | - |
| 872 | | - |
| 873 | /*! \internal | - |
| 874 | \since 4.2 | - |
| 875 | | - |
| 876 | Executes a prepared query in batch mode if the driver supports it, | - |
| 877 | otherwise emulates a batch execution using bindValue() and exec(). | - |
| 878 | QSqlDriver::hasFeature() can be used to find out whether a driver | - |
| 879 | supports batch execution. | - |
| 880 | | - |
| 881 | Batch execution can be faster for large amounts of data since it | - |
| 882 | reduces network roundtrips. | - |
| 883 | | - |
| 884 | For batch executions, bound values have to be provided as lists | - |
| 885 | of variants (QVariantList). | - |
| 886 | | - |
| 887 | Each list must contain values of the same type. All lists must | - |
| 888 | contain equal amount of values (rows). | - |
| 889 | | - |
| 890 | NULL values are passed in as typed QVariants, for example | - |
| 891 | \c {QVariant(QVariant::Int)} for an integer NULL value. | - |
| 892 | | - |
| 893 | Example: | - |
| 894 | | - |
| 895 | \snippet code/src_sql_kernel_qsqlresult.cpp 0 | - |
| 896 | | - |
| 897 | Here, we insert two rows into a SQL table, with each row containing three values. | - |
| 898 | | - |
| 899 | \sa exec(), QSqlDriver::hasFeature() | - |
| 900 | */ | - |
| 901 | bool QSqlResult::execBatch(bool arrayBind) | - |
| 902 | { | - |
| 903 | Q_UNUSED(arrayBind); never executed (the execution status of this line is deduced): (void)arrayBind;; | - |
| 904 | | - |
| 905 | QVector<QVariant> values = d->values; never executed (the execution status of this line is deduced): QVector<QVariant> values = d->values; | - |
| 906 | if (values.count() == 0) never evaluated: values.count() == 0 | 0 |
| 907 | return false; never executed: return false; | 0 |
| 908 | for (int i = 0; i < values.at(0).toList().count(); ++i) { never evaluated: i < values.at(0).toList().count() | 0 |
| 909 | for (int j = 0; j < values.count(); ++j) never evaluated: j < values.count() | 0 |
| 910 | bindValue(j, values.at(j).toList().at(i), QSql::In); never executed: bindValue(j, values.at(j).toList().at(i), QSql::In); | 0 |
| 911 | if (!exec()) | 0 |
| 912 | return false; never executed: return false; | 0 |
| 913 | } | 0 |
| 914 | return true; never executed: return true; | 0 |
| 915 | } | - |
| 916 | | - |
| 917 | /*! \internal | - |
| 918 | */ | - |
| 919 | void QSqlResult::detachFromResultSet() | - |
| 920 | { | - |
| 921 | } | - |
| 922 | | - |
| 923 | /*! \internal | - |
| 924 | */ | - |
| 925 | void QSqlResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy) | - |
| 926 | { | - |
| 927 | d->precisionPolicy = policy; executed (the execution status of this line is deduced): d->precisionPolicy = policy; | - |
| 928 | } executed: }Execution Count:4975 | 4975 |
| 929 | | - |
| 930 | /*! \internal | - |
| 931 | */ | - |
| 932 | QSql::NumericalPrecisionPolicy QSqlResult::numericalPrecisionPolicy() const | - |
| 933 | { | - |
| 934 | return d->precisionPolicy; executed: return d->precisionPolicy;Execution Count:2798 | 2798 |
| 935 | } | - |
| 936 | | - |
| 937 | /*! \internal | - |
| 938 | */ | - |
| 939 | bool QSqlResult::nextResult() | - |
| 940 | { | - |
| 941 | return false; never executed: return false; | 0 |
| 942 | } | - |
| 943 | | - |
| 944 | /*! | - |
| 945 | Returns the low-level database handle for this result set | - |
| 946 | wrapped in a QVariant or an invalid QVariant if there is no handle. | - |
| 947 | | - |
| 948 | \warning Use this with uttermost care and only if you know what you're doing. | - |
| 949 | | - |
| 950 | \warning The handle returned here can become a stale pointer if the result | - |
| 951 | is modified (for example, if you clear it). | - |
| 952 | | - |
| 953 | \warning The handle can be NULL if the result was not executed yet. | - |
| 954 | | - |
| 955 | The handle returned here is database-dependent, you should query the type | - |
| 956 | name of the variant before accessing it. | - |
| 957 | | - |
| 958 | This example retrieves the handle for a sqlite result: | - |
| 959 | | - |
| 960 | \snippet code/src_sql_kernel_qsqlresult.cpp 1 | - |
| 961 | | - |
| 962 | This snippet returns the handle for PostgreSQL or MySQL: | - |
| 963 | | - |
| 964 | \snippet code/src_sql_kernel_qsqlresult.cpp 2 | - |
| 965 | | - |
| 966 | \sa QSqlDriver::handle() | - |
| 967 | */ | - |
| 968 | QVariant QSqlResult::handle() const | - |
| 969 | { | - |
| 970 | return QVariant(); never executed: return QVariant(); | 0 |
| 971 | } | - |
| 972 | | - |
| 973 | QT_END_NAMESPACE | - |
| 974 | | - |
| | |