From b3803fe8217e85de7c2c7bc4d4fb61df5f84521b Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Wed, 18 Dec 2013 12:55:43 +1000 Subject: Verify the type of query results before accessing them. Tracker will emit ugly warning messages if the wrong accessor is used to access a value including when the result is null, so always check the type before extracting a value. Change-Id: I4df575aa742fd047e7fd349f43339d999305a2c1 Reviewed-by: Robin Burchell --- src/gallery/tracker/qgallerytrackerlistcolumn.cpp | 127 ++++++++++++++++++++-- src/gallery/tracker/qgallerytrackerlistcolumn_p.h | 4 + 2 files changed, 122 insertions(+), 9 deletions(-) diff --git a/src/gallery/tracker/qgallerytrackerlistcolumn.cpp b/src/gallery/tracker/qgallerytrackerlistcolumn.cpp index c0b9368..92bcf34 100644 --- a/src/gallery/tracker/qgallerytrackerlistcolumn.cpp +++ b/src/gallery/tracker/qgallerytrackerlistcolumn.cpp @@ -46,26 +46,93 @@ #include "qgallerytrackerschema_p.h" #include +#include #include #include #include + +QDebug operator << (QDebug debug, TrackerSparqlValueType type) +{ + switch (type) { + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + return debug << "TRACKER_SPARQL_VALUE_TYPE_UNBOUND"; + case TRACKER_SPARQL_VALUE_TYPE_URI: + return debug << "TRACKER_SPARQL_VALUE_TYPE_URI"; + case TRACKER_SPARQL_VALUE_TYPE_STRING: + return debug << "TRACKER_SPARQL_VALUE_TYPE_STRING"; + case TRACKER_SPARQL_VALUE_TYPE_INTEGER: + return debug << "TRACKER_SPARQL_VALUE_TYPE_INTEGER"; + case TRACKER_SPARQL_VALUE_TYPE_DOUBLE: + return debug << "TRACKER_SPARQL_VALUE_TYPE_DOUBLE"; + case TRACKER_SPARQL_VALUE_TYPE_DATETIME: + return debug << "TRACKER_SPARQL_VALUE_TYPE_DATETIME"; + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + return debug << "TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE"; + case TRACKER_SPARQL_VALUE_TYPE_BOOLEAN: + return debug << "TRACKER_SPARQL_VALUE_TYPE_BOOLEAN"; + default: + return debug << "Unknown"; + } +} + QT_BEGIN_NAMESPACE_DOCGALLERY QVariant QGalleryTrackerStringColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - return QString::fromUtf8(tracker_sparql_cursor_get_string(cursor, index, 0)); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_URI: + case TRACKER_SPARQL_VALUE_TYPE_STRING: + return QString::fromUtf8(tracker_sparql_cursor_get_string(cursor, index, 0)); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected string type at index" << index << "got" << type; + } + break; + } + return QVariant(); } QVariant QGalleryTrackerStringListColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - return QString::fromUtf8(tracker_sparql_cursor_get_string(cursor, index, 0)).split(m_separatorChar, QString::SkipEmptyParts); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_STRING: + return QString::fromUtf8(tracker_sparql_cursor_get_string(cursor, index, 0)).split(m_separatorChar, QString::SkipEmptyParts); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected string list type at index" << index << "got" << type; + } + break; + } + return QVariant(); } QVariant QGalleryTrackerUrlColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - return QUrl::fromEncoded(tracker_sparql_cursor_get_string(cursor, index, 0), QUrl::StrictMode); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_STRING: + return QUrl::fromEncoded(tracker_sparql_cursor_get_string(cursor, index, 0), QUrl::StrictMode); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected url type at index" << index << "got" << type; + } + break; + } + return QVariant(); + } QString QGalleryTrackerStringListColumn::toString(const QVariant &variant) const @@ -77,20 +144,62 @@ QString QGalleryTrackerStringListColumn::toString(const QVariant &variant) const QVariant QGalleryTrackerIntegerColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - return int(tracker_sparql_cursor_get_integer(cursor, index)); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_INTEGER: + return int(tracker_sparql_cursor_get_integer(cursor, index)); + case TRACKER_SPARQL_VALUE_TYPE_DOUBLE: + return int(tracker_sparql_cursor_get_double(cursor, index)); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected integer type at index" << index << "got" << type; + } + break; + } + return QVariant(); + } QVariant QGalleryTrackerDoubleColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - return tracker_sparql_cursor_get_double(cursor, index); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_INTEGER: + return double(tracker_sparql_cursor_get_integer(cursor, index)); + case TRACKER_SPARQL_VALUE_TYPE_DOUBLE: + return tracker_sparql_cursor_get_double(cursor, index); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected double type at index" << index << "got" << type; + } + break; + } + return QVariant(); } QVariant QGalleryTrackerDateTimeColumn::toVariant(TrackerSparqlCursor *cursor, int index) const { - QDateTime dateTime = QDateTime::fromString(QString::fromUtf8( - tracker_sparql_cursor_get_string(cursor, index, 0)), Qt::ISODate); - - return dateTime.isValid() ? QVariant(dateTime) : QVariant(); + switch (TrackerSparqlValueType type = tracker_sparql_cursor_get_value_type(cursor, index)) { + case TRACKER_SPARQL_VALUE_TYPE_DATETIME: + return QDateTime::fromString( + QString::fromUtf8(tracker_sparql_cursor_get_string(cursor, index, 0)), Qt::ISODate); + case TRACKER_SPARQL_VALUE_TYPE_UNBOUND: + case TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE: + break; + default: + if (!m_warned) { + m_warned = true; + qWarning() << "QGalleryTracker: Expected double type at index" << index << "got" << type; + } + break; + } + return QVariant(); } QString QGalleryTrackerDateTimeColumn::toString(const QVariant &variant) const diff --git a/src/gallery/tracker/qgallerytrackerlistcolumn_p.h b/src/gallery/tracker/qgallerytrackerlistcolumn_p.h index 0c60037..8e19bca 100644 --- a/src/gallery/tracker/qgallerytrackerlistcolumn_p.h +++ b/src/gallery/tracker/qgallerytrackerlistcolumn_p.h @@ -66,10 +66,14 @@ QT_BEGIN_NAMESPACE_DOCGALLERY class QGalleryTrackerValueColumn { public: + QGalleryTrackerValueColumn() : m_warned(false) {} virtual ~QGalleryTrackerValueColumn() {} virtual QVariant toVariant(TrackerSparqlCursor *cursor, int index) const = 0; virtual QString toString(const QVariant &variant) const { return variant.toString(); } + +protected: + mutable bool m_warned; }; class QGalleryTrackerCompositeColumn -- cgit v1.2.3