diff options
Diffstat (limited to 'src/plugins/sqldrivers')
-rw-r--r-- | src/plugins/sqldrivers/configure.json | 2 | ||||
-rw-r--r-- | src/plugins/sqldrivers/configure.pri | 14 | ||||
-rw-r--r-- | src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 12 | ||||
-rw-r--r-- | src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 11 | ||||
-rw-r--r-- | src/plugins/sqldrivers/psql/qsql_psql.cpp | 7 | ||||
-rw-r--r-- | src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp | 44 |
6 files changed, 39 insertions, 51 deletions
diff --git a/src/plugins/sqldrivers/configure.json b/src/plugins/sqldrivers/configure.json index 234f880579..4802d3b04d 100644 --- a/src/plugins/sqldrivers/configure.json +++ b/src/plugins/sqldrivers/configure.json @@ -229,7 +229,7 @@ Oracle driver, as the current build will most likely fail." "summary": [ { - "section": "Qt Sql", + "section": "Qt Sql Drivers", "entries": [ "sql-db2", "sql-ibase", "sql-mysql", "sql-oci", "sql-odbc", "sql-psql", "sql-sqlite2", "sql-sqlite", "system-sqlite", "sql-tds" diff --git a/src/plugins/sqldrivers/configure.pri b/src/plugins/sqldrivers/configure.pri index b69b51b679..24954e9514 100644 --- a/src/plugins/sqldrivers/configure.pri +++ b/src/plugins/sqldrivers/configure.pri @@ -19,9 +19,9 @@ defineTest(qtConfLibrary_psqlConfig) { libs = !isEmpty(libdir): libs += "-L$$libdir" libs += "-lpq" - $${1}.libs = "$$val_escape(libs)" + $${1}.libs = $$libs includedir -= $$QMAKE_DEFAULT_INCDIRS - $${1}.includedir = "$$val_escape(includedir)" + $${1}.includedir = $$includedir export($${1}.libs) export($${1}.includedir) return(true) @@ -34,7 +34,7 @@ defineTest(qtConfLibrary_psqlEnv) { # Respect PSQL_LIBS if set PSQL_LIBS = $$getenv(PSQL_LIBS) !isEmpty(PSQL_LIBS) { - $${1}.libs = $$PSQL_LIBS + eval($${1}.libs = $$PSQL_LIBS) export($${1}.libs) } else { !qtConfLibrary_inline($$1, $$2): \ @@ -69,14 +69,14 @@ defineTest(qtConfLibrary_mysqlConfig) { } libs = $$cleanlibs } - $${1}.libs = "$$val_escape(libs)" + $${1}.libs = $$libs eval(rawincludedir = $$includedir) rawincludedir ~= s/^-I//g includedir = for (id, rawincludedir): \ includedir += $$clean_path($$id) includedir -= $$QMAKE_DEFAULT_INCDIRS - $${1}.includedir = "$$val_escape(includedir)" + $${1}.includedir = $$includedir export($${1}.libs) export($${1}.includedir) return(true) @@ -90,9 +90,9 @@ defineTest(qtConfLibrary_sybaseEnv) { sybase = $$getenv(SYBASE) !isEmpty(sybase): \ libs += "-L$${sybase}/lib" - libs += $$getenv(SYBASE_LIBS) + eval(libs += $$getenv(SYBASE_LIBS)) !isEmpty(libs) { - $${1}.libs = "$$val_escape(libs)" + $${1}.libs = $$libs export($${1}.libs) } return(true) diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp index 49bceb88a0..f2ae3fbc47 100644 --- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp @@ -76,6 +76,10 @@ Q_DECLARE_METATYPE(MYSQL_STMT*) # define Q_CLIENT_MULTI_STATEMENTS 0 #endif +// MySQL above version 8 removed my_bool typedef while MariaDB kept it, +// by redefining it we can regain source compatibility. +using my_bool = decltype(mysql_stmt_bind_result(nullptr, nullptr)); + QT_BEGIN_NAMESPACE class QMYSQLDriverPrivate : public QSqlDriverPrivate @@ -307,7 +311,9 @@ static QVariant::Type qDecodeMYSQLType(int mysqltype, uint flags) type = QVariant::Date; break; case FIELD_TYPE_TIME : - type = QVariant::Time; + // A time field can be within the range '-838:59:59' to '838:59:59' so + // use QString instead of QTime since QTime is limited to 24 hour clock + type = QVariant::String; break; case FIELD_TYPE_DATETIME : case FIELD_TYPE_TIMESTAMP : @@ -1450,7 +1456,7 @@ bool QMYSQLDriver::open(const QString& db, d->preparedQuerysEnabled = false; #endif -#ifndef QT_NO_THREAD +#if QT_CONFIG(thread) mysql_thread_init(); #endif @@ -1464,7 +1470,7 @@ void QMYSQLDriver::close() { Q_D(QMYSQLDriver); if (isOpen()) { -#ifndef QT_NO_THREAD +#if QT_CONFIG(thread) mysql_thread_end(); #endif mysql_close(d->mysql); diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp index 547eb2043d..1fbbcd0ef1 100644 --- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp +++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp @@ -72,6 +72,7 @@ inline static QString fromSQLTCHAR(const QVarLengthArray<SQLTCHAR>& input, int s { QString result; + // Remove any trailing \0 as some drivers misguidedly append one int realsize = qMin(size, input.size()); if(realsize > 0 && input[realsize-1] == 0) realsize--; @@ -458,7 +459,6 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni // more data can be fetched, the length indicator does NOT // contain the number of bytes returned - it contains the // total number of bytes that CAN be fetched - // colSize-1: remove 0 termination when there is more data to fetch int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : int(lengthIndicator / sizeof(SQLTCHAR)); fieldVal += fromSQLTCHAR(buf, rSize); if (lengthIndicator < SQLLEN(colSize*sizeof(SQLTCHAR))) { @@ -499,9 +499,12 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni // more data can be fetched, the length indicator does NOT // contain the number of bytes returned - it contains the // total number of bytes that CAN be fetched - // colSize-1: remove 0 termination when there is more data to fetch int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator; - fieldVal += QString::fromUtf8((const char *)buf.constData(), rSize); + // Remove any trailing \0 as some drivers misguidedly append one + int realsize = qMin(rSize, buf.size()); + if (realsize > 0 && buf[realsize - 1] == 0) + realsize--; + fieldVal += QString::fromUtf8(reinterpret_cast<const char *>(buf.constData()), realsize); if (lengthIndicator < SQLLEN(colSize)) { // workaround for Drivermanagers that don't return SQL_NO_DATA break; @@ -1304,7 +1307,7 @@ QVariant QODBCResult::data(int field) bool QODBCResult::isNull(int field) { Q_D(const QODBCResult); - if (field < 0 || field > d->fieldCache.size()) + if (field < 0 || field >= d->fieldCache.size()) return true; if (field <= d->fieldCacheIdx) { // since there is no good way to find out whether the value is NULL diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp index fe9e098c12..bf0493b0c3 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql.cpp +++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp @@ -1465,8 +1465,11 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const precision = -1; } QString defVal = query.value(5).toString(); - if (!defVal.isEmpty() && defVal.at(0) == QLatin1Char('\'')) - defVal = defVal.mid(1, defVal.length() - 2); + if (!defVal.isEmpty() && defVal.at(0) == QLatin1Char('\'')) { + const int end = defVal.lastIndexOf(QLatin1Char('\'')); + if (end > 0) + defVal = defVal.mid(1, end - 1); + } QSqlField f(query.value(0).toString(), qDecodePSQLType(query.value(1).toInt()), tablename); f.setRequired(query.value(2).toBool()); f.setLength(len); diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp index 491d903137..f1a003ddcd 100644 --- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp +++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp @@ -55,9 +55,6 @@ #include <qcache.h> #include <qregularexpression.h> #endif -#if QT_CONFIG(timezone) -#include <QTimeZone> -#endif #include <QScopedValueRollback> #if defined Q_OS_WIN @@ -421,34 +418,6 @@ bool QSQLiteResult::prepare(const QString &query) return true; } -static QString secondsToOffset(int seconds) -{ - const QChar sign = ushort(seconds < 0 ? '-' : '+'); - seconds = qAbs(seconds); - const int hours = seconds / 3600; - const int minutes = (seconds % 3600) / 60; - - return QString(QStringLiteral("%1%2:%3")).arg(sign).arg(hours, 2, 10, QLatin1Char('0')).arg(minutes, 2, 10, QLatin1Char('0')); -} - -static QString timespecToString(const QDateTime &dateTime) -{ - switch (dateTime.timeSpec()) { - case Qt::LocalTime: - return QString(); - case Qt::UTC: - return QStringLiteral("Z"); - case Qt::OffsetFromUTC: - return secondsToOffset(dateTime.offsetFromUtc()); -#if QT_CONFIG(timezone) - case Qt::TimeZone: - return secondsToOffset(dateTime.timeZone().offsetFromUtc(dateTime)); -#endif - default: - return QString(); - } -} - bool QSQLiteResult::execBatch(bool arrayBind) { Q_UNUSED(arrayBind); @@ -555,7 +524,7 @@ bool QSQLiteResult::exec() break; case QVariant::DateTime: { const QDateTime dateTime = value.toDateTime(); - const QString str = dateTime.toString(QLatin1String("yyyy-MM-ddThh:mm:ss.zzz") + timespecToString(dateTime)); + const QString str = dateTime.toString(Qt::ISODateWithMs); res = sqlite3_bind_text16(d->stmt, i + 1, str.utf16(), str.size() * sizeof(ushort), SQLITE_TRANSIENT); break; @@ -673,7 +642,7 @@ static void _q_regexp(sqlite3_context* context, int argc, sqlite3_value** argv) const bool wasCached = regexp; if (!wasCached) - regexp = new QRegularExpression(pattern, QRegularExpression::DontCaptureOption | QRegularExpression::OptimizeOnFirstUsageOption); + regexp = new QRegularExpression(pattern, QRegularExpression::DontCaptureOption); const bool found = subject.contains(*regexp); @@ -953,13 +922,20 @@ static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool only if (onlyPIndex && !isPk) continue; QString typeName = q.value(2).toString().toLower(); + QString defVal = q.value(4).toString(); + if (!defVal.isEmpty() && defVal.at(0) == QLatin1Char('\'')) { + const int end = defVal.lastIndexOf(QLatin1Char('\'')); + if (end > 0) + defVal = defVal.mid(1, end - 1); + } + QSqlField fld(q.value(1).toString(), qGetColumnType(typeName), tableName); if (isPk && (typeName == QLatin1String("integer"))) // INTEGER PRIMARY KEY fields are auto-generated in sqlite // INT PRIMARY KEY is not the same as INTEGER PRIMARY KEY! fld.setAutoValue(true); fld.setRequired(q.value(3).toInt() != 0); - fld.setDefaultValue(q.value(4)); + fld.setDefaultValue(defVal); ind.append(fld); } return ind; |