From 71263863ad7e1ee17e86efa66c2d9eb71bee9c53 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 10 Jul 2022 03:24:02 +0200 Subject: [PATCH] Allow invalid ctime/mtime Possible fix for #815 and #947 --- ext/libstrawberry-tagreader/tagreadertaglib.cpp | 12 +++++++++--- ext/libstrawberry-tagreader/tagreadertagparser.cpp | 11 ++++++++--- src/core/song.cpp | 6 +++--- src/core/sqlquery.cpp | 12 ++++++------ src/core/sqlquery.h | 2 +- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ext/libstrawberry-tagreader/tagreadertaglib.cpp b/ext/libstrawberry-tagreader/tagreadertaglib.cpp index 0250c2c5..5b88bfe8 100644 --- a/ext/libstrawberry-tagreader/tagreadertaglib.cpp +++ b/ext/libstrawberry-tagreader/tagreadertaglib.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -195,12 +196,17 @@ void TagReaderTagLib::ReadFile(const QString &filename, spb::tagreader::SongMeta song->set_basefilename(DataCommaSizeFromQString(fileinfo.fileName())); song->set_url(url.constData(), url.size()); song->set_filesize(fileinfo.size()); - song->set_mtime(fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_mtime(fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - song->set_ctime(fileinfo.birthTime().isValid() ? fileinfo.birthTime().toSecsSinceEpoch() : fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_ctime(fileinfo.birthTime().isValid() ? std::max(fileinfo.birthTime().toSecsSinceEpoch(), 0LL) : fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #else - song->set_ctime(fileinfo.created().isValid() ? fileinfo.created().toSecsSinceEpoch() : fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_ctime(fileinfo.created().isValid() ? std::max(fileinfo.created().toSecsSinceEpoch(), 0LL) : fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #endif + + if (song->ctime() <= 0) { + song->set_ctime(song->mtime()); + } + song->set_lastseen(QDateTime::currentDateTime().toSecsSinceEpoch()); std::unique_ptr fileref(factory_->GetFileRef(filename)); diff --git a/ext/libstrawberry-tagreader/tagreadertagparser.cpp b/ext/libstrawberry-tagreader/tagreadertagparser.cpp index 4b8428a6..ca28b7e9 100644 --- a/ext/libstrawberry-tagreader/tagreadertagparser.cpp +++ b/ext/libstrawberry-tagreader/tagreadertagparser.cpp @@ -106,12 +106,17 @@ void TagReaderTagParser::ReadFile(const QString &filename, spb::tagreader::SongM song->set_basefilename(DataCommaSizeFromQString(fileinfo.fileName())); song->set_url(url.constData(), url.size()); song->set_filesize(fileinfo.size()); - song->set_mtime(fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_mtime(fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - song->set_ctime(fileinfo.birthTime().isValid() ? fileinfo.birthTime().toSecsSinceEpoch() : fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_ctime(fileinfo.birthTime().isValid() ? std::max(fileinfo.birthTime().toSecsSinceEpoch(), 0LL) : fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #else - song->set_ctime(fileinfo.created().isValid() ? fileinfo.created().toSecsSinceEpoch() : fileinfo.lastModified().isValid() ? fileinfo.lastModified().toSecsSinceEpoch() : 0); + song->set_ctime(fileinfo.created().isValid() ? std::max(fileinfo.created().toSecsSinceEpoch(), 0LL) : fileinfo.lastModified().isValid() ? std::max(fileinfo.lastModified().toSecsSinceEpoch(), 0LL) : 0LL); #endif + + if (song->ctime() <= 0) { + song->set_ctime(song->mtime()); + } + song->set_lastseen(QDateTime::currentDateTime().toSecsSinceEpoch()); try { diff --git a/src/core/song.cpp b/src/core/song.cpp index e9d0a2e1..4ebd49fe 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -1310,9 +1310,9 @@ void Song::BindToQuery(SqlQuery *query) const { query->BindNotNullIntValue(":directory_id", d->directory_id_); query->BindUrlValue(":url", d->url_); query->BindValue(":filetype", d->filetype_); - query->BindNotNullLongLongValue(":filesize", d->filesize_); - query->BindNotNullLongLongValue(":mtime", d->mtime_); - query->BindNotNullLongLongValue(":ctime", d->ctime_); + query->BindLongLongValueOrZero(":filesize", d->filesize_); + query->BindLongLongValueOrZero(":mtime", d->mtime_); + query->BindLongLongValueOrZero(":ctime", d->ctime_); query->BindBoolValue(":unavailable", d->unavailable_); query->BindStringValue(":fingerprint", d->fingerprint_); diff --git a/src/core/sqlquery.cpp b/src/core/sqlquery.cpp index 56ceadd3..2713ba44 100644 --- a/src/core/sqlquery.cpp +++ b/src/core/sqlquery.cpp @@ -62,6 +62,12 @@ void SqlQuery::BindLongLongValue(const QString &placeholder, const qint64 value) } +void SqlQuery::BindLongLongValueOrZero(const QString &placeholder, const qint64 value) { + + BindValue(placeholder, value <= 0 ? 0 : value); + +} + void SqlQuery::BindFloatValue(const QString &placeholder, const float value) { BindValue(placeholder, value <= 0 ? -1 : value); @@ -80,12 +86,6 @@ void SqlQuery::BindNotNullIntValue(const QString &placeholder, const int value) } -void SqlQuery::BindNotNullLongLongValue(const QString &placeholder, const qint64 value) { - - BindValue(placeholder, value == -1 ? QVariant() : value); - -} - bool SqlQuery::Exec() { bool success = exec(); diff --git a/src/core/sqlquery.h b/src/core/sqlquery.h index 8ef285fd..39e52ac6 100644 --- a/src/core/sqlquery.h +++ b/src/core/sqlquery.h @@ -38,10 +38,10 @@ class SqlQuery : public QSqlQuery { void BindUrlValue(const QString &placeholder, const QUrl &value); void BindIntValue(const QString &placeholder, const int value); void BindLongLongValue(const QString &placeholder, const qint64 value); + void BindLongLongValueOrZero(const QString &placeholder, const qint64 value); void BindFloatValue(const QString &placeholder, const float value); void BindBoolValue(const QString &placeholder, const bool value); void BindNotNullIntValue(const QString &placeholder, const int value); - void BindNotNullLongLongValue(const QString &placeholder, const qint64 value); bool Exec(); QString LastQuery() const;