Allow invalid ctime/mtime

Possible fix for #815 and #947
This commit is contained in:
Jonas Kvinge 2022-07-10 03:24:02 +02:00
parent 05232065f8
commit 71263863ad
5 changed files with 27 additions and 16 deletions

View File

@ -22,6 +22,7 @@
#include <string>
#include <memory>
#include <algorithm>
#include <sys/stat.h>
#include <taglib/taglib.h>
@ -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<TagLib::FileRef> fileref(factory_->GetFileRef(filename));

View File

@ -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 {

View File

@ -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_);

View File

@ -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();

View File

@ -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;