summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den.exter@jollamobile.com>2013-12-18 12:55:43 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-18 07:10:10 +0100
commitb3803fe8217e85de7c2c7bc4d4fb61df5f84521b (patch)
tree94b193bbc3c1f31fdf3e318bb303ccaf3f01150c
parent983e043da0057bf5d819a0e68730204276787418 (diff)
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 <robin+qt@viroteck.net>
-rw-r--r--src/gallery/tracker/qgallerytrackerlistcolumn.cpp127
-rw-r--r--src/gallery/tracker/qgallerytrackerlistcolumn_p.h4
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 <QtCore/qcryptographichash.h>
+#include <QtCore/qdebug.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qurl.h>
#include <QtCore/qvariant.h>
+
+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