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 | | - |
| | |