SQL/ODBC: avoid code duplication

... by moving the adjustment for the table/schema/catalog name into
splitTableQualifier().

Change-Id: Ia392b1c2e7f29e63ea88c21492f2116eac573b5e
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
(cherry picked from commit 06039b523d2969e6683f9daf7d89dae727e7eaf4)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2024-01-21 17:19:08 +01:00 committed by Qt Cherry-pick Bot
parent 5c97556d12
commit 0c4dfd15b9

View File

@ -799,23 +799,32 @@ bool QODBCDriverPrivate::setConnectionOptions(const QString& connOpts)
void QODBCDriverPrivate::splitTableQualifier(const QString &qualifier, QString &catalog, void QODBCDriverPrivate::splitTableQualifier(const QString &qualifier, QString &catalog,
QString &schema, QString &table) const QString &schema, QString &table) const
{ {
Q_Q(const QODBCDriver);
const auto adjustName = [&](const QString &name) {
if (q->isIdentifierEscaped(name, QSqlDriver::TableName))
return q->stripDelimiters(name, QSqlDriver::TableName);
return adjustCase(name);
};
catalog.clear();
schema.clear();
table.clear();
if (!useSchema) { if (!useSchema) {
table = qualifier; table = adjustName(qualifier);
return; return;
} }
const QList<QStringView> l = QStringView(qualifier).split(u'.'); const QList<QStringView> l = QStringView(qualifier).split(u'.');
switch (l.count()) { switch (l.count()) {
case 1: case 1:
table = qualifier; table = adjustName(qualifier);
break; break;
case 2: case 2:
schema = l.at(0).toString(); schema = adjustName(l.at(0).toString());
table = l.at(1).toString(); table = adjustName(l.at(1).toString());
break; break;
case 3: case 3:
catalog = l.at(0).toString(); catalog = adjustName(l.at(0).toString());
schema = l.at(1).toString(); schema = adjustName(l.at(1).toString());
table = l.at(2).toString(); table = adjustName(l.at(2).toString());
break; break;
default: default:
qSqlWarning(QString::fromLatin1("QODBCDriver::splitTableQualifier: Unable to split table qualifier '%1'") qSqlWarning(QString::fromLatin1("QODBCDriver::splitTableQualifier: Unable to split table qualifier '%1'")
@ -2394,21 +2403,6 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const
QString catalog, schema, table; QString catalog, schema, table;
d->splitTableQualifier(tablename, catalog, schema, table); d->splitTableQualifier(tablename, catalog, schema, table);
if (isIdentifierEscaped(catalog, QSqlDriver::TableName))
catalog = stripDelimiters(catalog, QSqlDriver::TableName);
else
catalog = d->adjustCase(catalog);
if (isIdentifierEscaped(schema, QSqlDriver::TableName))
schema = stripDelimiters(schema, QSqlDriver::TableName);
else
schema = d->adjustCase(schema);
if (isIdentifierEscaped(table, QSqlDriver::TableName))
table = stripDelimiters(table, QSqlDriver::TableName);
else
table = d->adjustCase(table);
r = SQLSetStmtAttr(hStmt, r = SQLSetStmtAttr(hStmt,
SQL_ATTR_CURSOR_TYPE, SQL_ATTR_CURSOR_TYPE,
(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,
@ -2488,24 +2482,6 @@ QSqlRecord QODBCDriver::record(const QString& tablename) const
return fil; return fil;
SQLHANDLE hStmt; SQLHANDLE hStmt;
QString catalog, schema, table;
d->splitTableQualifier(tablename, catalog, schema, table);
if (isIdentifierEscaped(catalog, QSqlDriver::TableName))
catalog = stripDelimiters(catalog, QSqlDriver::TableName);
else
catalog = d->adjustCase(catalog);
if (isIdentifierEscaped(schema, QSqlDriver::TableName))
schema = stripDelimiters(schema, QSqlDriver::TableName);
else
schema = d->adjustCase(schema);
if (isIdentifierEscaped(table, QSqlDriver::TableName))
table = stripDelimiters(table, QSqlDriver::TableName);
else
table = d->adjustCase(table);
SQLRETURN r = SQLAllocHandle(SQL_HANDLE_STMT, SQLRETURN r = SQLAllocHandle(SQL_HANDLE_STMT,
d->hDbc, d->hDbc,
&hStmt); &hStmt);
@ -2517,6 +2493,10 @@ QSqlRecord QODBCDriver::record(const QString& tablename) const
SQL_ATTR_CURSOR_TYPE, SQL_ATTR_CURSOR_TYPE,
(SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY,
SQL_IS_UINTEGER); SQL_IS_UINTEGER);
QString catalog, schema, table;
d->splitTableQualifier(tablename, catalog, schema, table);
{ {
auto c = toSQLTCHAR(catalog); auto c = toSQLTCHAR(catalog);
auto s = toSQLTCHAR(schema); auto s = toSQLTCHAR(schema);