diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-08-13 15:37:50 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2021-08-18 15:39:04 -0700 |
commit | ddea7e6ce95a59ce926d667657d8c39de9422769 (patch) | |
tree | 3c1d962c7cdbed6a9df6ff687fbe159934d5ea29 /src/plugins/sqldrivers/mysql | |
parent | 8aefbe67bf445d51f41c16ec00bc5ce3ec18ded5 (diff) |
MySQL: implement binding output (SELECT) results to MYSQL_TIME
We already do it for inputs but weren't doing it for outputs.
Change-Id: I4a40ccbd3321467a8429fffd169afeb5730ad75e
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Diffstat (limited to 'src/plugins/sqldrivers/mysql')
-rw-r--r-- | src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp index 69077f2fc8..1f07171ca5 100644 --- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp @@ -303,6 +303,13 @@ static bool qIsBlob(int t) || t == MYSQL_TYPE_LONG_BLOB; } +static bool qIsTimeOrDate(int t) +{ + // *not* MYSQL_TYPE_TIME because its range is bigger than QTime + // (see above) + return t == MYSQL_TYPE_DATE || t == MYSQL_TYPE_DATETIME || t == MYSQL_TYPE_TIMESTAMP; +} + static bool qIsInteger(int t) { return t == QMetaType::Char || t == QMetaType::UChar @@ -354,6 +361,8 @@ bool QMYSQLResultPrivate::bindInValues() // after mysql_stmt_exec() in QMYSQLResult::exec() bind->buffer_length = f.bufLength = 0; hasBlobs = true; + } else if (qIsTimeOrDate(fieldInfo->type)) { + bind->buffer_length = f.bufLength = sizeof(MYSQL_TIME); } else if (qIsInteger(f.type.id())) { bind->buffer_length = f.bufLength = 8; } else { @@ -557,6 +566,20 @@ QVariant QMYSQLResult::data(int field) else if (f.type.id() == QMetaType::Char) return variant.toInt(); return variant; + } else if (qIsTimeOrDate(f.myField->type) && f.bufLength == sizeof(MYSQL_TIME)) { + auto t = reinterpret_cast<const MYSQL_TIME *>(f.outField); + QDate date; + QTime time; + if (f.type.id() != QMetaType::QTime) + date = QDate(t->year, t->month, t->day); + if (f.type.id() != QMetaType::QDate) + time = QTime(t->hour, t->minute, t->second, t->second_part / 1000); + if (f.type.id() == QMetaType::QDateTime) + return QDateTime(date, time); + else if (f.type.id() == QMetaType::QDate) + return date; + else + return time; } if (f.type.id() != QMetaType::QByteArray) |