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);
392bool QSqlDriver::isIdentifierEscaped(
const QString &identifier, IdentifierType type)
const
395 return identifier.size() > 2
396 && identifier.startsWith(u'"')
397 && identifier.endsWith(u'"');
447QString QSqlDriver::sqlStatement(StatementType type,
const QString &tableName,
448 const QSqlRecord &rec,
bool preparedStatement)
const
450 const auto tableNameString = tableName.isEmpty() ? QString()
451 : prepareIdentifier(tableName, QSqlDriver::TableName,
this);
455 case SelectStatement:
456 for (qsizetype i = 0; i < rec.count(); ++i) {
457 if (rec.isGenerated(i))
458 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(
", "_L1);
463 s =
"SELECT "_L1 + s +
" FROM "_L1 + tableNameString;
467 const QString tableNamePrefix = tableNameString.isEmpty()
468 ? QString() : tableNameString + u'.';
469 for (qsizetype i = 0; i < rec.count(); ++i) {
470 if (!rec.isGenerated(i))
472 s.append(s.isEmpty() ?
"WHERE "_L1 :
" AND "_L1);
473 s.append(tableNamePrefix);
474 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this));
476 s.append(
" IS NULL"_L1);
477 else if (preparedStatement)
480 s.append(
" = "_L1).append(formatValue(rec.field(i)));
484 case UpdateStatement:
485 s = s +
"UPDATE "_L1 + tableNameString +
" SET "_L1;
486 for (qsizetype i = 0; i < rec.count(); ++i) {
487 if (!rec.isGenerated(i))
489 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(u'=');
490 if (preparedStatement)
493 s.append(formatValue(rec.field(i)));
496 if (s.endsWith(
", "_L1))
501 case DeleteStatement:
502 s = s +
"DELETE FROM "_L1 + tableNameString;
504 case InsertStatement: {
505 s = s +
"INSERT INTO "_L1 + tableNameString +
" ("_L1;
507 for (qsizetype i = 0; i < rec.count(); ++i) {
508 if (!rec.isGenerated(i))
510 s.append(prepareIdentifier(rec.fieldName(i), QSqlDriver::FieldName,
this)).append(
", "_L1);
511 if (preparedStatement)
514 vals.append(formatValue(rec.field(i)));
515 vals.append(
", "_L1);
517 if (vals.isEmpty()) {
521 s[s.size() - 2] = u')';
522 s.append(
"VALUES ("_L1).append(vals).append(u')');
562QString QSqlDriver::formatValue(
const QSqlField &field,
bool trimStrings)
const
564 const auto nullTxt =
"NULL"_L1;
570 switch (field.metaType().id()) {
572 case QMetaType::UInt:
573 if (field.value().userType() == QMetaType::Bool)
574 r = field.value().toBool() ?
"1"_L1 :
"0"_L1;
576 r = field.value().toString();
578#if QT_CONFIG(datestring)
579 case QMetaType::QDate:
580 if (field.value().toDate().isValid())
581 r = u'\'' + field.value().toDate().toString(Qt::ISODate) + u'\'';
585 case QMetaType::QTime:
586 if (field.value().toTime().isValid())
587 r = u'\'' + field.value().toTime().toString(Qt::ISODate) + u'\'';
591 case QMetaType::QDateTime:
592 if (field.value().toDateTime().isValid())
593 r = u'\'' + field.value().toDateTime().toString(Qt::ISODate) + u'\'';
598 case QMetaType::QString:
599 case QMetaType::QChar:
601 QString result = field.value().toString();
603 int end = result.size();
604 while (end && result.at(end-1).isSpace())
606 result.truncate(end);
609 result.replace(u'\'',
"''"_L1);
610 r = u'\'' + result + u'\'';
613 case QMetaType::Bool:
614 r = QString::number(field.value().toBool());
616 case QMetaType::QByteArray : {
617 if (hasFeature(BLOB)) {
618 const QByteArray ba = field.value().toByteArray();
619 r.reserve((ba.size() + 1) * 2);
621 for (
const char c : ba) {
622 const uchar s = uchar(c);
623 r += QLatin1Char(QtMiscUtils::toHexLower(s >> 4));
624 r += QLatin1Char(QtMiscUtils::toHexLower(s & 0x0f));
632 r = field.value().toString();