|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the QtSql module of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 #include "qsqldriver.h" |
|
43 |
|
44 #include "qdatetime.h" |
|
45 #include "qsqlerror.h" |
|
46 #include "qsqlfield.h" |
|
47 #include "qsqlindex.h" |
|
48 #include "private/qobject_p.h" |
|
49 |
|
50 QT_BEGIN_NAMESPACE |
|
51 |
|
52 static QString prepareIdentifier(const QString &identifier, |
|
53 QSqlDriver::IdentifierType type, const QSqlDriver *driver) |
|
54 { |
|
55 Q_ASSERT( driver != NULL ); |
|
56 QString ret = identifier; |
|
57 if (!driver->isIdentifierEscaped(identifier, type)) { |
|
58 ret = driver->escapeIdentifier(identifier, type); |
|
59 } |
|
60 return ret; |
|
61 } |
|
62 |
|
63 class QSqlDriverPrivate : public QObjectPrivate |
|
64 { |
|
65 public: |
|
66 QSqlDriverPrivate(); |
|
67 virtual ~QSqlDriverPrivate(); |
|
68 |
|
69 public: |
|
70 // @CHECK: this member is never used. It was named q, which expanded to q_func(). |
|
71 QSqlDriver *q_func(); |
|
72 uint isOpen : 1; |
|
73 uint isOpenError : 1; |
|
74 QSqlError error; |
|
75 QSql::NumericalPrecisionPolicy precisionPolicy; |
|
76 }; |
|
77 |
|
78 inline QSqlDriverPrivate::QSqlDriverPrivate() |
|
79 : QObjectPrivate(), isOpen(false), isOpenError(false), precisionPolicy(QSql::LowPrecisionDouble) |
|
80 { |
|
81 } |
|
82 |
|
83 QSqlDriverPrivate::~QSqlDriverPrivate() |
|
84 { |
|
85 } |
|
86 |
|
87 /*! |
|
88 \class QSqlDriver |
|
89 \brief The QSqlDriver class is an abstract base class for accessing |
|
90 specific SQL databases. |
|
91 |
|
92 \ingroup database |
|
93 \inmodule QtSql |
|
94 |
|
95 This class should not be used directly. Use QSqlDatabase instead. |
|
96 |
|
97 If you want to create your own SQL drivers, you can subclass this |
|
98 class and reimplement its pure virtual functions and those |
|
99 virtual functions that you need. See \l{How to Write Your Own |
|
100 Database Driver} for more information. |
|
101 |
|
102 \sa QSqlDatabase, QSqlResult |
|
103 */ |
|
104 |
|
105 /*! |
|
106 Constructs a new driver with the given \a parent. |
|
107 */ |
|
108 |
|
109 QSqlDriver::QSqlDriver(QObject *parent) |
|
110 : QObject(*new QSqlDriverPrivate, parent) |
|
111 { |
|
112 } |
|
113 |
|
114 /*! |
|
115 Destroys the object and frees any allocated resources. |
|
116 */ |
|
117 |
|
118 QSqlDriver::~QSqlDriver() |
|
119 { |
|
120 } |
|
121 |
|
122 /*! |
|
123 \since 4.4 |
|
124 |
|
125 \fn QSqlDriver::notification(const QString &name) |
|
126 |
|
127 This signal is emitted when the database posts an event notification |
|
128 that the driver subscribes to. \a name identifies the event notification. |
|
129 |
|
130 \sa subscribeToNotification() |
|
131 */ |
|
132 |
|
133 /*! |
|
134 \fn bool QSqlDriver::open(const QString &db, const QString &user, const QString& password, |
|
135 const QString &host, int port, const QString &options) |
|
136 |
|
137 Derived classes must reimplement this pure virtual function to |
|
138 open a database connection on database \a db, using user name \a |
|
139 user, password \a password, host \a host, port \a port and |
|
140 connection options \a options. |
|
141 |
|
142 The function must return true on success and false on failure. |
|
143 |
|
144 \sa setOpen() |
|
145 */ |
|
146 |
|
147 /*! |
|
148 \fn bool QSqlDriver::close() |
|
149 |
|
150 Derived classes must reimplement this pure virtual function in |
|
151 order to close the database connection. Return true on success, |
|
152 false on failure. |
|
153 |
|
154 \sa open(), setOpen() |
|
155 */ |
|
156 |
|
157 /*! |
|
158 \fn QSqlResult *QSqlDriver::createResult() const |
|
159 |
|
160 Creates an empty SQL result on the database. Derived classes must |
|
161 reimplement this function and return a QSqlResult object |
|
162 appropriate for their database to the caller. |
|
163 */ |
|
164 |
|
165 /*! |
|
166 Returns true if the database connection is open; otherwise returns |
|
167 false. |
|
168 */ |
|
169 |
|
170 bool QSqlDriver::isOpen() const |
|
171 { |
|
172 return d_func()->isOpen; |
|
173 } |
|
174 |
|
175 /*! |
|
176 Returns true if the there was an error opening the database |
|
177 connection; otherwise returns false. |
|
178 */ |
|
179 |
|
180 bool QSqlDriver::isOpenError() const |
|
181 { |
|
182 return d_func()->isOpenError; |
|
183 } |
|
184 |
|
185 /*! |
|
186 \enum QSqlDriver::DriverFeature |
|
187 |
|
188 This enum contains a list of features a driver might support. Use |
|
189 hasFeature() to query whether a feature is supported or not. |
|
190 |
|
191 \value Transactions Whether the driver supports SQL transactions. |
|
192 \value QuerySize Whether the database is capable of reporting the size |
|
193 of a query. Note that some databases do not support returning the size |
|
194 (i.e. number of rows returned) of a query, in which case |
|
195 QSqlQuery::size() will return -1. |
|
196 \value BLOB Whether the driver supports Binary Large Object fields. |
|
197 \value Unicode Whether the driver supports Unicode strings if the |
|
198 database server does. |
|
199 \value PreparedQueries Whether the driver supports prepared query execution. |
|
200 \value NamedPlaceholders Whether the driver supports the use of named placeholders. |
|
201 \value PositionalPlaceholders Whether the driver supports the use of positional placeholders. |
|
202 \value LastInsertId Whether the driver supports returning the Id of the last touched row. |
|
203 \value BatchOperations Whether the driver supports batched operations, see QSqlQuery::execBatch() |
|
204 \value SimpleLocking Whether the driver disallows a write lock on a table while other queries have a read lock on it. |
|
205 \value LowPrecisionNumbers Whether the driver allows fetching numerical values with low precision. |
|
206 \value EventNotifications Whether the driver supports database event notifications. |
|
207 \value FinishQuery Whether the driver can do any low-level resource cleanup when QSqlQuery::finish() is called. |
|
208 \value MultipleResultSets Whether the driver can access multiple result sets returned from batched statements or stored procedures. |
|
209 |
|
210 More information about supported features can be found in the |
|
211 \l{sql-driver.html}{Qt SQL driver} documentation. |
|
212 |
|
213 \sa hasFeature() |
|
214 */ |
|
215 |
|
216 /*! |
|
217 \enum QSqlDriver::StatementType |
|
218 |
|
219 This enum contains a list of SQL statement (or clause) types the |
|
220 driver can create. |
|
221 |
|
222 \value WhereStatement An SQL \c WHERE statement (e.g., \c{WHERE f = 5}). |
|
223 \value SelectStatement An SQL \c SELECT statement (e.g., \c{SELECT f FROM t}). |
|
224 \value UpdateStatement An SQL \c UPDATE statement (e.g., \c{UPDATE TABLE t set f = 1}). |
|
225 \value InsertStatement An SQL \c INSERT statement (e.g., \c{INSERT INTO t (f) values (1)}). |
|
226 \value DeleteStatement An SQL \c DELETE statement (e.g., \c{DELETE FROM t}). |
|
227 |
|
228 \sa sqlStatement() |
|
229 */ |
|
230 |
|
231 /*! |
|
232 \enum QSqlDriver::IdentifierType |
|
233 |
|
234 This enum contains a list of SQL identifier types. |
|
235 |
|
236 \value FieldName A SQL field name |
|
237 \value TableName A SQL table name |
|
238 */ |
|
239 |
|
240 /*! |
|
241 \fn bool QSqlDriver::hasFeature(DriverFeature feature) const |
|
242 |
|
243 Returns true if the driver supports feature \a feature; otherwise |
|
244 returns false. |
|
245 |
|
246 Note that some databases need to be open() before this can be |
|
247 determined. |
|
248 |
|
249 \sa DriverFeature |
|
250 */ |
|
251 |
|
252 /*! |
|
253 This function sets the open state of the database to \a open. |
|
254 Derived classes can use this function to report the status of |
|
255 open(). |
|
256 |
|
257 \sa open(), setOpenError() |
|
258 */ |
|
259 |
|
260 void QSqlDriver::setOpen(bool open) |
|
261 { |
|
262 d_func()->isOpen = open; |
|
263 } |
|
264 |
|
265 /*! |
|
266 This function sets the open error state of the database to \a |
|
267 error. Derived classes can use this function to report the status |
|
268 of open(). Note that if \a error is true the open state of the |
|
269 database is set to closed (i.e., isOpen() returns false). |
|
270 |
|
271 \sa open(), setOpen() |
|
272 */ |
|
273 |
|
274 void QSqlDriver::setOpenError(bool error) |
|
275 { |
|
276 d_func()->isOpenError = error; |
|
277 if (error) |
|
278 d_func()->isOpen = false; |
|
279 } |
|
280 |
|
281 /*! |
|
282 This function is called to begin a transaction. If successful, |
|
283 return true, otherwise return false. The default implementation |
|
284 does nothing and returns false. |
|
285 |
|
286 \sa commitTransaction(), rollbackTransaction() |
|
287 */ |
|
288 |
|
289 bool QSqlDriver::beginTransaction() |
|
290 { |
|
291 return false; |
|
292 } |
|
293 |
|
294 /*! |
|
295 This function is called to commit a transaction. If successful, |
|
296 return true, otherwise return false. The default implementation |
|
297 does nothing and returns false. |
|
298 |
|
299 \sa beginTransaction(), rollbackTransaction() |
|
300 */ |
|
301 |
|
302 bool QSqlDriver::commitTransaction() |
|
303 { |
|
304 return false; |
|
305 } |
|
306 |
|
307 /*! |
|
308 This function is called to rollback a transaction. If successful, |
|
309 return true, otherwise return false. The default implementation |
|
310 does nothing and returns false. |
|
311 |
|
312 \sa beginTransaction(), commitTransaction() |
|
313 */ |
|
314 |
|
315 bool QSqlDriver::rollbackTransaction() |
|
316 { |
|
317 return false; |
|
318 } |
|
319 |
|
320 /*! |
|
321 This function is used to set the value of the last error, \a error, |
|
322 that occurred on the database. |
|
323 |
|
324 \sa lastError() |
|
325 */ |
|
326 |
|
327 void QSqlDriver::setLastError(const QSqlError &error) |
|
328 { |
|
329 d_func()->error = error; |
|
330 } |
|
331 |
|
332 /*! |
|
333 Returns a QSqlError object which contains information about the |
|
334 last error that occurred on the database. |
|
335 */ |
|
336 |
|
337 QSqlError QSqlDriver::lastError() const |
|
338 { |
|
339 return d_func()->error; |
|
340 } |
|
341 |
|
342 /*! |
|
343 Returns a list of the names of the tables in the database. The |
|
344 default implementation returns an empty list. |
|
345 |
|
346 The \a tableType argument describes what types of tables |
|
347 should be returned. Due to binary compatibility, the string |
|
348 contains the value of the enum QSql::TableTypes as text. |
|
349 An empty string should be treated as QSql::Tables for |
|
350 backward compatibility. |
|
351 */ |
|
352 |
|
353 QStringList QSqlDriver::tables(QSql::TableType) const |
|
354 { |
|
355 return QStringList(); |
|
356 } |
|
357 |
|
358 /*! |
|
359 Returns the primary index for table \a tableName. Returns an empty |
|
360 QSqlIndex if the table doesn't have a primary index. The default |
|
361 implementation returns an empty index. |
|
362 */ |
|
363 |
|
364 QSqlIndex QSqlDriver::primaryIndex(const QString&) const |
|
365 { |
|
366 return QSqlIndex(); |
|
367 } |
|
368 |
|
369 |
|
370 /*! |
|
371 Returns a QSqlRecord populated with the names of the fields in |
|
372 table \a tableName. If no such table exists, an empty record is |
|
373 returned. The default implementation returns an empty record. |
|
374 */ |
|
375 |
|
376 QSqlRecord QSqlDriver::record(const QString & /* tableName */) const |
|
377 { |
|
378 return QSqlRecord(); |
|
379 } |
|
380 |
|
381 /*! |
|
382 Returns the \a identifier escaped according to the database rules. |
|
383 \a identifier can either be a table name or field name, dependent |
|
384 on \a type. |
|
385 |
|
386 The default implementation does nothing. |
|
387 \sa isIdentifierEscaped() |
|
388 */ |
|
389 QString QSqlDriver::escapeIdentifier(const QString &identifier, IdentifierType) const |
|
390 { |
|
391 return identifier; |
|
392 } |
|
393 |
|
394 /*! |
|
395 Returns whether \a identifier is escaped according to the database rules. |
|
396 \a identifier can either be a table name or field name, dependent |
|
397 on \a type. |
|
398 |
|
399 \warning Because of binary compatability constraints, this function is not virtual. |
|
400 If you want to provide your own implementation in your QSqlDriver subclass, |
|
401 reimplement the isIdentifierEscapedImplementation() slot in your subclass instead. |
|
402 The isIdentifierEscapedFunction() will dynamically detect the slot and call it. |
|
403 |
|
404 \sa stripDelimiters(), escapeIdentifier() |
|
405 */ |
|
406 bool QSqlDriver::isIdentifierEscaped(const QString &identifier, IdentifierType type) const |
|
407 { |
|
408 bool result; |
|
409 QMetaObject::invokeMethod(const_cast<QSqlDriver*>(this), |
|
410 "isIdentifierEscapedImplementation", Qt::DirectConnection, |
|
411 Q_RETURN_ARG(bool, result), |
|
412 Q_ARG(QString, identifier), |
|
413 Q_ARG(IdentifierType, type)); |
|
414 return result; |
|
415 } |
|
416 |
|
417 /*! |
|
418 Returns the \a identifier with the leading and trailing delimiters removed, |
|
419 \a identifier can either be a table name or field name, |
|
420 dependent on \a type. If \a identifier does not have leading |
|
421 and trailing delimiter characters, \a identifier is returned without |
|
422 modification. |
|
423 |
|
424 \warning Because of binary compatability constraints, this function is not virtual, |
|
425 If you want to provide your own implementation in your QSqlDriver subclass, |
|
426 reimplement the stripDelimitersImplementation() slot in your subclass instead. |
|
427 The stripDelimiters() function will dynamically detect the slot and call it. |
|
428 |
|
429 \since 4.5 |
|
430 \sa isIdentifierEscaped() |
|
431 */ |
|
432 QString QSqlDriver::stripDelimiters(const QString &identifier, IdentifierType type) const |
|
433 { |
|
434 QString result; |
|
435 QMetaObject::invokeMethod(const_cast<QSqlDriver*>(this), |
|
436 "stripDelimitersImplementation", Qt::DirectConnection, |
|
437 Q_RETURN_ARG(QString, result), |
|
438 Q_ARG(QString, identifier), |
|
439 Q_ARG(IdentifierType, type)); |
|
440 return result; |
|
441 } |
|
442 |
|
443 /*! |
|
444 Returns a SQL statement of type \a type for the table \a tableName |
|
445 with the values from \a rec. If \a preparedStatement is true, the |
|
446 string will contain placeholders instead of values. |
|
447 |
|
448 This method can be used to manipulate tables without having to worry |
|
449 about database-dependent SQL dialects. For non-prepared statements, |
|
450 the values will be properly escaped. |
|
451 */ |
|
452 QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName, |
|
453 const QSqlRecord &rec, bool preparedStatement) const |
|
454 { |
|
455 int i; |
|
456 QString s; |
|
457 s.reserve(128); |
|
458 switch (type) { |
|
459 case SelectStatement: |
|
460 for (i = 0; i < rec.count(); ++i) { |
|
461 if (rec.isGenerated(i)) |
|
462 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1String(", ")); |
|
463 } |
|
464 if (s.isEmpty()) |
|
465 return s; |
|
466 s.chop(2); |
|
467 s.prepend(QLatin1String("SELECT ")).append(QLatin1String(" FROM ")).append(tableName); |
|
468 break; |
|
469 case WhereStatement: |
|
470 if (preparedStatement) { |
|
471 for (int i = 0; i < rec.count(); ++i) { |
|
472 s.append(prepareIdentifier(rec.fieldName(i), FieldName,this)); |
|
473 if (rec.isNull(i)) |
|
474 s.append(QLatin1String(" IS NULL")); |
|
475 else |
|
476 s.append(QLatin1String(" = ?")); |
|
477 s.append(QLatin1String(" AND ")); |
|
478 } |
|
479 } else { |
|
480 for (i = 0; i < rec.count(); ++i) { |
|
481 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)); |
|
482 QString val = formatValue(rec.field(i)); |
|
483 if (val == QLatin1String("NULL")) |
|
484 s.append(QLatin1String(" IS NULL")); |
|
485 else |
|
486 s.append(QLatin1String(" = ")).append(val); |
|
487 s.append(QLatin1String(" AND ")); |
|
488 } |
|
489 } |
|
490 if (!s.isEmpty()) { |
|
491 s.prepend(QLatin1String("WHERE ")); |
|
492 s.chop(5); // remove tailing AND |
|
493 } |
|
494 break; |
|
495 case UpdateStatement: |
|
496 s.append(QLatin1String("UPDATE ")).append(tableName).append( |
|
497 QLatin1String(" SET ")); |
|
498 for (i = 0; i < rec.count(); ++i) { |
|
499 if (!rec.isGenerated(i) || !rec.value(i).isValid()) |
|
500 continue; |
|
501 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1Char('=')); |
|
502 if (preparedStatement) |
|
503 s.append(QLatin1Char('?')); |
|
504 else |
|
505 s.append(formatValue(rec.field(i))); |
|
506 s.append(QLatin1String(", ")); |
|
507 } |
|
508 if (s.endsWith(QLatin1String(", "))) |
|
509 s.chop(2); |
|
510 else |
|
511 s.clear(); |
|
512 break; |
|
513 case DeleteStatement: |
|
514 s.append(QLatin1String("DELETE FROM ")).append(tableName); |
|
515 break; |
|
516 case InsertStatement: { |
|
517 s.append(QLatin1String("INSERT INTO ")).append(tableName).append(QLatin1String(" (")); |
|
518 QString vals; |
|
519 for (i = 0; i < rec.count(); ++i) { |
|
520 if (!rec.isGenerated(i) || !rec.value(i).isValid()) |
|
521 continue; |
|
522 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName, this)).append(QLatin1String(", ")); |
|
523 if (preparedStatement) |
|
524 vals.append(QLatin1Char('?')); |
|
525 else |
|
526 vals.append(formatValue(rec.field(i))); |
|
527 vals.append(QLatin1String(", ")); |
|
528 } |
|
529 if (vals.isEmpty()) { |
|
530 s.clear(); |
|
531 } else { |
|
532 vals.chop(2); // remove trailing comma |
|
533 s[s.length() - 2] = QLatin1Char(')'); |
|
534 s.append(QLatin1String("VALUES (")).append(vals).append(QLatin1Char(')')); |
|
535 } |
|
536 break; } |
|
537 } |
|
538 return s; |
|
539 } |
|
540 |
|
541 /*! |
|
542 Returns a string representation of the \a field value for the |
|
543 database. This is used, for example, when constructing INSERT and |
|
544 UPDATE statements. |
|
545 |
|
546 The default implementation returns the value formatted as a string |
|
547 according to the following rules: |
|
548 |
|
549 \list |
|
550 |
|
551 \i If \a field is character data, the value is returned enclosed |
|
552 in single quotation marks, which is appropriate for many SQL |
|
553 databases. Any embedded single-quote characters are escaped |
|
554 (replaced with two single-quote characters). If \a trimStrings is |
|
555 true (the default is false), all trailing whitespace is trimmed |
|
556 from the field. |
|
557 |
|
558 \i If \a field is date/time data, the value is formatted in ISO |
|
559 format and enclosed in single quotation marks. If the date/time |
|
560 data is invalid, "NULL" is returned. |
|
561 |
|
562 \i If \a field is \link QByteArray bytearray\endlink data, and the |
|
563 driver can edit binary fields, the value is formatted as a |
|
564 hexadecimal string. |
|
565 |
|
566 \i For any other field type, toString() is called on its value |
|
567 and the result of this is returned. |
|
568 |
|
569 \endlist |
|
570 |
|
571 \sa QVariant::toString() |
|
572 |
|
573 */ |
|
574 QString QSqlDriver::formatValue(const QSqlField &field, bool trimStrings) const |
|
575 { |
|
576 const QLatin1String nullTxt("NULL"); |
|
577 |
|
578 QString r; |
|
579 if (field.isNull()) |
|
580 r = nullTxt; |
|
581 else { |
|
582 switch (field.type()) { |
|
583 case QVariant::Int: |
|
584 case QVariant::UInt: |
|
585 if (field.value().type() == QVariant::Bool) |
|
586 r = field.value().toBool() ? QLatin1String("1") : QLatin1String("0"); |
|
587 else |
|
588 r = field.value().toString(); |
|
589 break; |
|
590 #ifndef QT_NO_DATESTRING |
|
591 case QVariant::Date: |
|
592 if (field.value().toDate().isValid()) |
|
593 r = QLatin1Char('\'') + field.value().toDate().toString(Qt::ISODate) |
|
594 + QLatin1Char('\''); |
|
595 else |
|
596 r = nullTxt; |
|
597 break; |
|
598 case QVariant::Time: |
|
599 if (field.value().toTime().isValid()) |
|
600 r = QLatin1Char('\'') + field.value().toTime().toString(Qt::ISODate) |
|
601 + QLatin1Char('\''); |
|
602 else |
|
603 r = nullTxt; |
|
604 break; |
|
605 case QVariant::DateTime: |
|
606 if (field.value().toDateTime().isValid()) |
|
607 r = QLatin1Char('\'') + |
|
608 field.value().toDateTime().toString(Qt::ISODate) + QLatin1Char('\''); |
|
609 else |
|
610 r = nullTxt; |
|
611 break; |
|
612 #endif |
|
613 case QVariant::String: |
|
614 case QVariant::Char: |
|
615 { |
|
616 QString result = field.value().toString(); |
|
617 if (trimStrings) { |
|
618 int end = result.length(); |
|
619 while (end && result.at(end-1).isSpace()) /* skip white space from end */ |
|
620 end--; |
|
621 result.truncate(end); |
|
622 } |
|
623 /* escape the "'" character */ |
|
624 result.replace(QLatin1Char('\''), QLatin1String("''")); |
|
625 r = QLatin1Char('\'') + result + QLatin1Char('\''); |
|
626 break; |
|
627 } |
|
628 case QVariant::Bool: |
|
629 r = QString::number(field.value().toBool()); |
|
630 break; |
|
631 case QVariant::ByteArray : { |
|
632 if (hasFeature(BLOB)) { |
|
633 QByteArray ba = field.value().toByteArray(); |
|
634 QString res; |
|
635 static const char hexchars[] = "0123456789abcdef"; |
|
636 for (int i = 0; i < ba.size(); ++i) { |
|
637 uchar s = (uchar) ba[i]; |
|
638 res += QLatin1Char(hexchars[s >> 4]); |
|
639 res += QLatin1Char(hexchars[s & 0x0f]); |
|
640 } |
|
641 r = QLatin1Char('\'') + res + QLatin1Char('\''); |
|
642 break; |
|
643 } |
|
644 } |
|
645 default: |
|
646 r = field.value().toString(); |
|
647 break; |
|
648 } |
|
649 } |
|
650 return r; |
|
651 } |
|
652 |
|
653 /*! |
|
654 Returns the low-level database handle wrapped in a QVariant or an |
|
655 invalid variant if there is no handle. |
|
656 |
|
657 \warning Use this with uttermost care and only if you know what you're doing. |
|
658 |
|
659 \warning The handle returned here can become a stale pointer if the connection |
|
660 is modified (for example, if you close the connection). |
|
661 |
|
662 \warning The handle can be NULL if the connection is not open yet. |
|
663 |
|
664 The handle returned here is database-dependent, you should query the type |
|
665 name of the variant before accessing it. |
|
666 |
|
667 This example retrieves the handle for a connection to sqlite: |
|
668 |
|
669 \snippet doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp 0 |
|
670 |
|
671 This snippet returns the handle for PostgreSQL or MySQL: |
|
672 |
|
673 \snippet doc/src/snippets/code/src_sql_kernel_qsqldriver.cpp 1 |
|
674 |
|
675 \sa QSqlResult::handle() |
|
676 */ |
|
677 QVariant QSqlDriver::handle() const |
|
678 { |
|
679 return QVariant(); |
|
680 } |
|
681 |
|
682 /*! |
|
683 \fn QSqlRecord QSqlDriver::record(const QSqlQuery& query) const |
|
684 |
|
685 Use query.record() instead. |
|
686 */ |
|
687 |
|
688 /*! |
|
689 \fn QSqlRecord QSqlDriver::recordInfo(const QString& tablename) const |
|
690 |
|
691 Use record() instead. |
|
692 */ |
|
693 |
|
694 /*! |
|
695 \fn QSqlRecord QSqlDriver::recordInfo(const QSqlQuery& query) const |
|
696 |
|
697 Use query.record() instead. |
|
698 */ |
|
699 |
|
700 /*! |
|
701 \fn QString QSqlDriver::nullText() const |
|
702 |
|
703 sqlStatement() is now used to generate SQL. Use tr("NULL") for example, instead. |
|
704 */ |
|
705 |
|
706 /*! |
|
707 \fn QString QSqlDriver::formatValue(const QSqlField *field, bool trimStrings) const |
|
708 |
|
709 Use the other formatValue() overload instead. |
|
710 */ |
|
711 |
|
712 /*! |
|
713 This function is called to subscribe to event notifications from the database. |
|
714 \a name identifies the event notification. |
|
715 |
|
716 If successful, return true, otherwise return false. |
|
717 |
|
718 The database must be open when this function is called. When the database is closed |
|
719 by calling close() all subscribed event notifications are automatically unsubscribed. |
|
720 Note that calling open() on an already open database may implicitly cause close() to |
|
721 be called, which will cause the driver to unsubscribe from all event notifications. |
|
722 |
|
723 When an event notification identified by \a name is posted by the database the |
|
724 notification() signal is emitted. |
|
725 |
|
726 \warning Because of binary compatibility constraints, this function is not virtual. |
|
727 If you want to provide event notification support in your own QSqlDriver subclass, |
|
728 reimplement the subscribeToNotificationImplementation() slot in your subclass instead. |
|
729 The subscribeToNotification() function will dynamically detect the slot and call it. |
|
730 |
|
731 \since 4.4 |
|
732 \sa unsubscribeFromNotification() subscribedToNotifications() QSqlDriver::hasFeature() |
|
733 */ |
|
734 bool QSqlDriver::subscribeToNotification(const QString &name) |
|
735 { |
|
736 bool result; |
|
737 QMetaObject::invokeMethod(const_cast<QSqlDriver *>(this), |
|
738 "subscribeToNotificationImplementation", Qt::DirectConnection, |
|
739 Q_RETURN_ARG(bool, result), |
|
740 Q_ARG(QString, name)); |
|
741 return result; |
|
742 } |
|
743 |
|
744 /*! |
|
745 This function is called to unsubscribe from event notifications from the database. |
|
746 \a name identifies the event notification. |
|
747 |
|
748 If successful, return true, otherwise return false. |
|
749 |
|
750 The database must be open when this function is called. All subscribed event |
|
751 notifications are automatically unsubscribed from when the close() function is called. |
|
752 |
|
753 After calling \e this function the notification() signal will no longer be emitted |
|
754 when an event notification identified by \a name is posted by the database. |
|
755 |
|
756 \warning Because of binary compatibility constraints, this function is not virtual. |
|
757 If you want to provide event notification support in your own QSqlDriver subclass, |
|
758 reimplement the unsubscribeFromNotificationImplementation() slot in your subclass instead. |
|
759 The unsubscribeFromNotification() function will dynamically detect the slot and call it. |
|
760 |
|
761 \since 4.4 |
|
762 \sa subscribeToNotification() subscribedToNotifications() |
|
763 */ |
|
764 bool QSqlDriver::unsubscribeFromNotification(const QString &name) |
|
765 { |
|
766 bool result; |
|
767 QMetaObject::invokeMethod(const_cast<QSqlDriver *>(this), |
|
768 "unsubscribeFromNotificationImplementation", Qt::DirectConnection, |
|
769 Q_RETURN_ARG(bool, result), |
|
770 Q_ARG(QString, name)); |
|
771 return result; |
|
772 } |
|
773 |
|
774 /*! |
|
775 Returns a list of the names of the event notifications that are currently subscribed to. |
|
776 |
|
777 \warning Because of binary compatibility constraints, this function is not virtual. |
|
778 If you want to provide event notification support in your own QSqlDriver subclass, |
|
779 reimplement the subscribedToNotificationsImplementation() slot in your subclass instead. |
|
780 The subscribedToNotifications() function will dynamically detect the slot and call it. |
|
781 |
|
782 \since 4.4 |
|
783 \sa subscribeToNotification() unsubscribeFromNotification() |
|
784 */ |
|
785 QStringList QSqlDriver::subscribedToNotifications() const |
|
786 { |
|
787 QStringList result; |
|
788 QMetaObject::invokeMethod(const_cast<QSqlDriver *>(this), |
|
789 "subscribedToNotificationsImplementation", Qt::DirectConnection, |
|
790 Q_RETURN_ARG(QStringList, result)); |
|
791 return result; |
|
792 } |
|
793 |
|
794 /*! |
|
795 This slot is called to subscribe to event notifications from the database. |
|
796 \a name identifies the event notification. |
|
797 |
|
798 If successful, return true, otherwise return false. |
|
799 |
|
800 The database must be open when this \e slot is called. When the database is closed |
|
801 by calling close() all subscribed event notifications are automatically unsubscribed. |
|
802 Note that calling open() on an already open database may implicitly cause close() to |
|
803 be called, which will cause the driver to unsubscribe from all event notifications. |
|
804 |
|
805 When an event notification identified by \a name is posted by the database the |
|
806 notification() signal is emitted. |
|
807 |
|
808 Reimplement this slot to provide your own QSqlDriver subclass with event notification |
|
809 support; because of binary compatibility constraints, the subscribeToNotification() |
|
810 function (introduced in Qt 4.4) is not virtual. Instead, subscribeToNotification() |
|
811 will dynamically detect and call \e this slot. The default implementation does nothing |
|
812 and returns false. |
|
813 |
|
814 \since 4.4 |
|
815 \sa subscribeToNotification() |
|
816 */ |
|
817 bool QSqlDriver::subscribeToNotificationImplementation(const QString &name) |
|
818 { |
|
819 Q_UNUSED(name); |
|
820 return false; |
|
821 } |
|
822 |
|
823 /*! |
|
824 This slot is called to unsubscribe from event notifications from the database. |
|
825 \a name identifies the event notification. |
|
826 |
|
827 If successful, return true, otherwise return false. |
|
828 |
|
829 The database must be open when \e this slot is called. All subscribed event |
|
830 notifications are automatically unsubscribed from when the close() function is called. |
|
831 |
|
832 After calling \e this slot the notification() signal will no longer be emitted |
|
833 when an event notification identified by \a name is posted by the database. |
|
834 |
|
835 Reimplement this slot to provide your own QSqlDriver subclass with event notification |
|
836 support; because of binary compatibility constraints, the unsubscribeFromNotification() |
|
837 function (introduced in Qt 4.4) is not virtual. Instead, unsubscribeFromNotification() |
|
838 will dynamically detect and call \e this slot. The default implementation does nothing |
|
839 and returns false. |
|
840 |
|
841 \since 4.4 |
|
842 \sa unsubscribeFromNotification() |
|
843 */ |
|
844 bool QSqlDriver::unsubscribeFromNotificationImplementation(const QString &name) |
|
845 { |
|
846 Q_UNUSED(name); |
|
847 return false; |
|
848 } |
|
849 |
|
850 /*! |
|
851 Returns a list of the names of the event notifications that are currently subscribed to. |
|
852 |
|
853 Reimplement this slot to provide your own QSqlDriver subclass with event notification |
|
854 support; because of binary compatibility constraints, the subscribedToNotifications() |
|
855 function (introduced in Qt 4.4) is not virtual. Instead, subscribedToNotifications() |
|
856 will dynamically detect and call \e this slot. The default implementation simply |
|
857 returns an empty QStringList. |
|
858 |
|
859 \since 4.4 |
|
860 \sa subscribedToNotifications() |
|
861 */ |
|
862 QStringList QSqlDriver::subscribedToNotificationsImplementation() const |
|
863 { |
|
864 return QStringList(); |
|
865 } |
|
866 |
|
867 /*! |
|
868 \since 4.6 |
|
869 |
|
870 This slot returns whether \a identifier is escaped according to the database rules. |
|
871 \a identifier can either be a table name or field name, dependent |
|
872 on \a type. |
|
873 |
|
874 Because of binary compatability constraints, isIdentifierEscaped() function |
|
875 (introduced in Qt 4.5) is not virtual. Instead, isIdentifierEscaped() will |
|
876 dynamically detect and call \e this slot. The default implementation |
|
877 assumes the escape/delimiter character is a double quote. Reimplement this |
|
878 slot in your own QSqlDriver if your database engine uses a different |
|
879 delimiter character. |
|
880 |
|
881 \sa isIdentifierEscaped() |
|
882 */ |
|
883 bool QSqlDriver::isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const |
|
884 { |
|
885 Q_UNUSED(type); |
|
886 return identifier.size() > 2 |
|
887 && identifier.startsWith(QLatin1Char('"')) //left delimited |
|
888 && identifier.endsWith(QLatin1Char('"')); //right delimited |
|
889 } |
|
890 |
|
891 /*! |
|
892 \since 4.6 |
|
893 |
|
894 This slot returns \a identifier with the leading and trailing delimiters removed, |
|
895 \a identifier can either be a tablename or field name, dependent on \a type. |
|
896 If \a identifier does not have leading and trailing delimiter characters, \a |
|
897 identifier is returned without modification. |
|
898 |
|
899 Because of binary compatability constraints, the stripDelimiters() function |
|
900 (introduced in Qt 4.5) is not virtual. Instead, stripDelimiters() will |
|
901 dynamically detect and call \e this slot. It generally unnecessary |
|
902 to reimplement this slot. |
|
903 |
|
904 \sa stripDelimiters() |
|
905 */ |
|
906 QString QSqlDriver::stripDelimitersImplementation(const QString &identifier, IdentifierType type) const |
|
907 { |
|
908 QString ret; |
|
909 if (this->isIdentifierEscaped(identifier, type)) { |
|
910 ret = identifier.mid(1); |
|
911 ret.chop(1); |
|
912 } else { |
|
913 ret = identifier; |
|
914 } |
|
915 return ret; |
|
916 } |
|
917 |
|
918 /*! |
|
919 \since 4.6 |
|
920 |
|
921 Sets the default numerical precision policy used by queries created |
|
922 by this driver to \a precisionPolicy. |
|
923 |
|
924 Note: Setting the default precision policy to \a precisionPolicy |
|
925 doesn't affect any currently active queries. |
|
926 |
|
927 \sa QSql::NumericalPrecisionPolicy, numericalPrecisionPolicy(), |
|
928 QSqlQuery::setNumericalPrecisionPolicy(), QSqlQuery::numericalPrecisionPolicy() |
|
929 */ |
|
930 void QSqlDriver::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy precisionPolicy) |
|
931 { |
|
932 d_func()->precisionPolicy = precisionPolicy; |
|
933 } |
|
934 |
|
935 /*! |
|
936 \since 4.6 |
|
937 |
|
938 Returns the current default precision policy for the database connection. |
|
939 |
|
940 \sa QSql::NumericalPrecisionPolicy, setNumericalPrecisionPolicy(), |
|
941 QSqlQuery::numericalPrecisionPolicy(), QSqlQuery::setNumericalPrecisionPolicy() |
|
942 */ |
|
943 QSql::NumericalPrecisionPolicy QSqlDriver::numericalPrecisionPolicy() const |
|
944 { |
|
945 return d_func()->precisionPolicy; |
|
946 } |
|
947 |
|
948 QT_END_NAMESPACE |