SQL/DB2: apply misc changes
Similar to the ODBC changes from 901c86032c Change-Id: I552b2e43d380080bfac62d61b0e27ba42d13024d Reviewed-by: Andy Shaw <andy.shaw@qt.io>bb10
parent
7cbdc8abbd
commit
e30ed4d431
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue