21 QSqlDriver::IdentifierType type,
const QSqlDriver *driver)
23 Q_ASSERT(driver !=
nullptr);
24 QString ret = identifier;
25 if (!driver->isIdentifierEscaped(identifier, type))
26 ret = driver->escapeIdentifier(identifier, type);
394bool QSqlDriver::isIdentifierEscaped(
const QString &identifier, IdentifierType type)
const
397 return identifier.size() > 2
398 && identifier.startsWith(u'"')
399 && identifier.endsWith(u'"');
449QString QSqlDriver::sqlStatement(StatementType type,
const QString &tableName,
450 const QSqlRecord &rec,
bool preparedStatement)
const
452 const auto tableNameString = tableName.isEmpty() ? QString()
453 : prepareIdentifier(tableName, QSqlDriver::TableName,
this);
457 case SelectStatement:
458 for (qsizetype i = 0; i < rec.count(); ++i) {
459 if (rec.isGenerated(i))
460 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(
", "_L1);
465 s =
"SELECT "_L1 + s +
" FROM "_L1 + tableNameString;
469 const QString tableNamePrefix = tableNameString.isEmpty()
470 ? QString() : tableNameString + u'.';
471 for (qsizetype i = 0; i < rec.count(); ++i) {
472 if (!rec.isGenerated(i))
474 s.append(s.isEmpty() ?
"WHERE "_L1 :
" AND "_L1);
475 s.append(tableNamePrefix);
476 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this));
478 s.append(
" IS NULL"_L1);
479 else if (preparedStatement)
482 s.append(
" = "_L1).append(formatValue(rec.field(i)));
486 case UpdateStatement:
487 s = s +
"UPDATE "_L1 + tableNameString +
" SET "_L1;
488 for (qsizetype i = 0; i < rec.count(); ++i) {
489 if (!rec.isGenerated(i))
491 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(u'=');
492 if (preparedStatement)
495 s.append(formatValue(rec.field(i)));
498 if (s.endsWith(
", "_L1))
503 case DeleteStatement:
504 s = s +
"DELETE FROM "_L1 + tableNameString;
506 case InsertStatement: {
507 s = s +
"INSERT INTO "_L1 + tableNameString +
" ("_L1;
509 for (qsizetype i = 0; i < rec.count(); ++i) {
510 if (!rec.isGenerated(i))
512 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(
", "_L1);
513 if (preparedStatement)
516 vals.append(formatValue(rec.field(i)));
517 vals.append(
", "_L1);
519 if (vals.isEmpty()) {
523 s[s.size() - 2] = u')';
524 s.append(
"VALUES ("_L1).append(vals).append(u')');
564QString QSqlDriver::formatValue(
const QSqlField &field,
bool trimStrings)
const
566 const auto nullTxt =
"NULL"_L1;
572 switch (field.metaType().id()) {
574 case QMetaType::UInt:
575 if (field.value().userType() == QMetaType::Bool)
576 r = field.value().toBool() ?
"1"_L1 :
"0"_L1;
578 r = field.value().toString();
580#if QT_CONFIG(datestring)
581 case QMetaType::QDate:
582 if (field.value().toDate().isValid())
583 r = u'\'' + field.value().toDate().toString(Qt::ISODate) + u'\'';
587 case QMetaType::QTime:
588 if (field.value().toTime().isValid())
589 r = u'\'' + field.value().toTime().toString(Qt::ISODate) + u'\'';
593 case QMetaType::QDateTime:
594 if (field.value().toDateTime().isValid())
595 r = u'\'' + field.value().toDateTime().toString(Qt::ISODate) + u'\'';
600 case QMetaType::QString:
601 case QMetaType::QChar:
603 QString result = field.value().toString();
605 int end = result.size();
606 while (end && result.at(end-1).isSpace())
608 result.truncate(end);
611 result.replace(u'\'',
"''"_L1);
612 r = u'\'' + result + u'\'';
615 case QMetaType::Bool:
616 r = QString::number(field.value().toBool());
618 case QMetaType::QByteArray : {
619 if (hasFeature(BLOB)) {
620 const QByteArray ba = field.value().toByteArray();
621 r.reserve((ba.size() + 1) * 2);
623 for (
const char c : ba) {
624 const uchar s = uchar(c);
625 r += QLatin1Char(QtMiscUtils::toHexLower(s >> 4));
626 r += QLatin1Char(QtMiscUtils::toHexLower(s & 0x0f));
634 r = field.value().toString();