From: APTX Date: Wed, 13 Jun 2012 22:53:16 +0000 (+0200) Subject: Some fixes to RenameHandler. Only perform one rename at a time. Always strip invalid... X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=01240988d03a6e864870916406df612520ccd0da;p=localmylist.git Some fixes to RenameHandler. Only perform one rename at a time. Always strip invalid windows filename characters. --- diff --git a/localmylist/renamehandler.cpp b/localmylist/renamehandler.cpp index cafdc5f..8a9eb5e 100644 --- a/localmylist/renamehandler.cpp +++ b/localmylist/renamehandler.cpp @@ -11,10 +11,12 @@ namespace LocalMyList { -RenameHandler::RenameHandler(Database *db, QObject *parent) : +RenameHandler::RenameHandler(Database *db, Settings *settings, QObject *parent) : QObject(parent), renameEngine(0), validScript(false) { this->db = db; + this->settings = settings; + connect(db, SIGNAL(renameDataChanged()), this, SLOT(handleRename()), Qt::QueuedConnection); connect(this, SIGNAL(renameBatchFinished()), this, SLOT(handleRename()), Qt::QueuedConnection); m_setup = false; } @@ -26,6 +28,7 @@ bool RenameHandler::isSetup() void RenameHandler::handleRename() { + RaiiTransaction t(db); QSqlQuery q(db->connection()); q.prepare("SELECT fid, eid, aid, gid, anime_anidb_update, anime_entry_update, anime_my_update, anime_title_english, anime_title_romaji, anime_title_kanji, " @@ -39,7 +42,7 @@ void RenameHandler::handleRename() "LIMIT :limit"); q.bindValue(":host_id", MyList::instance()->hostId()); - q.bindValue(":limit", 10); + q.bindValue(":limit", 1); if (!db->exec(q)) return; @@ -49,17 +52,18 @@ void RenameHandler::handleRename() if (q.size() < 1) return; + setupRenameEngine(); + if (!validScript) return; + t.commit(); + while (q.next()) { QSqlRecord r = q.record(); QFileInfo oldFile(r.value("path").toString()); - RaiiTransaction t(db); - t.commit(); - FileLocation fl; fl.fid = q.value(0).toInt(); fl.hostId = MyList::instance()->hostId(); @@ -106,9 +110,7 @@ void RenameHandler::handleRename() env["Type"] = r.value("anime_type").toString(); env["Depr"] = /*r.value("")*/ false ? "1" : ""; // Data missing? - env["Cen"] = r.value("censored").toBool() ? "1" : "0"; - env["Ver"] = r.value("version").toString(); env["Source"] = r.value("type").toString(); // TODO This is called source on AniDB env["Quality"] = r.value("quality").toString(); @@ -120,9 +122,6 @@ void RenameHandler::handleRename() env["FVCodec"] = r.value("video_codec").toString(); env["Watched"] = r.value("my_watched").toDateTime().isValid() ? "1" : "0"; - if (!m_setup) - setupRenameEngine(); - renameEngine->evaluate(env); if (env.value("FileName", "").isEmpty()) @@ -136,17 +135,28 @@ void RenameHandler::handleRename() QString newFileName = env.value("FileName", "") + "." + r.value("extension").toString(); QString newFilePath = env.value("FilePath", ""); + newFileName = newFileName.replace(QRegExp("[/\\:*\"?<>|\\r\\n]"), ""); + if (newFilePath.isEmpty()) newFilePath = oldFile.canonicalPath(); QString newFileString = newFilePath + "/" + newFileName; QFileInfo newFile(newFileString); + bool isSamePath = oldFile.canonicalFilePath() == newFileString; + + if (isSamePath) + { + fl.failedRename = false; + db->setFileLocation(fl); + continue; + } + if (newFile.exists()) { fl.failedRename = true; db->setFileLocation(fl); - db->log(tr("Rename: Failed to rename file <%1>. Destination <%2> exists.").arg(oldFile.filePath()).arg(newFile.canonicalPath()), 2); + db->log(tr("Rename: Failed to rename file <%1>. Destination <%2> exists.").arg(oldFile.filePath()).arg(newFileString), 2); continue; } @@ -161,7 +171,7 @@ void RenameHandler::handleRename() } } - if (oldFile.canonicalPath() != newFileString && !QFile::rename(oldFile.canonicalFilePath(), newFileString)) + if (!QFile::rename(oldFile.canonicalFilePath(), newFileString)) { fl.failedRename = true; db->setFileLocation(fl); @@ -186,12 +196,15 @@ void RenameHandler::clearSetup() void RenameHandler::setupRenameEngine() { + if (m_setup) + return; + if (!renameEngine) renameEngine = new RenameParser::RenameEngine(); renameEngine->setCurrentParserType(RenameParser::RenameEngine::ParserType( - MyList::instance()->settings()->get("renameLanguage").toInt())); - validScript = renameEngine->parse(MyList::instance()->settings()->get("renameScript").toString()); + settings->get("renameLanguage").toInt())); + validScript = renameEngine->parse(settings->get("renameScript").toString()); if (!validScript) db->log(tr("Rename Current rename script is invalid: %1, line: %2, column: %3").arg(renameEngine->error()).arg(renameEngine->line()).arg(renameEngine->column()), 2); diff --git a/localmylist/renamehandler.h b/localmylist/renamehandler.h index 872e1b8..c2411dd 100644 --- a/localmylist/renamehandler.h +++ b/localmylist/renamehandler.h @@ -11,12 +11,13 @@ namespace RenameParser { namespace LocalMyList { class Database; +class Settings; class RenameHandler : public QObject { Q_OBJECT public: - explicit RenameHandler(Database *db, QObject *parent = 0); + explicit RenameHandler(Database *db, Settings *settings, QObject *parent = 0); bool isSetup(); @@ -31,6 +32,7 @@ public slots: private: Database *db; + Settings *settings; RenameParser::RenameEngine *renameEngine; bool validScript;