Update of qsqlite (Qt 5.0.0 version)

This commit is contained in:
Chocobozzz 2015-04-11 22:45:04 +02:00
parent 2495c6cc61
commit 11938e3d79
9 changed files with 278 additions and 189 deletions

View File

@ -5,18 +5,19 @@ add_definitions(-DQT_STATICPLUGIN)
# Source files # Source files
set(SQLITE-SOURCES set(SQLITE-SOURCES
qsql_sqlite.cpp qsql_sqlite.cpp
smain.cpp
clementinesqlcachedresult.cpp clementinesqlcachedresult.cpp
smain.cpp
) )
# Header files that have Q_OBJECT in # Header files that have Q_OBJECT in
set(SQLITE-MOC-HEADERS set(SQLITE-MOC-HEADERS
qsql_sqlite.h qsql_sqlite.h
smain.h
) )
set(SQLITE-WIN32-RESOURCES qsqlite_resource.rc) set(SQLITE-WIN32-RESOURCES qsqlite_resource.rc)
qt4_wrap_cpp(SQLITE-SOURCES-MOC ${SQLITE-MOC-HEADERS}) qt5_wrap_cpp(SQLITE-SOURCES-MOC ${SQLITE-MOC-HEADERS})
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
@ -40,7 +41,9 @@ add_library(qsqlite STATIC
${SQLITE-SOURCES-MOC} ${SQLITE-SOURCES-MOC}
${SQLITE-WIN32-RESOURCES} ${SQLITE-WIN32-RESOURCES}
) )
set_property(TARGET qsqlite PROPERTY QT_STATICPLUGIN 1)
target_link_libraries(qsqlite target_link_libraries(qsqlite
${SQLITE_LIBRARIES} Qt5::Core Qt5::Sql
${QT_LIBRARIES}
) )

View File

