mirror of
https://github.com/YACReader/yacreader
synced 2025-05-25 09:50:33 -04:00
This will unify 7z loading in all scenarios and it also fixes the search path in Linux, now the apps will always try to load 7z.so from LIBDIR/yacreader/7z.so, if it fails they'll try 7zip/7z.so
133 lines
3.5 KiB
C++
133 lines
3.5 KiB
C++
#include "xml_info_library_scanner.h"
|
|
|
|
#include "comic_db.h"
|
|
#include "data_base_management.h"
|
|
#include "db_helper.h"
|
|
#include "initial_comic_info_extractor.h"
|
|
#include "xml_info_parser.h"
|
|
#include "yacreader_global.h"
|
|
#include "folder_item.h"
|
|
|
|
#include "QsLog.h"
|
|
|
|
using namespace YACReader;
|
|
|
|
XMLInfoLibraryScanner::XMLInfoLibraryScanner()
|
|
: QThread()
|
|
{
|
|
}
|
|
|
|
void XMLInfoLibraryScanner::scanLibrary(const QString &source, const QString &target)
|
|
{
|
|
this->source = source;
|
|
this->target = target;
|
|
|
|
this->stopRunning = false;
|
|
|
|
partialUpdate = false;
|
|
|
|
start();
|
|
}
|
|
|
|
void XMLInfoLibraryScanner::scanFolder(const QString &source, const QString &target, const QString &folder, const QModelIndex &dest)
|
|
{
|
|
this->source = source;
|
|
this->target = target;
|
|
|
|
this->stopRunning = false;
|
|
|
|
partialUpdate = true;
|
|
folderDestinationModelIndex = dest;
|
|
|
|
start();
|
|
}
|
|
|
|
void XMLInfoLibraryScanner::run()
|
|
{
|
|
#if !defined use_unarr && !defined use_libarchive
|
|
auto sevenzLib = YACReader::load7zLibrary();
|
|
|
|
if (!sevenzLib->load()) {
|
|
QLOG_ERROR() << "Loading 7z.dll : " + sevenzLib->errorString() << Qt::endl;
|
|
QCoreApplication::exit(YACReader::SevenZNotFound);
|
|
exit();
|
|
}
|
|
sevenzLib->deleteLater();
|
|
#endif
|
|
|
|
QString databaseConnection;
|
|
|
|
{
|
|
auto database = DataBaseManagement::loadDatabase(this->target);
|
|
databaseConnection = database.connectionName();
|
|
|
|
database.transaction();
|
|
|
|
if (!partialUpdate) {
|
|
QSqlQuery comicsInfo("SELECT * FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id)", database);
|
|
comicsInfo.exec();
|
|
|
|
updateFromSQLQuery(database, comicsInfo);
|
|
} else {
|
|
if (folderDestinationModelIndex.isValid()) {
|
|
YACReader::iterate(folderDestinationModelIndex, folderDestinationModelIndex.model(), [&](const QModelIndex &idx) {
|
|
if (stopRunning) {
|
|
return false;
|
|
}
|
|
|
|
auto item = static_cast<FolderItem *>(idx.internalPointer());
|
|
|
|
QSqlQuery comicsInfo(database);
|
|
comicsInfo.prepare("SELECT * FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) WHERE c.parentId = :parentId");
|
|
comicsInfo.bindValue(":parentId", item->id);
|
|
comicsInfo.exec();
|
|
|
|
updateFromSQLQuery(database, comicsInfo);
|
|
|
|
return true;
|
|
});
|
|
}
|
|
}
|
|
|
|
database.commit();
|
|
database.close();
|
|
}
|
|
|
|
QSqlDatabase::removeDatabase(databaseConnection);
|
|
}
|
|
|
|
void XMLInfoLibraryScanner::stop()
|
|
{
|
|
stopRunning = true;
|
|
}
|
|
|
|
void XMLInfoLibraryScanner::updateFromSQLQuery(QSqlDatabase &db, QSqlQuery &query)
|
|
{
|
|
QSqlRecord record = query.record();
|
|
|
|
int id = record.indexOf("id");
|
|
// int parentIdIndex = record.indexOf("parentId");
|
|
int fileNameIndex = record.indexOf("fileName");
|
|
int pathIndex = record.indexOf("path");
|
|
|
|
while (query.next()) {
|
|
if (this->stopRunning) {
|
|
break;
|
|
}
|
|
auto fileName = query.value(fileNameIndex).toString();
|
|
auto path = query.value(pathIndex).toString();
|
|
|
|
emit comicScanned(path, fileName);
|
|
|
|
auto info = DBHelper::getComicInfoFromQuery(query, "comicInfoId");
|
|
|
|
InitialComicInfoExtractor ie(QDir::cleanPath(this->source + path), "None", info.coverPage.toInt(), true);
|
|
|
|
ie.extract();
|
|
|
|
if (parseXMLIntoInfo(ie.getXMLInfoRawData(), info)) {
|
|
DBHelper::update(&info, db);
|
|
}
|
|
}
|
|
}
|