SQL/DB2: apply misc changes

Similar to the ODBC changes from 901c86032c

Change-Id: I552b2e43d380080bfac62d61b0e27ba42d13024d
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
bb10
Christian Ehrlicher 2023-01-25 21:28:38 +01:00
parent 7cbdc8abbd
commit e30ed4d431
1 changed files with 39 additions and 42 deletions

View File

@ -14,6 +14,7 @@
#include <QDebug>
#include <QtSql/private/qsqldriver_p.h>
#include <QtSql/private/qsqlresult_p.h>
#include "private/qtools_p.h"
#if defined(Q_CC_BOR)
// DB2's sqlsystm.h (included through sqlcli1.h) defines the SQL_BIGINT_TYPE
@ -43,10 +44,13 @@ class QDB2DriverPrivate : public QSqlDriverPrivate
Q_DECLARE_PUBLIC(QDB2Driver)
public:
QDB2DriverPrivate() : QSqlDriverPrivate(), hEnv(0), hDbc(0) { dbmsType = QSqlDriver::DB2; }
SQLHANDLE hEnv;
SQLHANDLE hDbc;
QDB2DriverPrivate() : QSqlDriverPrivate(QSqlDriver::DB2) {}
SQLHANDLE hEnv = 0;
SQLHANDLE hDbc = 0;
QString user;
void qSplitTableQualifier(const QString &qualifier, QString &catalog,
QString &schema, QString &table) const;
};
class QDB2ResultPrivate;
@ -461,34 +465,27 @@ static QByteArray qGetBinaryData(SQLHANDLE hStmt, int column, SQLLEN& lengthIndi
return fieldVal;
}
static void qSplitTableQualifier(const QString & qualifier, QString * catalog,
QString * schema, QString * table)
void QDB2DriverPrivate::qSplitTableQualifier(const QString &qualifier, QString &catalog,
QString &schema, QString &table) const
{
if (!catalog || !schema || !table)
return;
QStringList l = qualifier.split(u'.');
if (l.count() > 3)
return; // can't possibly be a valid table qualifier
int i = 0, n = l.count();
if (n == 1) {
*table = qualifier;
} else {
for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
if (n == 3) {
if (i == 0)
*catalog = *it;
else if (i == 1)
*schema = *it;
else if (i == 2)
*table = *it;
} else if (n == 2) {
if (i == 0)
*schema = *it;
else if (i == 1)
*table = *it;
}
i++;
}
const QList<QStringView> l = QStringView(qualifier).split(u'.');
switch (l.count()) {
case 1:
table = qualifier;
break;
case 2:
schema = l.at(0).toString();
table = l.at(1).toString();
break;
case 3:
catalog = l.at(0).toString();
schema = l.at(1).toString();
table = l.at(2).toString();
break;
default:
qSqlWarning(QString::fromLatin1("QODBCDriver::splitTableQualifier: Unable to split table qualifier '%1'")
.arg(qualifier), this);
break;
}
}
@ -1353,7 +1350,7 @@ QSqlRecord QDB2Driver::record(const QString& tableName) const
SQLHANDLE hStmt;
QString catalog, schema, table;
qSplitTableQualifier(tableName, &catalog, &schema, &table);
d->qSplitTableQualifier(tableName, catalog, schema, table);
if (schema.isEmpty())
schema = d->user;
@ -1509,7 +1506,7 @@ QSqlIndex QDB2Driver::primaryIndex(const QString& tablename) const
return index;
}
QString catalog, schema, table;
qSplitTableQualifier(tablename, &catalog, &schema, &table);
d->qSplitTableQualifier(tablename, catalog, schema, table);
if (isIdentifierEscaped(catalog, QSqlDriver::TableName))
catalog = stripDelimiters(catalog, QSqlDriver::TableName);
@ -1674,17 +1671,17 @@ QString QDB2Driver::formatValue(const QSqlField &field, bool trimStrings) const
}
}
case QMetaType::QByteArray: {
QByteArray ba = field.value().toByteArray();
QString res;
res += "BLOB(X'"_L1;
static const char hexchars[] = "0123456789abcdef";
for (int i = 0; i < ba.size(); ++i) {
uchar s = (uchar) ba[i];
res += QLatin1Char(hexchars[s >> 4]);
res += QLatin1Char(hexchars[s & 0x0f]);
const QByteArray ba = field.value().toByteArray();
QString r;
r.reserve(ba.size() * 2 + 9);
r += "BLOB(X'"_L1;
for (const char c : ba) {
const uchar s = uchar(c);
r += QLatin1Char(QtMiscUtils::toHexLower(s >> 4));
r += QLatin1Char(QtMiscUtils::toHexLower(s & 0x0f));
}
res += "')"_L1;
return res;
r += "')"_L1;
return r;
}
default:
return QSqlDriver::formatValue(field, trimStrings);