summaryrefslogtreecommitdiffstats
path: root/src/plugins/sqldrivers/mysql
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-08-13 15:37:50 -0700
committerThiago Macieira <thiago.macieira@intel.com>2021-08-18 15:39:04 -0700
commitddea7e6ce95a59ce926d667657d8c39de9422769 (patch)
tree3c1d962c7cdbed6a9df6ff687fbe159934d5ea29 /src/plugins/sqldrivers/mysql
parent8aefbe67bf445d51f41c16ec00bc5ce3ec18ded5 (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.cpp23
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)