@ -1,17 +1,18 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** All rights reserved. ** Contact: http://www.qt-project.org/legal
** Contact: Nokia Corporation (qt-info@nokia.com)
** **
** This file is part of the QtSql module of the Qt Toolkit. ** This file is part of the QtSql module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL$ ** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage ** Commercial License Usage
** This file contains pre-release code and may not be distributed. ** Licensees holding valid commercial Qt licenses may use this file in
** You may use this file in accordance with the terms and conditions ** accordance with the commercial license agreement provided with the
** contained in the Technology Preview License Agreement accompanying ** Software or, alternatively, in accordance with the terms contained in
** this package. ** 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 ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
@ -21,30 +22,31 @@
** ensure the GNU Lesser General Public License version 2.1 requirements ** 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. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** In addition, as a special exception, Nokia gives you certain additional ** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception ** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
** **
** If you have questions regarding the use of this file, please contact ** GNU General Public License Usage
** Nokia at qt-info@nokia.com. ** 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$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
#include "clementinesqlcachedresult.h"
#include <qvariant.h> #include <qvariant.h>
#include <qdatetime.h> #include <qdatetime.h>
#include <qvector.h> #include <qvector.h>
#include "clementinesqlcachedresult.h"
QT_BEGIN_NAMESPACE
/* /*
ClementineSqlCachedResult is a convenience class for databases that only allow ClementineSqlCachedResult is a convenience class for databases that only allow
forward only fetching. It will cache all the results so we can iterate forward only fetching. It will cache all the results so we can iterate
@ -302,12 +304,19 @@ ClementineSqlCachedResult::ValueCache &ClementineSqlCachedResult::cache()
void ClementineSqlCachedResult::virtual_hook(int id, void *data) void ClementineSqlCachedResult::virtual_hook(int id, void *data)
{ {
switch (id) {
case QSqlResult::DetachFromResultSet:
case QSqlResult::SetNumericalPrecision:
cleanup();
break;
default:
QSqlResult::virtual_hook(id, data); QSqlResult::virtual_hook(id, data);
} }
void ClementineSqlCachedResult::detachFromResultSet()
{
cleanup();
} }
void ClementineSqlCachedResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy)
{
QSqlResult::setNumericalPrecisionPolicy(policy);
cleanup();
}
QT_END_NAMESPACE

View File

@ -1,17 +1,18 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** All rights reserved. ** Contact: http://www.qt-project.org/legal
** Contact: Nokia Corporation (qt-info@nokia.com)
** **
** This file is part of the QtSql module of the Qt Toolkit. ** This file is part of the QtSql module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL$ ** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage ** Commercial License Usage
** This file contains pre-release code and may not be distributed. ** Licensees holding valid commercial Qt licenses may use this file in
** You may use this file in accordance with the terms and conditions ** accordance with the commercial license agreement provided with the
** contained in the Technology Preview License Agreement accompanying ** Software or, alternatively, in accordance with the terms contained in
** this package. ** 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 ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
@ -21,35 +22,47 @@
** ensure the GNU Lesser General Public License version 2.1 requirements ** 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. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** In addition, as a special exception, Nokia gives you certain additional ** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception ** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
** **
** If you have questions regarding the use of this file, please contact ** GNU General Public License Usage
** Nokia at qt-info@nokia.com. ** 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$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
#ifndef CLEMENTINECACHEDRESULT_P_H #ifndef QSQLCACHEDRESULT_P_H
#define CLEMENTINECACHEDRESULT_P_H #define QSQLCACHEDRESULT_P_H
#include <QSqlResult> //
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of other Qt classes. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "QtSql/qsqlresult.h"
QT_BEGIN_NAMESPACE
class QVariant; class QVariant;
template <typename T> class QVector; template <typename T> class QVector;
class ClementineSqlCachedResultPrivate; class ClementineSqlCachedResultPrivate;
class ClementineSqlCachedResult: public QSqlResult class Q_SQL_EXPORT ClementineSqlCachedResult: public QSqlResult
{ {
public: public:
virtual ~ClementineSqlCachedResult(); virtual ~ClementineSqlCachedResult();
@ -77,9 +90,13 @@ protected:
ValueCache &cache(); ValueCache &cache();
void virtual_hook(int id, void *data); void virtual_hook(int id, void *data);
void detachFromResultSet();
void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy);
private: private:
bool cacheNext(); bool cacheNext();
ClementineSqlCachedResultPrivate *d; ClementineSqlCachedResultPrivate *d;
}; };
#endif // CLEMENTINESQLCACHEDRESULT_P_H QT_END_NAMESPACE
#endif // QSQLCACHEDRESULT_P_H

View File

@ -1,17 +1,18 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** All rights reserved. ** Contact: http://www.qt-project.org/legal
** Contact: Nokia Corporation (qt-info@nokia.com)
** **
** This file is part of the QtSql module of the Qt Toolkit. ** This file is part of the QtSql module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage ** Commercial License Usage
** Licensees holding valid Qt Commercial licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia. ** 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 ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
@ -21,8 +22,8 @@
** ensure the GNU Lesser General Public License version 2.1 requirements ** 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. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** In addition, as a special exception, Nokia gives you certain additional ** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception ** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
** **
** GNU General Public License Usage ** GNU General Public License Usage
@ -33,8 +34,7 @@
** ensure the GNU General Public License version 3.0 requirements will be ** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html. ** met: http://www.gnu.org/copyleft/gpl.html.
** **
** If you have questions regarding the use of this file, please contact **
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
@ -59,7 +59,10 @@
#include <sqlite3.h> #include <sqlite3.h>
Q_DECLARE_OPAQUE_POINTER(sqlite3*)
Q_DECLARE_METATYPE(sqlite3*) Q_DECLARE_METATYPE(sqlite3*)
Q_DECLARE_OPAQUE_POINTER(sqlite3_stmt*)
Q_DECLARE_METATYPE(sqlite3_stmt*) Q_DECLARE_METATYPE(sqlite3_stmt*)
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -84,10 +87,14 @@ static QVariant::Type qGetColumnType(const QString &tpName)
return QVariant::Int; return QVariant::Int;
if (typeName == QLatin1String("double") if (typeName == QLatin1String("double")
|| typeName == QLatin1String("float") || typeName == QLatin1String("float")
|| typeName == QLatin1String("real")
|| typeName.startsWith(QLatin1String("numeric"))) || typeName.startsWith(QLatin1String("numeric")))
return QVariant::Double; return QVariant::Double;
if (typeName == QLatin1String("blob")) if (typeName == QLatin1String("blob"))
return QVariant::ByteArray; return QVariant::ByteArray;
if (typeName == QLatin1String("boolean")
|| typeName == QLatin1String("bool"))
return QVariant::Bool;
return QVariant::String; return QVariant::String;
} }
@ -95,7 +102,7 @@ static QSqlError qMakeError(sqlite3 *access, const QString &descr, QSqlError::Er
int errorCode = -1) int errorCode = -1)
{ {
return QSqlError(descr, return QSqlError(descr,
QString::fromUtf16(static_cast<const ushort *>(sqlite3_errmsg16(access))), QString(reinterpret_cast<const QChar *>(sqlite3_errmsg16(access))),
type, errorCode); type, errorCode);
} }
@ -104,6 +111,7 @@ class QSQLiteDriverPrivate
public: public:
inline QSQLiteDriverPrivate() : access(0) {} inline QSQLiteDriverPrivate() : access(0) {}
sqlite3 *access; sqlite3 *access;
QList <QSQLiteResult *> results;
}; };
@ -162,19 +170,44 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset)
q->init(nCols); q->init(nCols);
for (int i = 0; i < nCols; ++i) { for (int i = 0; i < nCols; ++i) {
QString colName = QString::fromUtf16( QString colName = QString(reinterpret_cast<const QChar *>(
static_cast<const ushort *>(sqlite3_column_name16(stmt, i)) sqlite3_column_name16(stmt, i))
).remove(QLatin1Char('"')); ).remove(QLatin1Char('"'));
// must use typeName for resolving the type to match QSqliteDriver::record // must use typeName for resolving the type to match QSqliteDriver::record
QString typeName = QString::fromUtf16( QString typeName = QString(reinterpret_cast<const QChar *>(
static_cast<const ushort *>(sqlite3_column_decltype16(stmt, i))); sqlite3_column_decltype16(stmt, i)));
int dotIdx = colName.lastIndexOf(QLatin1Char('.'));
QSqlField fld(colName.mid(dotIdx == -1 ? 0 : dotIdx + 1), qGetColumnType(typeName));
// sqlite3_column_type is documented to have undefined behavior if the result set is empty // sqlite3_column_type is documented to have undefined behavior if the result set is empty
int stp = emptyResultset ? -1 : sqlite3_column_type(stmt, i); int stp = emptyResultset ? -1 : sqlite3_column_type(stmt, i);
QVariant::Type fieldType;
if (!typeName.isEmpty()) {
fieldType = qGetColumnType(typeName);
} else {
// Get the proper type for the field based on stp value
switch (stp) {
case SQLITE_INTEGER:
fieldType = QVariant::Int;
break;
case SQLITE_FLOAT:
fieldType = QVariant::Double;
break;
case SQLITE_BLOB:
fieldType = QVariant::ByteArray;
break;
case SQLITE_TEXT:
fieldType = QVariant::String;
break;
case SQLITE_NULL:
default:
fieldType = QVariant::Invalid;
break;
}
}
int dotIdx = colName.lastIndexOf(QLatin1Char('.'));
QSqlField fld(colName.mid(dotIdx == -1 ? 0 : dotIdx + 1), fieldType);
fld.setSqlType(stp); fld.setSqlType(stp);
rInf.append(fld); rInf.append(fld);
} }
@ -245,9 +278,9 @@ bool QSQLiteResultPrivate::fetchNext(ClementineSqlCachedResult::ValueCache &valu
values[i + idx] = QVariant(QVariant::String); values[i + idx] = QVariant(QVariant::String);
break; break;
default: default:
values[i + idx] = QString::fromUtf16(static_cast<const ushort *>( values[i + idx] = QString(reinterpret_cast<const QChar *>(
sqlite3_column_text16(stmt, i)), sqlite3_column_text16(stmt, i)),
sqlite3_column_bytes16(stmt, i) / sizeof(ushort)); sqlite3_column_bytes16(stmt, i) / sizeof(QChar));
break; break;
} }
} }
@ -259,6 +292,7 @@ bool QSQLiteResultPrivate::fetchNext(ClementineSqlCachedResult::ValueCache &valu
q->setAt(QSql::AfterLastRow); q->setAt(QSql::AfterLastRow);
sqlite3_reset(stmt); sqlite3_reset(stmt);
return false; return false;
case SQLITE_CONSTRAINT:
case SQLITE_ERROR: case SQLITE_ERROR:
// SQLITE_ERROR is a generic error code and we must call sqlite3_reset() // SQLITE_ERROR is a generic error code and we must call sqlite3_reset()
// to get the specific error message. // to get the specific error message.
@ -285,25 +319,22 @@ QSQLiteResult::QSQLiteResult(const QSQLiteDriver* db)
{ {
d = new QSQLiteResultPrivate(this); d = new QSQLiteResultPrivate(this);
d->access = db->d->access; d->access = db->d->access;
db->d->results.append(this);
} }
QSQLiteResult::~QSQLiteResult() QSQLiteResult::~QSQLiteResult()
{ {
const QSqlDriver *sqlDriver = driver();
if (sqlDriver)
qobject_cast<const QSQLiteDriver *>(sqlDriver)->d->results.removeOne(this);
d->cleanup(); d->cleanup();
delete d; delete d;
} }
void QSQLiteResult::virtual_hook(int id, void *data) void QSQLiteResult::virtual_hook(int id, void *data)
{ {
switch (id) {
case QSqlResult::DetachFromResultSet:
if (d->stmt)
sqlite3_reset(d->stmt);
break;
default:
ClementineSqlCachedResult::virtual_hook(id, data); ClementineSqlCachedResult::virtual_hook(id, data);
} }
}
bool QSQLiteResult::reset(const QString &query) bool QSQLiteResult::reset(const QString &query)
{ {
@ -321,12 +352,14 @@ bool QSQLiteResult::prepare(const QString &query)
setSelect(false); setSelect(false);
const void *pzTail = NULL;
#if (SQLITE_VERSION_NUMBER >= 3003011) #if (SQLITE_VERSION_NUMBER >= 3003011)
int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
&d->stmt, 0); &d->stmt, &pzTail);
#else #else
int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar),
&d->stmt, 0); &d->stmt, &pzTail);
#endif #endif
if (res != SQLITE_OK) { if (res != SQLITE_OK) {
@ -334,6 +367,11 @@ bool QSQLiteResult::prepare(const QString &query)
"Unable to execute statement"), QSqlError::StatementError, res)); "Unable to execute statement"), QSqlError::StatementError, res));
d->finalize(); d->finalize();
return false; return false;
} else if (pzTail && !QString(reinterpret_cast<const QChar *>(pzTail)).trimmed().isEmpty()) {
setLastError(qMakeError(d->access, QCoreApplication::translate("QSQLiteResult",
"Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE));
d->finalize();
return false;
} }
return true; return true;
} }
@ -371,6 +409,7 @@ bool QSQLiteResult::exec()
ba->size(), SQLITE_STATIC); ba->size(), SQLITE_STATIC);
break; } break; }
case QVariant::Int: case QVariant::Int:
case QVariant::Bool:
res = sqlite3_bind_int(d->stmt, i + 1, value.toInt()); res = sqlite3_bind_int(d->stmt, i + 1, value.toInt());
break; break;
case QVariant::Double: case QVariant::Double:
@ -403,7 +442,7 @@ bool QSQLiteResult::exec()
} }
} else { } else {
setLastError(QSqlError(QCoreApplication::translate("QSQLiteResult", setLastError(QSqlError(QCoreApplication::translate("QSQLiteResult",
"Parameter count mismatch"), QString(), QSqlError::StatementError)); "Parameter count mismatch") + QString::number(paramCount, 10) + "/" + QString::number(values.count(), 10), QString(), QSqlError::StatementError));
return false; return false;
} }
d->skippedStatus = d->fetchNext(d->firstRow, 0, true); d->skippedStatus = d->fetchNext(d->firstRow, 0, true);
@ -449,9 +488,15 @@ QSqlRecord QSQLiteResult::record() const
return d->rInf; return d->rInf;
} }
void QSQLiteResult::detachFromResultSet()
{
if (d->stmt)
sqlite3_reset(d->stmt);
}
QVariant QSQLiteResult::handle() const QVariant QSQLiteResult::handle() const
{ {
return qVariantFromValue(d->stmt); return QVariant::fromValue(d->stmt);
} }
///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////
@ -500,32 +545,6 @@ bool QSQLiteDriver::hasFeature(DriverFeature f) const
return false; return false;
} }
static int qGetSqliteTimeout(QString opts)
{
enum { DefaultTimeout = 5000 };
opts.remove(QLatin1Char(' '));
foreach(QString option, opts.split(QLatin1Char(';'))) {
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
bool ok;
int nt = option.mid(21).toInt(&ok);
if (ok)
return nt;
}
}
return DefaultTimeout;
}
static int qGetSqliteOpenMode(QString opts)
{
opts.remove(QLatin1Char(' '));
foreach(QString option, opts.split(QLatin1Char(';'))) {
if (option == QLatin1String("QSQLITE_OPEN_READONLY"))
return SQLITE_OPEN_READONLY;
}
return SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
}
/* /*
SQLite dbs have no user name, passwords, hosts or ports. SQLite dbs have no user name, passwords, hosts or ports.
just file names. just file names.
@ -537,13 +556,35 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
if (db.isEmpty()) if (db.isEmpty())
return false; return false;
bool sharedCache = false;
int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000;
QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';'));
foreach(const QString &option, opts) {
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
bool ok;
int nt = option.mid(21).toInt(&ok);
if (ok)
timeOut = nt;
}
if (option == QLatin1String("QSQLITE_OPEN_READONLY"))
openMode = SQLITE_OPEN_READONLY;
if (option == QLatin1String("QSQLITE_ENABLE_SHARED_CACHE"))
sharedCache = true;
}
if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, qGetSqliteOpenMode(conOpts), NULL) == SQLITE_OK) { sqlite3_enable_shared_cache(sharedCache);
sqlite3_busy_timeout(d->access, qGetSqliteTimeout(conOpts));
if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) {
sqlite3_busy_timeout(d->access, timeOut);
setOpen(true); setOpen(true);
setOpenError(false); setOpenError(false);
return true; return true;
} else { } else {
if (d->access) {
sqlite3_close(d->access);
d->access = 0;
}
setLastError(qMakeError(d->access, tr("Error opening database"), setLastError(qMakeError(d->access, tr("Error opening database"),
QSqlError::ConnectionError)); QSqlError::ConnectionError));
setOpenError(true); setOpenError(true);
@ -554,6 +595,10 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
void QSQLiteDriver::close() void QSQLiteDriver::close()
{ {
if (isOpen()) { if (isOpen()) {
foreach (QSQLiteResult *result, d->results) {
result->d->finalize();
}
if (sqlite3_close(d->access) != SQLITE_OK) if (sqlite3_close(d->access) != SQLITE_OK)
setLastError(qMakeError(d->access, tr("Error closing database"), setLastError(qMakeError(d->access, tr("Error closing database"),
QSqlError::ConnectionError)); QSqlError::ConnectionError));
@ -705,7 +750,7 @@ QSqlRecord QSQLiteDriver::record(const QString &tbl) const
QVariant QSQLiteDriver::handle() const QVariant QSQLiteDriver::handle() const
{ {
return qVariantFromValue(d->access); return QVariant::fromValue(d->access);
} }
QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const

View File

@ -1,17 +1,18 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** All rights reserved. ** Contact: http://www.qt-project.org/legal
** Contact: Nokia Corporation (qt-info@nokia.com)
** **
** This file is part of the QtSql module of the Qt Toolkit. ** This file is part of the QtSql module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage ** Commercial License Usage
** Licensees holding valid Qt Commercial licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia. ** 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 ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
@ -21,8 +22,8 @@
** ensure the GNU Lesser General Public License version 2.1 requirements ** 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. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** In addition, as a special exception, Nokia gives you certain additional ** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception ** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
** **
** GNU General Public License Usage ** GNU General Public License Usage
@ -33,8 +34,7 @@
** ensure the GNU General Public License version 3.0 requirements will be ** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html. ** met: http://www.gnu.org/copyleft/gpl.html.
** **
** If you have questions regarding the use of this file, please contact **
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
@ -42,8 +42,8 @@
#ifndef QSQL_SQLITE_H #ifndef QSQL_SQLITE_H
#define QSQL_SQLITE_H #define QSQL_SQLITE_H
#include <QSqlDriver> #include <QtSql/qsqldriver.h>
#include <QSqlResult> #include <QtSql/qsqlresult.h>
#include "clementinesqlcachedresult.h" #include "clementinesqlcachedresult.h"
struct sqlite3; struct sqlite3;
@ -79,6 +79,7 @@ protected:
int numRowsAffected(); int numRowsAffected();
QVariant lastInsertId() const; QVariant lastInsertId() const;
QSqlRecord record() const; QSqlRecord record() const;
void detachFromResultSet();
void virtual_hook(int id, void *data); void virtual_hook(int id, void *data);
private: private:

3
3rdparty/qsqlite/qsqlite.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"Keys": [ "QSQLITE" ]
}

View File

@ -1,59 +1,40 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** All rights reserved. ** Contact: http://www.qt-project.org/legal
** Contact: Nokia Corporation (qt-info@nokia.com)
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL$ ** $QT_BEGIN_LICENSE:LGPL21$
** Commercial Usage ** Commercial License Usage
** Licensees holding valid Qt Commercial licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia. ** 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 ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** 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 ** General Public License version 2.1 or version 3 as published by the Free
** Foundation and appearing in the file LICENSE.LGPL included in the ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** packaging of this file. Please review the following information to ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** ensure the GNU Lesser General Public License version 2.1 requirements ** following information to ensure the GNU Lesser General Public License
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** In addition, as a special exception, Nokia gives you certain additional ** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception ** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** 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.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
#include <qsqldriverplugin.h> #include "smain.h"
#include <qstringlist.h>
#include "qsql_sqlite.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QSQLiteDriverPlugin : public QSqlDriverPlugin
{
public:
QSQLiteDriverPlugin();
QSqlDriver* create(const QString &);
QStringList keys() const;
};
QSQLiteDriverPlugin::QSQLiteDriverPlugin() QSQLiteDriverPlugin::QSQLiteDriverPlugin()
: QSqlDriverPlugin() : QSqlDriverPlugin()
{ {
@ -68,14 +49,4 @@ QSqlDriver* QSQLiteDriverPlugin::create(const QString &name)
return 0; return 0;
} }
QStringList QSQLiteDriverPlugin::keys() const
{
QStringList l;
l << QLatin1String("QSQLITE");
return l;
}
Q_EXPORT_STATIC_PLUGIN(QSQLiteDriverPlugin)
Q_EXPORT_PLUGIN2(qsqlite, QSQLiteDriverPlugin)
QT_END_NAMESPACE QT_END_NAMESPACE

51
3rdparty/qsqlite/smain.h vendored Normal file
View File

@ -0,0 +1,51 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** 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.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qsqldriverplugin.h>
#include <qstringlist.h>
#include "qsql_sqlite.h"
QT_BEGIN_NAMESPACE
class QSQLiteDriverPlugin : public QSqlDriverPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QSqlDriverFactoryInterface" FILE "qsqlite.json")
public:
QSQLiteDriverPlugin();
QSqlDriver* create(const QString &);
};
QT_END_NAMESPACE

View File

@ -1,11 +0,0 @@
--- smain.cpp.old 2010-03-22 17:34:03.000000000 +0000
+++ smain.cpp 2010-03-22 17:34:08.000000000 +0000
@@ -41,7 +41,7 @@
#include <qsqldriverplugin.h>
#include <qstringlist.h>
-#include "../../../../src/sql/drivers/sqlite/qsql_sqlite.h"
+#include "qsql_sqlite.h"
QT_BEGIN_NAMESPACE