From 7ad2bda41869f9938352fc8f8e28abc115bfec73 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Thu, 25 Dec 2014 13:59:38 +0000 Subject: [PATCH] RideFileCache now refreshed in RideItem .. and fixed sort order problem --- src/RideCache.cpp | 11 +++++------ src/RideFileCache.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/RideFileCache.h | 3 +++ src/RideItem.cpp | 5 +++++ 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/RideCache.cpp b/src/RideCache.cpp index cb6011cf6..0857867a1 100644 --- a/src/RideCache.cpp +++ b/src/RideCache.cpp @@ -33,6 +33,10 @@ #include "JsonRideFile.h" // for DATETIME_FORMAT +// for sorting +bool rideCacheGreaterThan(const RideItem *a, const RideItem *b) { return a->dateTime > b->dateTime; } +bool rideCacheLessThan(const RideItem *a, const RideItem *b) { return a->dateTime < b->dateTime; } + RideCache::RideCache(Context *context) : context(context) { progress_ = 100; @@ -139,7 +143,7 @@ RideCache::addRide(QString name, bool dosignal) } if (!added) rides_ << last; - qSort(rides_); // sort by date + qSort(rides_.begin(), rides_.end(), rideCacheLessThan); // refresh metrics for *this ride only* last->refresh(); @@ -321,11 +325,6 @@ RideCache::cancel() future.waitForFinished(); } } -// for reverse sorting -bool rideCacheGreaterThan(const RideItem *a, const RideItem *b) -{ - return a->dateTime > b->dateTime; -} // check if we need to refresh the metrics then start the thread if needed void diff --git a/src/RideFileCache.cpp b/src/RideFileCache.cpp index 6fd26c9d8..3751f7135 100644 --- a/src/RideFileCache.cpp +++ b/src/RideFileCache.cpp @@ -134,6 +134,48 @@ RideFileCache::RideFileCache(Context *context, QString fileName, RideFile *passe } } +bool +RideFileCache::checkStale(Context *context, RideItem*item) +{ + // check if we're stale ? + // Get info for ride file and cache file + QString rideFileName = context->athlete->home->activities().canonicalPath() + "/" + item->fileName; + QFileInfo rideFileInfo(rideFileName); + QString cacheFileName = context->athlete->home->cache().canonicalPath() + "/" + rideFileInfo.baseName() + ".cpx"; + QFileInfo cacheFileInfo(cacheFileName); + + // is it up-to-date? + if (cacheFileInfo.exists() && cacheFileInfo.size() >= (int)sizeof(struct RideFileCacheHeader)) { + + // we have a file, it is more recent than the ride file + // but is it the latest version? + RideFileCacheHeader head; + QFile cacheFile(cacheFileName); + if (cacheFile.open(QIODevice::ReadOnly) == true) { + + // read the header + QDataStream inFile(&cacheFile); + inFile.readRawData((char *) &head, sizeof(head)); + cacheFile.close(); + + // its more recent -or- the crc is the same + if (rideFileInfo.lastModified() <= cacheFileInfo.lastModified() || + head.crc == RideFile::computeFileCRC(rideFileName)) { + + // it is the same ? + if (head.version == RideFileCacheVersion) { + + // WE'RE GOOD + return false; + } + } + } + } + + // its stale ! + return true; +} + // returns offset from end of head static long offsetForMeanMax(RideFileCacheHeader head, RideFile::SeriesType series) { diff --git a/src/RideFileCache.h b/src/RideFileCache.h index 9541d8f2c..6c2ab698a 100644 --- a/src/RideFileCache.h +++ b/src/RideFileCache.h @@ -156,6 +156,9 @@ class RideFileCache // once a cache is loaded we can refresh from in-memory if needed void refresh(RideFile*ride = NULL); + // are we stale ? + static bool checkStale(Context *context, RideItem*item); + // Just get mean max values for power & wpk for a ride static QVector meanMaxPowerFor(Context *context, QVector&wpk, QDate from, QDate to); static QVector meanMaxPowerFor(Context *context, QVector&wpk, QString filename); diff --git a/src/RideItem.cpp b/src/RideItem.cpp index 7b871a646..8c600396e 100644 --- a/src/RideItem.cpp +++ b/src/RideItem.cpp @@ -321,6 +321,8 @@ RideItem::checkStale() } } + // still reckon its clean? what about the cache ? + if (isstale == false) isstale = RideFileCache::checkStale(context, this); return isstale; } @@ -377,6 +379,9 @@ RideItem::refresh() dbversion = DBSchemaVersion; timestamp = QDateTime::currentDateTime().toTime_t(); + // RideFile cache needs refreshing possibly ? + RideFileCache updater(context, context->athlete->home->activities().canonicalPath() + "/" + fileName, ride_, true); + // close if we opened it if (doclose) { close();