summaryrefslogtreecommitdiffstats
path: root/src/sql/kernel
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-02-13 11:58:07 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-02-14 14:24:57 +0100
commite65cd6f3794e12e6bc5c2ee985eae8e70ff5f333 (patch)
tree8965835c375422d63b2ccfa927b31a56e64bda1d /src/sql/kernel
parentd1ee7189553e13337b198fe4ba66d79fb7a7f41d (diff)
parente95a758236cf2c68e33da4ddb62bff4fe8d9dd8b (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: src/concurrent/doc/qtconcurrent.qdocconf src/corelib/doc/qtcore.qdocconf src/corelib/global/qglobal.h src/dbus/doc/qtdbus.qdocconf src/dbus/qdbusmessage.h src/gui/doc/qtgui.qdocconf src/gui/image/qimagereader.cpp src/network/doc/qtnetwork.qdocconf src/opengl/doc/qtopengl.qdocconf src/opengl/qgl.h src/plugins/platforms/windows/qwindowswindow.cpp src/printsupport/doc/qtprintsupport.qdocconf src/sql/doc/qtsql.qdocconf src/testlib/doc/qttestlib.qdocconf src/tools/qdoc/doc/config/qt-cpp-ignore.qdocconf src/widgets/doc/qtwidgets.qdocconf src/xml/doc/qtxml.qdocconf Change-Id: Ie9a1fa2cc44bec22a0b942e817a1095ca3414629
Diffstat (limited to 'src/sql/kernel')
-rw-r--r--src/sql/kernel/kernel.pri1
-rw-r--r--src/sql/kernel/qsqldatabase.cpp3
-rw-r--r--src/sql/kernel/qsqlresult.cpp111
-rw-r--r--src/sql/kernel/qsqlresult_p.h138
4 files changed, 150 insertions, 103 deletions
diff --git a/src/sql/kernel/kernel.pri b/src/sql/kernel/kernel.pri
index c6fe404737..fe7f1270f9 100644
--- a/src/sql/kernel/kernel.pri
+++ b/src/sql/kernel/kernel.pri
@@ -8,6 +8,7 @@ HEADERS += kernel/qsql.h \
kernel/qsqldriverplugin.h \
kernel/qsqlerror.h \
kernel/qsqlresult.h \
+ kernel/qsqlresult_p.h \
kernel/qsqlcachedresult_p.h \
kernel/qsqlindex.h
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index 4f59855ac2..36422f5f62 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -794,9 +794,6 @@ void QSqlDatabasePrivate::init(const QString &type)
/*!
Destroys the object and frees any allocated resources.
- If this is the last QSqlDatabase object that uses a certain
- database connection, the database connection is automatically closed.
-
\sa close()
*/
diff --git a/src/sql/kernel/qsqlresult.cpp b/src/sql/kernel/qsqlresult.cpp
index 3a45ccbcce..b3e7ad5b38 100644
--- a/src/sql/kernel/qsqlresult.cpp
+++ b/src/sql/kernel/qsqlresult.cpp
@@ -50,78 +50,11 @@
#include "qvector.h"
#include "qsqldriver.h"
#include "qpointer.h"
+#include "qsqlresult_p.h"
#include <QDebug>
QT_BEGIN_NAMESPACE
-struct QHolder {
- QHolder(const QString& hldr = QString(), int index = -1): holderName(hldr), holderPos(index) {}
- bool operator==(const QHolder& h) const { return h.holderPos == holderPos && h.holderName == holderName; }
- bool operator!=(const QHolder& h) const { return h.holderPos != holderPos || h.holderName != holderName; }
- QString holderName;
- int holderPos;
-};
-
-class QSqlResultPrivate
-{
-public:
- QSqlResultPrivate(QSqlResult* d)
- : q(d), idx(QSql::BeforeFirstRow), active(false),
- isSel(false), forwardOnly(false), precisionPolicy(QSql::LowPrecisionDouble), bindCount(0), binds(QSqlResult::PositionalBinding)
- {}
-
- void clearValues()
- {
- values.clear();
- bindCount = 0;
- }
-
- void resetBindCount()
- {
- bindCount = 0;
- }
-
- void clearIndex()
- {
- indexes.clear();
- holders.clear();
- types.clear();
- }
-
- void clear()
- {
- clearValues();
- clearIndex();;
- }
-
- QString positionalToNamedBinding();
- QString namedToPositionalBinding();
- QString holderAt(int index) const;
-
-public:
- QSqlResult* q;
- QPointer<QSqlDriver> sqldriver;
- int idx;
- QString sql;
- bool active;
- bool isSel;
- QSqlError error;
- bool forwardOnly;
- QSql::NumericalPrecisionPolicy precisionPolicy;
-
- int bindCount;
- QSqlResult::BindingSyntax binds;
-
- QString executedQuery;
- QHash<int, QSql::ParamType> types;
- QVector<QVariant> values;
- typedef QHash<QString, QList<int> > IndexMap;
- IndexMap indexes;
-
- typedef QVector<QHolder> QHolderVector;
- QHolderVector holders;
-};
-
static QString qFieldSerial(int);
QString QSqlResultPrivate::holderAt(int index) const
@@ -584,6 +517,8 @@ void QSqlResult::setForwardOnly(bool forward)
functionality where possible. Returns true if the query is
prepared successfully; otherwise returns false.
+ Note: This method should have been called "safePrepare()".
+
\sa prepare()
*/
bool QSqlResult::savePrepare(const QString& query)
@@ -595,13 +530,12 @@ bool QSqlResult::savePrepare(const QString& query)
if (!driver()->hasFeature(QSqlDriver::PreparedQueries))
return prepare(query);
- if (driver()->hasFeature(QSqlDriver::NamedPlaceholders)) {
- // parse the query to memorize parameter location
- d->namedToPositionalBinding();
+ // parse the query to memorize parameter location
+ d->executedQuery = d->namedToPositionalBinding();
+
+ if (driver()->hasFeature(QSqlDriver::NamedPlaceholders))
d->executedQuery = d->positionalToNamedBinding();
- } else {
- d->executedQuery = d->namedToPositionalBinding();
- }
+
return prepare(d->executedQuery);
}
@@ -614,34 +548,11 @@ bool QSqlResult::savePrepare(const QString& query)
*/
bool QSqlResult::prepare(const QString& query)
{
+ d->sql = query;
if (d->holders.isEmpty()) {
- int n = query.size();
-
- bool inQuote = false;
- int i = 0;
-
- while (i < n) {
- QChar ch = query.at(i);
- if (ch == QLatin1Char(':') && !inQuote
- && (i == 0 || query.at(i - 1) != QLatin1Char(':'))
- && (i + 1 < n && qIsAlnum(query.at(i + 1)))) {
- int pos = i + 2;
- while (pos < n && qIsAlnum(query.at(pos)))
- ++pos;
-
- QString holder(query.mid(i, pos - i));
- d->indexes[holder].append(d->holders.size());
- d->holders.append(QHolder(holder, i));
- i = pos;
- } else {
- if (ch == QLatin1Char('\''))
- inQuote = !inQuote;
- ++i;
- }
- }
- d->values.resize(d->holders.size());
+ // parse the query to memorize parameter location
+ d->namedToPositionalBinding();
}
- d->sql = query;
return true; // fake prepares should always succeed
}
diff --git a/src/sql/kernel/qsqlresult_p.h b/src/sql/kernel/qsqlresult_p.h
new file mode 100644
index 0000000000..65f9be7a05
--- /dev/null
+++ b/src/sql/kernel/qsqlresult_p.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtSql module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSQLRESULT_P_H
+#define QSQLRESULT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qsql*model.h . This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qpointer.h>
+#include <QtSql/qsqldriver.h>
+#include "qsqlerror.h"
+#include "qsqlresult.h"
+
+QT_BEGIN_NAMESPACE
+
+struct QHolder {
+ QHolder(const QString &hldr = QString(), int index = -1): holderName(hldr), holderPos(index) { }
+ bool operator==(const QHolder &h) const { return h.holderPos == holderPos && h.holderName == holderName; }
+ bool operator!=(const QHolder &h) const { return h.holderPos != holderPos || h.holderName != holderName; }
+ QString holderName;
+ int holderPos;
+};
+
+class Q_SQL_EXPORT QSqlResultPrivate
+{
+public:
+ QSqlResultPrivate(QSqlResult *d)
+ : q(d),
+ idx(QSql::BeforeFirstRow),
+ active(false),
+ isSel(false),
+ forwardOnly(false),
+ precisionPolicy(QSql::LowPrecisionDouble),
+ bindCount(0),
+ binds(QSqlResult::PositionalBinding)
+ { }
+
+ void clearValues()
+ {
+ values.clear();
+ bindCount = 0;
+ }
+
+ void resetBindCount()
+ {
+ bindCount = 0;
+ }
+
+ void clearIndex()
+ {
+ indexes.clear();
+ holders.clear();
+ types.clear();
+ }
+
+ void clear()
+ {
+ clearValues();
+ clearIndex();;
+ }
+
+ QString positionalToNamedBinding();
+ QString namedToPositionalBinding();
+ QString holderAt(int index) const;
+
+ QSqlResult *q;
+ QPointer<QSqlDriver> sqldriver;
+ int idx;
+ QString sql;
+ bool active;
+ bool isSel;
+ QSqlError error;
+ bool forwardOnly;
+ QSql::NumericalPrecisionPolicy precisionPolicy;
+
+ int bindCount;
+ QSqlResult::BindingSyntax binds;
+
+ QString executedQuery;
+ QHash<int, QSql::ParamType> types;
+ QVector<QVariant> values;
+ typedef QHash<QString, QList<int> > IndexMap;
+ IndexMap indexes;
+
+ typedef QVector<QHolder> QHolderVector;
+ QHolderVector holders;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSQLRESULT_P_H