Changeset 561 for trunk/src/sql/drivers/mysql
- Timestamp:
- Feb 11, 2010, 11:19:06 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/vendor/nokia/qt/4.6.1 merged eligible /branches/vendor/nokia/qt/current merged eligible /branches/vendor/trolltech/qt/current 3-149
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
trunk/src/sql/drivers/mysql/qsql_mysql.cpp
r2 r561 2 2 ** 3 3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 4 ** Contact: Qt Software Information (qt-info@nokia.com) 4 ** All rights reserved. 5 ** Contact: Nokia Corporation (qt-info@nokia.com) 5 6 ** 6 7 ** This file is part of the QtSql module of the Qt Toolkit. … … 21 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 22 23 ** 23 ** In addition, as a special exception, Nokia gives you certain 24 ** additional rights. These rights are described in the Nokia Qt LGPL 25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this 26 ** package. 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 27 ** 28 28 ** GNU General Public License Usage … … 34 34 ** met: http://www.gnu.org/copyleft/gpl.html. 35 35 ** 36 ** If you are unsure which license is appropriate for your use, please37 ** contact the sales department at qt-sales@nokia.com.36 ** If you have questions regarding the use of this file, please contact 37 ** Nokia at qt-info@nokia.com. 38 38 ** $QT_END_LICENSE$ 39 39 ** … … 86 86 tc(0), 87 87 #endif 88 preparedQuerys (false), preparedQuerysEnabled(false) {}88 preparedQuerysEnabled(false) {} 89 89 MYSQL *mysql; 90 90 QTextCodec *tc; 91 91 92 bool preparedQuerys;93 92 bool preparedQuerysEnabled; 94 93 }; … … 164 163 } 165 164 166 class QMYSQLResultPrivate 167 { 165 class QMYSQLResultPrivate : public QObject 166 { 167 Q_OBJECT 168 168 public: 169 QMYSQLResultPrivate( QMYSQLDriverPrivate* dp) : d(dp), result(0),169 QMYSQLResultPrivate(const QMYSQLDriver* dp, const QMYSQLResult* d) : driver(dp), result(0), q(d), 170 170 rowsAffected(0), hasBlobs(false) 171 171 #if MYSQL_VERSION_ID >= 40108 172 172 , stmt(0), meta(0), inBinds(0), outBinds(0) 173 173 #endif 174 , precisionPolicy(QSql::HighPrecision) 175 {} 176 177 QMYSQLDriverPrivate* d; 174 , preparedQuery(false) 175 { 176 connect(dp, SIGNAL(destroyed()), this, SLOT(driverDestroyed())); 177 } 178 179 const QMYSQLDriver* driver; 178 180 MYSQL_RES *result; 179 181 MYSQL_ROW row; 182 const QMYSQLResult* q; 180 183 181 184 int rowsAffected; … … 207 210 MYSQL_BIND *outBinds; 208 211 #endif 209 QSql::NumericalPrecisionPolicy precisionPolicy; 212 213 bool preparedQuery; 214 215 private Q_SLOTS: 216 void driverDestroyed() { driver = NULL; } 210 217 }; 211 218 … … 225 232 const QMYSQLDriverPrivate* p) 226 233 { 227 const char *cerr = mysql_error(p->mysql);234 const char *cerr = p->mysql ? mysql_error(p->mysql) : 0; 228 235 return QSqlError(QLatin1String("QMYSQL: ") + err, 229 236 p->tc ? toUnicode(p->tc, cerr) : QString::fromLatin1(cerr), … … 250 257 case FIELD_TYPE_FLOAT : 251 258 case FIELD_TYPE_DOUBLE : 259 case FIELD_TYPE_DECIMAL : 260 #if defined(FIELD_TYPE_NEWDECIMAL) 261 case FIELD_TYPE_NEWDECIMAL: 262 #endif 252 263 type = QVariant::Double; 253 264 break; … … 273 284 case FIELD_TYPE_ENUM : 274 285 case FIELD_TYPE_SET : 275 case FIELD_TYPE_DECIMAL :276 286 type = QVariant::String; 277 287 break; … … 350 360 QMyField &f = fields[i]; 351 361 f.myField = fieldInfo; 362 352 363 f.type = qDecodeMYSQLType(fieldInfo->type, fieldInfo->flags); 353 364 if (qIsBlob(fieldInfo->type)) { … … 380 391 : QSqlResult(db) 381 392 { 382 d = new QMYSQLResultPrivate(db ->d);393 d = new QMYSQLResultPrivate(db, this); 383 394 } 384 395 … … 392 403 { 393 404 #if MYSQL_VERSION_ID >= 40108 394 if(d-> d->preparedQuerys)405 if(d->preparedQuery) 395 406 return d->meta ? qVariantFromValue(d->meta) : qVariantFromValue(d->stmt); 396 407 else … … 407 418 // if this isn't done subsequent queries will fail with "Commands out of sync" 408 419 #if MYSQL_VERSION_ID >= 40100 409 while (d->d ->mysql && mysql_next_result(d->d->mysql) == 0) {410 MYSQL_RES *res = mysql_store_result(d->d ->mysql);420 while (d->driver && d->driver->d->mysql && mysql_next_result(d->driver->d->mysql) == 0) { 421 MYSQL_RES *res = mysql_store_result(d->driver->d->mysql); 411 422 if (res) 412 423 mysql_free_result(res); … … 447 458 setAt(-1); 448 459 setActive(false); 449 450 d->d->preparedQuerys = d->d->preparedQuerysEnabled;451 460 } 452 461 453 462 bool QMYSQLResult::fetch(int i) 454 463 { 464 if(!d->driver) 465 return false; 455 466 if (isForwardOnly()) { // fake a forward seek 456 467 if (at() < i) { … … 464 475 if (at() == i) 465 476 return true; 466 if (d-> d->preparedQuerys) {477 if (d->preparedQuery) { 467 478 #if MYSQL_VERSION_ID >= 40108 468 479 mysql_stmt_data_seek(d->stmt, i); … … 495 506 bool QMYSQLResult::fetchNext() 496 507 { 497 if (d->d->preparedQuerys) { 508 if(!d->driver) 509 return false; 510 if (d->preparedQuery) { 498 511 #if MYSQL_VERSION_ID >= 40108 499 if (mysql_stmt_fetch(d->stmt)) 512 int nRC = mysql_stmt_fetch(d->stmt); 513 if (nRC) { 514 #ifdef MYSQL_DATA_TRUNCATED 515 if (nRC == 1 || nRC == MYSQL_DATA_TRUNCATED) 516 #else 517 if (nRC == 1) 518 #endif // MYSQL_DATA_TRUNCATED 519 setLastError(qMakeStmtError(QCoreApplication::translate("QMYSQLResult", 520 "Unable to fetch data"), QSqlError::StatementError, d->stmt)); 500 521 return false; 522 } 501 523 #else 502 524 return false; 503 525 #endif 504 526 } else { 505 d->row = mysql_fetch_row(d->result);506 if (!d->row)507 return false;527 d->row = mysql_fetch_row(d->result); 528 if (!d->row) 529 return false; 508 530 } 509 531 setAt(at() + 1); … … 513 535 bool QMYSQLResult::fetchLast() 514 536 { 537 if(!d->driver) 538 return false; 515 539 if (isForwardOnly()) { // fake this since MySQL can't seek on forward only queries 516 540 bool success = fetchNext(); // did we move at all? … … 520 544 521 545 my_ulonglong numRows; 522 if (d-> d->preparedQuerys) {546 if (d->preparedQuery) { 523 547 #if MYSQL_VERSION_ID >= 40108 524 548 numRows = mysql_stmt_num_rows(d->stmt); … … 554 578 } 555 579 580 if (!d->driver) 581 return QVariant(); 582 556 583 int fieldLength = 0; 557 584 const QMYSQLResultPrivate::QMyField &f = d->fields.at(field); 558 585 QString val; 559 if (d-> d->preparedQuerys) {586 if (d->preparedQuery) { 560 587 if (f.nullIndicator) 561 588 return QVariant(f.type); 562 589 563 590 if (f.type != QVariant::ByteArray) 564 val = toUnicode(d->d ->tc, f.outField, f.bufLength);591 val = toUnicode(d->driver->d->tc, f.outField, f.bufLength); 565 592 } else { 566 593 if (d->row[field] == NULL) { … … 570 597 fieldLength = mysql_fetch_lengths(d->result)[field]; 571 598 if (f.type != QVariant::ByteArray) 572 val = toUnicode(d->d ->tc, d->row[field], fieldLength);599 val = toUnicode(d->driver->d->tc, d->row[field], fieldLength); 573 600 } 574 601 … … 585 612 QVariant v; 586 613 bool ok=false; 587 switch(d->precisionPolicy) { 614 double dbl = val.toDouble(&ok); 615 switch(numericalPrecisionPolicy()) { 588 616 case QSql::LowPrecisionInt32: 589 v= val.toInt(&ok);617 v=QVariant(dbl).toInt(); 590 618 break; 591 619 case QSql::LowPrecisionInt64: 592 v = val.toLongLong(&ok);620 v = QVariant(dbl).toLongLong(); 593 621 break; 594 622 case QSql::LowPrecisionDouble: 595 v = val.toDouble(&ok);623 v = QVariant(dbl); 596 624 break; 597 625 case QSql::HighPrecision: … … 606 634 return QVariant(); 607 635 } 636 return QVariant(val.toDouble()); 608 637 case QVariant::Date: 609 638 return qDateFromString(val); … … 615 644 616 645 QByteArray ba; 617 if (d-> d->preparedQuerys) {646 if (d->preparedQuery) { 618 647 ba = QByteArray(f.outField, f.bufLength); 619 648 } else { … … 632 661 bool QMYSQLResult::isNull(int field) 633 662 { 634 if (d-> d->preparedQuerys)663 if (d->preparedQuery) 635 664 return d->fields.at(field).nullIndicator; 636 665 else … … 640 669 bool QMYSQLResult::reset (const QString& query) 641 670 { 642 if (!driver() || !driver()->isOpen() || driver()->isOpenError()) 643 return false; 644 645 if(d->d->preparedQuerysEnabled && prepare(query)) { 646 d->d->preparedQuerys = true; 647 return exec(); 648 } 649 d->d->preparedQuerys = false; 650 651 const QByteArray encQuery(fromUnicode(d->d->tc, query)); 652 if (mysql_real_query(d->d->mysql, encQuery.data(), encQuery.length())) { 671 if (!driver() || !driver()->isOpen() || driver()->isOpenError() || !d->driver) 672 return false; 673 674 d->preparedQuery = false; 675 676 cleanup(); 677 678 const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); 679 if (mysql_real_query(d->driver->d->mysql, encQuery.data(), encQuery.length())) { 653 680 setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute query"), 654 QSqlError::StatementError, d->d ));655 return false; 656 } 657 d->result = mysql_store_result(d->d ->mysql);658 if (!d->result && mysql_field_count(d->d ->mysql) > 0) {681 QSqlError::StatementError, d->driver->d)); 682 return false; 683 } 684 d->result = mysql_store_result(d->driver->d->mysql); 685 if (!d->result && mysql_field_count(d->driver->d->mysql) > 0) { 659 686 setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store result"), 660 QSqlError::StatementError, d->d ));661 return false; 662 } 663 int numFields = mysql_field_count(d->d ->mysql);687 QSqlError::StatementError, d->driver->d)); 688 return false; 689 } 690 int numFields = mysql_field_count(d->driver->d->mysql); 664 691 setSelect(numFields != 0); 665 692 d->fields.resize(numFields); 666 d->rowsAffected = mysql_affected_rows(d->d->mysql); 693 d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); 694 667 695 if (isSelect()) { 668 696 for(int i = 0; i < numFields; i++) { … … 678 706 int QMYSQLResult::size() 679 707 { 680 if ( isSelect())681 if (d-> d->preparedQuerys)708 if (d->driver && isSelect()) 709 if (d->preparedQuery) 682 710 #if MYSQL_VERSION_ID >= 40108 683 711 return mysql_stmt_num_rows(d->stmt); … … 698 726 QVariant QMYSQLResult::lastInsertId() const 699 727 { 700 if (!isActive() )728 if (!isActive() || !d->driver) 701 729 return QVariant(); 702 730 703 if (d-> d->preparedQuerys) {731 if (d->preparedQuery) { 704 732 #if MYSQL_VERSION_ID >= 40108 705 733 quint64 id = mysql_stmt_insert_id(d->stmt); … … 708 736 #endif 709 737 } else { 710 quint64 id = mysql_insert_id(d->d ->mysql);738 quint64 id = mysql_insert_id(d->driver->d->mysql); 711 739 if (id) 712 740 return QVariant(id); … … 719 747 QSqlRecord info; 720 748 MYSQL_RES *res; 721 if (!isActive() || !isSelect() )749 if (!isActive() || !isSelect() || !d->driver) 722 750 return info; 723 751 724 752 #if MYSQL_VERSION_ID >= 40108 725 res = d-> d->preparedQuerys? d->meta : d->result;753 res = d->preparedQuery ? d->meta : d->result; 726 754 #else 727 755 res = d->result; 728 756 #endif 729 757 730 if (!mysql_errno(d->d ->mysql)) {758 if (!mysql_errno(d->driver->d->mysql)) { 731 759 mysql_field_seek(res, 0); 732 760 MYSQL_FIELD* field = mysql_fetch_field(res); 733 761 while(field) { 734 info.append(qToField(field, d->d ->tc));762 info.append(qToField(field, d->driver->d->tc)); 735 763 field = mysql_fetch_field(res); 736 764 } … … 742 770 bool QMYSQLResult::nextResult() 743 771 { 772 if(!d->driver) 773 return false; 744 774 #if MYSQL_VERSION_ID >= 40100 745 775 setAt(-1); … … 755 785 d->fields.clear(); 756 786 757 int status = mysql_next_result(d->d ->mysql);787 int status = mysql_next_result(d->driver->d->mysql); 758 788 if (status > 0) { 759 789 setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute next query"), 760 QSqlError::StatementError, d->d ));790 QSqlError::StatementError, d->driver->d)); 761 791 return false; 762 792 } else if (status == -1) { … … 764 794 } 765 795 766 d->result = mysql_store_result(d->d ->mysql);767 int numFields = mysql_field_count(d->d ->mysql);796 d->result = mysql_store_result(d->driver->d->mysql); 797 int numFields = mysql_field_count(d->driver->d->mysql); 768 798 if (!d->result && numFields > 0) { 769 799 setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store next result"), 770 QSqlError::StatementError, d->d ));800 QSqlError::StatementError, d->driver->d)); 771 801 return false; 772 802 } … … 774 804 setSelect(numFields > 0); 775 805 d->fields.resize(numFields); 776 d->rowsAffected = mysql_affected_rows(d->d ->mysql);806 d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); 777 807 778 808 if (isSelect()) { … … 797 827 *static_cast<bool*>(data) = nextResult(); 798 828 break; 799 case QSqlResult::SetNumericalPrecision:800 Q_ASSERT(data);801 d->precisionPolicy = *reinterpret_cast<QSql::NumericalPrecisionPolicy *>(data);802 break;803 829 default: 804 830 QSqlResult::virtual_hook(id, data); … … 834 860 bool QMYSQLResult::prepare(const QString& query) 835 861 { 862 if(!d->driver) 863 return false; 836 864 #if MYSQL_VERSION_ID >= 40108 837 865 cleanup(); 838 if (!d->d ->preparedQuerys)866 if (!d->driver->d->preparedQuerysEnabled) 839 867 return QSqlResult::prepare(query); 840 868 … … 845 873 846 874 if (!d->stmt) 847 d->stmt = mysql_stmt_init(d->d ->mysql);875 d->stmt = mysql_stmt_init(d->driver->d->mysql); 848 876 if (!d->stmt) { 849 877 setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to prepare statement"), 850 QSqlError::StatementError, d->d ));851 return false; 852 } 853 854 const QByteArray encQuery(fromUnicode(d->d ->tc, query));878 QSqlError::StatementError, d->driver->d)); 879 return false; 880 } 881 882 const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); 855 883 r = mysql_stmt_prepare(d->stmt, encQuery.constData(), encQuery.length()); 856 884 if (r != 0) { … … 866 894 867 895 setSelect(d->bindInValues()); 896 d->preparedQuery = true; 868 897 return true; 869 898 #else … … 874 903 bool QMYSQLResult::exec() 875 904 { 876 if (!d->d->preparedQuerys) 905 if (!d->driver) 906 return false; 907 if (!d->preparedQuery) 877 908 return QSqlResult::exec(); 878 909 if (!d->stmt) … … 907 938 currBind->is_null = &nullVector[i]; 908 939 currBind->length = 0; 940 currBind->is_unsigned = 0; 909 941 910 942 switch (val.type()) { … … 953 985 currBind->buffer = data; 954 986 currBind->buffer_length = sizeof(double); 955 currBind->is_unsigned = 0;956 987 break; 957 988 case QVariant::LongLong: … … 964 995 case QVariant::String: 965 996 default: { 966 QByteArray ba = fromUnicode(d->d ->tc, val.toString());997 QByteArray ba = fromUnicode(d->driver->d->tc, val.toString()); 967 998 stringVector.append(ba); 968 999 currBind->buffer_type = MYSQL_TYPE_STRING; 969 1000 currBind->buffer = const_cast<char *>(ba.constData()); 970 1001 currBind->buffer_length = ba.length(); 971 currBind->is_unsigned = 0;972 1002 break; } 973 1003 } … … 1129 1159 case BatchOperations: 1130 1160 case SimpleLocking: 1131 case LowPrecisionNumbers:1132 1161 case EventNotifications: 1133 1162 case FinishQuery: … … 1137 1166 case LastInsertId: 1138 1167 case Unicode: 1168 case LowPrecisionNumbers: 1139 1169 return true; 1140 1170 case PreparedQueries: … … 1193 1223 const QStringList opts(connOpts.split(QLatin1Char(';'), QString::SkipEmptyParts)); 1194 1224 QString unixSocket; 1225 #if MYSQL_VERSION_ID >= 50000 1226 my_bool reconnect=false; 1227 #endif 1195 1228 1196 1229 // extract the real options from the string … … 1203 1236 if (opt == QLatin1String("UNIX_SOCKET")) 1204 1237 unixSocket = val; 1238 #if MYSQL_VERSION_ID >= 50000 1239 else if (opt == QLatin1String("MYSQL_OPT_RECONNECT")) { 1240 if (val == QLatin1String("TRUE") || val == QLatin1String("1") || val.isEmpty()) 1241 reconnect = true; 1242 } 1243 #endif 1205 1244 else if (val == QLatin1String("TRUE") || val == QLatin1String("1")) 1206 1245 setOptionFlag(optionFlags, tmp.left(idx).simplified()); … … 1235 1274 return false; 1236 1275 } 1276 #if MYSQL_VERSION_ID >= 50000 1277 if(reconnect) 1278 mysql_options(d->mysql, MYSQL_OPT_RECONNECT, &reconnect); 1279 #endif 1237 1280 } else { 1238 1281 setLastError(qMakeError(tr("Unable to connect"), … … 1259 1302 #endif 1260 1303 1304 #ifndef QT_NO_THREAD 1305 mysql_thread_init(); 1306 #endif 1307 1308 1261 1309 setOpen(true); 1262 1310 setOpenError(false); … … 1267 1315 { 1268 1316 if (isOpen()) { 1317 #ifndef QT_NO_THREAD 1318 mysql_thread_end(); 1319 #endif 1269 1320 mysql_close(d->mysql); 1270 1321 d->mysql = NULL; … … 1282 1333 { 1283 1334 QStringList tl; 1284 if (!isOpen()) 1285 return tl; 1286 if (!(type & QSql::Tables)) 1287 return tl; 1288 1289 MYSQL_RES* tableRes = mysql_list_tables(d->mysql, NULL); 1290 MYSQL_ROW row; 1291 int i = 0; 1292 while (tableRes) { 1293 mysql_data_seek(tableRes, i); 1294 row = mysql_fetch_row(tableRes); 1295 if (!row) 1296 break; 1297 tl.append(toUnicode(d->tc, row[0])); 1298 i++; 1299 } 1300 mysql_free_result(tableRes); 1335 #if MYSQL_VERSION_ID >= 40100 1336 if( mysql_get_server_version(d->mysql) < 50000) 1337 { 1338 #endif 1339 if (!isOpen()) 1340 return tl; 1341 if (!(type & QSql::Tables)) 1342 return tl; 1343 1344 MYSQL_RES* tableRes = mysql_list_tables(d->mysql, NULL); 1345 MYSQL_ROW row; 1346 int i = 0; 1347 while (tableRes) { 1348 mysql_data_seek(tableRes, i); 1349 row = mysql_fetch_row(tableRes); 1350 if (!row) 1351 break; 1352 tl.append(toUnicode(d->tc, row[0])); 1353 i++; 1354 } 1355 mysql_free_result(tableRes); 1356 #if MYSQL_VERSION_ID >= 40100 1357 } else { 1358 QSqlQuery q(createResult()); 1359 if(type & QSql::Tables) { 1360 q.exec(QLatin1String("select table_name from information_schema.tables where table_type = 'BASE TABLE'")); 1361 while(q.next()) 1362 tl.append(q.value(0).toString()); 1363 } 1364 if(type & QSql::Views) { 1365 q.exec(QLatin1String("select table_name from information_schema.tables where table_type = 'VIEW'")); 1366 while(q.next()) 1367 tl.append(q.value(0).toString()); 1368 } 1369 } 1370 #endif 1301 1371 return tl; 1302 1372 } … … 1305 1375 { 1306 1376 QSqlIndex idx; 1307 bool prepQ;1308 1377 if (!isOpen()) 1309 1378 return idx; 1310 1311 prepQ = d->preparedQuerys;1312 d->preparedQuerys = false;1313 1379 1314 1380 QSqlQuery i(createResult()); 1315 1381 QString stmt(QLatin1String("show index from %1;")); 1316 1382 QSqlRecord fil = record(tablename); 1317 i.exec(stmt.arg( escapeIdentifier(tablename, QSqlDriver::TableName)));1383 i.exec(stmt.arg(tablename)); 1318 1384 while (i.isActive() && i.next()) { 1319 1385 if (i.value(2).toString() == QLatin1String("PRIMARY")) { … … 1324 1390 } 1325 1391 1326 d->preparedQuerys = prepQ;1327 1392 return idx; 1328 1393 } … … 1330 1395 QSqlRecord QMYSQLDriver::record(const QString& tablename) const 1331 1396 { 1397 QString table=tablename; 1398 if(isIdentifierEscaped(table, QSqlDriver::TableName)) 1399 table = stripDelimiters(table, QSqlDriver::TableName); 1400 1332 1401 QSqlRecord info; 1333 1402 if (!isOpen()) 1334 1403 return info; 1335 MYSQL_RES* r = mysql_list_fields(d->mysql, table name.toLocal8Bit().constData(), 0);1404 MYSQL_RES* r = mysql_list_fields(d->mysql, table.toLocal8Bit().constData(), 0); 1336 1405 if (!r) { 1337 1406 return info; 1338 1407 } 1339 1408 MYSQL_FIELD* field; 1409 1340 1410 while ((field = mysql_fetch_field(r))) 1341 1411 info.append(qToField(field, d->tc)); … … 1437 1507 { 1438 1508 QString res = identifier; 1439 if(!identifier.isEmpty() && identifier.left(1) != QString(QLatin1Char('`')) && identifier.right(1) != QString(QLatin1Char('`')) ) {1509 if(!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('`')) && !identifier.endsWith(QLatin1Char('`')) ) { 1440 1510 res.prepend(QLatin1Char('`')).append(QLatin1Char('`')); 1441 1511 res.replace(QLatin1Char('.'), QLatin1String("`.`")); … … 1444 1514 } 1445 1515 1516 bool QMYSQLDriver::isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const 1517 { 1518 Q_UNUSED(type); 1519 return identifier.size() > 2 1520 && identifier.startsWith(QLatin1Char('`')) //left delimited 1521 && identifier.endsWith(QLatin1Char('`')); //right delimited 1522 } 1523 1446 1524 QT_END_NAMESPACE 1525 1526 #include "qsql_mysql.moc" -
trunk/src/sql/drivers/mysql/qsql_mysql.h
r2 r561 2 2 ** 3 3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). 4 ** Contact: Qt Software Information (qt-info@nokia.com) 4 ** All rights reserved. 5 ** Contact: Nokia Corporation (qt-info@nokia.com) 5 6 ** 6 7 ** This file is part of the QtSql module of the Qt Toolkit. … … 21 22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 22 23 ** 23 ** In addition, as a special exception, Nokia gives you certain 24 ** additional rights. These rights are described in the Nokia Qt LGPL 25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this 26 ** package. 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 27 ** 28 28 ** GNU General Public License Usage … … 34 34 ** met: http://www.gnu.org/copyleft/gpl.html. 35 35 ** 36 ** If you are unsure which license is appropriate for your use, please37 ** contact the sales department at qt-sales@nokia.com.36 ** If you have questions regarding the use of this file, please contact 37 ** Nokia at qt-info@nokia.com. 38 38 ** $QT_END_LICENSE$ 39 39 ** … … 70 70 { 71 71 friend class QMYSQLDriver; 72 friend class QMYSQLResultPrivate; 72 73 public: 73 74 explicit QMYSQLResult(const QMYSQLDriver* db); … … 124 125 QString escapeIdentifier(const QString &identifier, IdentifierType type) const; 125 126 127 protected Q_SLOTS: 128 bool isIdentifierEscapedImplementation(const QString &identifier, IdentifierType type) const; 129 126 130 protected: 127 131 bool beginTransaction();
Note:
See TracChangeset
for help on using the changeset viewer.