diff options
Diffstat (limited to 'src/sql/drivers/db2/qsql_db2.cpp')
-rw-r--r-- | src/sql/drivers/db2/qsql_db2.cpp | 85 |
1 files changed, 67 insertions, 18 deletions
diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp index 78b396f423..cc16a68916 100644 --- a/src/sql/drivers/db2/qsql_db2.cpp +++ b/src/sql/drivers/db2/qsql_db2.cpp @@ -32,7 +32,6 @@ ****************************************************************************/ #include "qsql_db2_p.h" -#include <QtSql/private/qsqldriver_p.h> #include <qcoreapplication.h> #include <qdatetime.h> #include <qsqlfield.h> @@ -43,6 +42,8 @@ #include <qvarlengtharray.h> #include <qvector.h> #include <QDebug> +#include <QtSql/private/qsqldriver_p.h> +#include <QtSql/private/qsqlresult_p.h> #if defined(Q_CC_BOR) // DB2's sqlsystm.h (included through sqlcli1.h) defines the SQL_BIGINT_TYPE @@ -65,6 +66,8 @@ static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL class QDB2DriverPrivate : public QSqlDriverPrivate { + Q_DECLARE_PUBLIC(QDB2Driver) + public: QDB2DriverPrivate() : QSqlDriverPrivate(), hEnv(0), hDbc(0) { dbmsType = QSqlDriver::DB2; } SQLHANDLE hEnv; @@ -72,10 +75,44 @@ public: QString user; }; -class QDB2ResultPrivate +class QDB2ResultPrivate; + +class QDB2Result: public QSqlResult { + Q_DECLARE_PRIVATE(QDB2Result) + public: - QDB2ResultPrivate(const QDB2DriverPrivate* d): dp(d), hStmt(0) + QDB2Result(const QDB2Driver *drv); + ~QDB2Result(); + bool prepare(const QString &query) Q_DECL_OVERRIDE; + bool exec() Q_DECL_OVERRIDE; + QVariant handle() const Q_DECL_OVERRIDE; + +protected: + QVariant data(int field) Q_DECL_OVERRIDE; + bool reset(const QString &query) Q_DECL_OVERRIDE; + bool fetch(int i) Q_DECL_OVERRIDE; + bool fetchNext() Q_DECL_OVERRIDE; + bool fetchFirst() Q_DECL_OVERRIDE; + bool fetchLast() Q_DECL_OVERRIDE; + bool isNull(int i) Q_DECL_OVERRIDE; + int size() Q_DECL_OVERRIDE; + int numRowsAffected() Q_DECL_OVERRIDE; + QSqlRecord record() const Q_DECL_OVERRIDE; + void virtual_hook(int id, void *data) Q_DECL_OVERRIDE; + void detachFromResultSet() Q_DECL_OVERRIDE; + bool nextResult() Q_DECL_OVERRIDE; +}; + +class QDB2ResultPrivate: public QSqlResultPrivate +{ + Q_DECLARE_PUBLIC(QDB2Result) + +public: + Q_DECLARE_SQLDRIVER_PRIVATE(QDB2Driver) + QDB2ResultPrivate(QDB2Result *q, const QDB2Driver *drv) + : QSqlResultPrivate(q, drv), + hStmt(0) {} ~QDB2ResultPrivate() { @@ -94,7 +131,6 @@ public: valueCache.clear(); } - const QDB2DriverPrivate* dp; SQLHANDLE hStmt; QSqlRecord recInf; QVector<QVariant*> valueCache; @@ -140,8 +176,8 @@ static QString qDB2Warn(const QDB2DriverPrivate* d) static QString qDB2Warn(const QDB2ResultPrivate* d) { - return (qWarnDB2Handle(SQL_HANDLE_ENV, d->dp->hEnv) + QLatin1Char(' ') - + qWarnDB2Handle(SQL_HANDLE_DBC, d->dp->hDbc) + return (qWarnDB2Handle(SQL_HANDLE_ENV, d->drv_d_func()->hEnv) + QLatin1Char(' ') + + qWarnDB2Handle(SQL_HANDLE_DBC, d->drv_d_func()->hDbc) + qWarnDB2Handle(SQL_HANDLE_STMT, d->hStmt)); } @@ -466,7 +502,7 @@ static bool qMakeStatement(QDB2ResultPrivate* d, bool forwardOnly, bool setForwa SQLRETURN r; if (!d->hStmt) { r = SQLAllocHandle(SQL_HANDLE_STMT, - d->dp->hDbc, + d->drv_d_func()->hDbc, &d->hStmt); if (r != SQL_SUCCESS) { qSqlWarning(QLatin1String("QDB2Result::reset: Unable to allocate statement handle"), d); @@ -505,30 +541,31 @@ static bool qMakeStatement(QDB2ResultPrivate* d, bool forwardOnly, bool setForwa QVariant QDB2Result::handle() const { + Q_D(const QDB2Result); return QVariant(qRegisterMetaType<SQLHANDLE>("SQLHANDLE"), &d->hStmt); } /************************************/ -QDB2Result::QDB2Result(const QDB2Driver* dr, const QDB2DriverPrivate* dp) - : QSqlResult(dr) +QDB2Result::QDB2Result(const QDB2Driver *drv) + : QSqlResult(*new QDB2ResultPrivate(this, drv)) { - d = new QDB2ResultPrivate(dp); } QDB2Result::~QDB2Result() { + Q_D(const QDB2Result); if (d->hStmt) { SQLRETURN r = SQLFreeHandle(SQL_HANDLE_STMT, d->hStmt); if (r != SQL_SUCCESS) qSqlWarning(QLatin1String("QDB2Driver: Unable to free statement handle ") + QString::number(r), d); } - delete d; } bool QDB2Result::reset (const QString& query) { + Q_D(QDB2Result); setActive(false); setAt(QSql::BeforeFirstRow); SQLRETURN r; @@ -565,6 +602,7 @@ bool QDB2Result::reset (const QString& query) bool QDB2Result::prepare(const QString& query) { + Q_D(QDB2Result); setActive(false); setAt(QSql::BeforeFirstRow); SQLRETURN r; @@ -589,6 +627,7 @@ bool QDB2Result::prepare(const QString& query) bool QDB2Result::exec() { + Q_D(QDB2Result); QList<QByteArray> tmpStorage; // holds temporary ptrs QVarLengthArray<SQLINTEGER, 32> indicators(boundValues().count()); @@ -840,6 +879,7 @@ bool QDB2Result::exec() bool QDB2Result::fetch(int i) { + Q_D(QDB2Result); if (isForwardOnly() && i < at()) return false; if (i == at()) @@ -874,6 +914,7 @@ bool QDB2Result::fetch(int i) bool QDB2Result::fetchNext() { + Q_D(QDB2Result); SQLRETURN r; d->clearValueCache(); r = SQLFetchScroll(d->hStmt, @@ -891,6 +932,7 @@ bool QDB2Result::fetchNext() bool QDB2Result::fetchFirst() { + Q_D(QDB2Result); if (isForwardOnly() && at() != QSql::BeforeFirstRow) return false; if (isForwardOnly()) @@ -912,6 +954,7 @@ bool QDB2Result::fetchFirst() bool QDB2Result::fetchLast() { + Q_D(QDB2Result); d->clearValueCache(); int i = at(); @@ -943,6 +986,7 @@ bool QDB2Result::fetchLast() QVariant QDB2Result::data(int field) { + Q_D(QDB2Result); if (field >= d->recInf.count()) { qWarning("QDB2Result::data: column %d out of range", field); return QVariant(); @@ -1049,6 +1093,7 @@ QVariant QDB2Result::data(int field) bool QDB2Result::isNull(int i) { + Q_D(const QDB2Result); if (i >= d->valueCache.size()) return true; @@ -1059,6 +1104,7 @@ bool QDB2Result::isNull(int i) int QDB2Result::numRowsAffected() { + Q_D(const QDB2Result); SQLINTEGER affectedRowCount = 0; SQLRETURN r = SQLRowCount(d->hStmt, &affectedRowCount); if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) @@ -1075,6 +1121,7 @@ int QDB2Result::size() QSqlRecord QDB2Result::record() const { + Q_D(const QDB2Result); if (isActive()) return d->recInf; return QSqlRecord(); @@ -1082,6 +1129,7 @@ QSqlRecord QDB2Result::record() const bool QDB2Result::nextResult() { + Q_D(QDB2Result); setActive(false); setAt(QSql::BeforeFirstRow); d->recInf.clear(); @@ -1117,6 +1165,7 @@ void QDB2Result::virtual_hook(int id, void *data) void QDB2Result::detachFromResultSet() { + Q_D(QDB2Result); if (d->hStmt) SQLCloseCursor(d->hStmt); } @@ -1132,8 +1181,8 @@ QDB2Driver::QDB2Driver(Qt::HANDLE env, Qt::HANDLE con, QObject* parent) : QSqlDriver(*new QDB2DriverPrivate, parent) { Q_D(QDB2Driver); - d->hEnv = (SQLHANDLE)env; - d->hDbc = (SQLHANDLE)con; + d->hEnv = reinterpret_cast<intptr_t>(env); + d->hDbc = reinterpret_cast<intptr_t>(con); if (env && con) { setOpen(true); setOpenError(false); @@ -1197,10 +1246,10 @@ bool QDB2Driver::open(const QString& db, const QString& user, const QString& pas tmp.toLocal8Bit().constData()); continue; } - r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER) v, 0); + r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_ACCESS_MODE, reinterpret_cast<SQLPOINTER>(v), 0); } else if (opt == QLatin1String("SQL_ATTR_LOGIN_TIMEOUT")) { v = val.toUInt(); - r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) v, 0); + r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_LOGIN_TIMEOUT, reinterpret_cast<SQLPOINTER>(v), 0); } else if (opt.compare(QLatin1String("PROTOCOL"), Qt::CaseInsensitive) == 0) { protocol = tmp; } @@ -1278,8 +1327,7 @@ void QDB2Driver::close() QSqlResult *QDB2Driver::createResult() const { - Q_D(const QDB2Driver); - return new QDB2Result(this, d); + return new QDB2Result(this); } QSqlRecord QDB2Driver::record(const QString& tableName) const @@ -1506,6 +1554,7 @@ bool QDB2Driver::hasFeature(DriverFeature f) const case LastInsertId: case SimpleLocking: case EventNotifications: + case CancelQuery: return false; case BLOB: case Transactions: @@ -1572,7 +1621,7 @@ bool QDB2Driver::setAutoCommit(bool autoCommit) SQLUINTEGER ac = autoCommit ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF; SQLRETURN r = SQLSetConnectAttr(d->hDbc, SQL_ATTR_AUTOCOMMIT, - (SQLPOINTER)ac, + reinterpret_cast<SQLPOINTER>(ac), sizeof(ac)); if (r != SQL_SUCCESS) { setLastError(qMakeError(tr("Unable to set autocommit"), |