Version 1.15

Ajout de la fonction d'archivage des passages.
This commit is contained in:
JF
2018-01-19 07:15:52 -05:00
parent e0fd21a0dc
commit fe1cb5428c
110 changed files with 40573 additions and 589 deletions
+289 -148
View File
@@ -46,6 +46,7 @@
#include <QCoreApplication>
#include <QMessageBox>
#include <QFileInfo>
#include <QCoreApplication>
CDatabaseMgrPage::~CDatabaseMgrPage()
@@ -137,12 +138,13 @@ CDatabaseMgrPage::CDatabaseMgrPage(QGraphicsWidget *Parent, bool EngMode)
mDatabaseImporterWorkerThread = new CDatabaseImporterThread();
mDatabaseImporterThread = new QThread();
mDatabaseImporterWorkerThread->moveToThread(mDatabaseImporterThread);
connect(mDatabaseImporterThread,SIGNAL(started()),mDatabaseImporterWorkerThread,SLOT(ImportLogs()));
connect(mDatabaseImporterThread,SIGNAL(started()),mDatabaseImporterWorkerThread,SLOT(ExecuteThread()));
connect(mDatabaseImporterWorkerThread,SIGNAL(DatabaseImportFinished(bool,QStringList*)),this,SLOT(DatabaseImportFinished(bool,QStringList*)));
connect(mDatabaseImporterWorkerThread,SIGNAL(ResetProgressBar()),mProgressBar,SLOT(reset()));
connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressBarRange(int,int)),mProgressBar,SLOT(setRange(int,int)));
connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressBarVal(int)),mProgressBar,SLOT(setValue(int)));
connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressText(QString)),this,SLOT(SetProgressText(QString)));
connect(mDatabaseImporterWorkerThread,SIGNAL(DatabaseArchiveFinished(bool,int)),this,SLOT(DatabaseArchiveFinished(bool,int)));
Title = new QGraphicsTextItem("Maintenance de la BD",this);
@@ -306,6 +308,7 @@ bool CDatabaseMgrPage::ImportData(bool OnlyErrorLogs, bool FilterDuplicates)
mDatabaseImporterWorkerThread->SetDatabasePath(mProgramHandle->GetLogDataPath());
mDatabaseImporterWorkerThread->SetImporParams(SelectedDirs,FilterDuplicates,OnlyErrorLogs);
mDatabaseImporterWorkerThread->SetLogMgrHandle(mLogMgrHandle);
mDatabaseImporterWorkerThread->SetThreadTask(CDatabaseImporterThread::DATABASE_THREAD_IMPORT_LOGS_TASK);
mCancelButton->hide();
mImportDataButton->hide();
@@ -461,153 +464,14 @@ bool CDatabaseMgrPage::CleanSingleZTLogFiles()
bool CDatabaseMgrPage::ArchiveDB()
{
QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
QDate FilterDate = QDate::currentDate();
FilterDate = FilterDate.addDays(-1 * mArchiveKeepDays->value());
mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Archivage de la base de données\n%d fichiers à analyser",LogsList->size()));
mDBMaintenanceProgressBar->setRange(0,LogsList->size());
QDir ArchiveDir = mLogMgrHandle->GetBaseLogDataDir();
ArchiveDir.cdUp();
QString Path = QString("Archives/%1").arg(QDate::currentDate().toString("yyyy-MM-dd"));
ArchiveDir.mkpath(Path);
ArchiveDir.cd(Path);
QDir CurDir;
QFileInfo FileInfo;
if(LogsList->at(0)->mZTLogType == ZT1_LOG_TYPE)
{
CZT1LogElement *tmp = (CZT1LogElement*)LogsList->at(0);
QFileInfo FilePath(tmp->mLogFileName);
CurDir = ArchiveDir;
QDir StationDir = FilePath.dir();
StationDir.cdUp();
CurDir.mkdir(StationDir.dirName());
CurDir.cd(StationDir.dirName());
CurDir.mkdir(FilePath.dir().dirName());
CurDir.cd(FilePath.dir().dirName());
FileInfo = FilePath;
}
else
{
CZT2LogElement *tmp =(CZT2LogElement*)LogsList->at(0);
QFileInfo FilePath(tmp->mLogFileName);
CurDir = ArchiveDir;
QDir StationDir = FilePath.dir();
StationDir.cdUp();
CurDir.mkdir(StationDir.dirName());
CurDir.cd(StationDir.dirName());
CurDir.mkdir(FilePath.dir().dirName());
CurDir.cd(FilePath.dir().dirName());
FileInfo = FilePath;
}
int IgnoredFiles = 0;
for(int i = 0; i < LogsList->size(); i++)
{
if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE)
{
CZT1LogElement *tmp = (CZT1LogElement*)LogsList->at(i);
//We are changing directory...
if(CurDir.dirName() != QFileInfo(tmp->mLogFileName).dir().dirName())
{
//Copy the Log file into the archive
QFile::copy(FileInfo.dir().absoluteFilePath("ZTLog.txt"),CurDir.absoluteFilePath("ZTLog.txt"));
QDir DatabaseDir = FileInfo.dir();
DatabaseDir.setFilter(QDir::Files);
QStringList filter;
filter << "*.bin";
DatabaseDir.setNameFilters(filter);
//If no binary file is left in the database dir, delete it.
if(DatabaseDir.count() == 0)
{
filter.clear();
DatabaseDir.setNameFilters(filter);
RemoveDir(DatabaseDir);
}
//Create the new archive dir.
QFileInfo FilePath(tmp->mLogFileName);
CurDir = ArchiveDir;
QDir StationDir = FilePath.dir();
StationDir.cdUp();
CurDir.mkdir(StationDir.dirName());
CurDir.cd(StationDir.dirName());
CurDir.mkdir(FilePath.dir().dirName());
CurDir.cd(FilePath.dir().dirName());
FileInfo = FilePath;
}
FileInfo = QFileInfo(tmp->mLogFileName);
//Copy the file into archive
QFile::copy(FileInfo.filePath(),CurDir.absoluteFilePath(FileInfo.fileName()));
//Check if we have to delete the source file
if((tmp->mZTDetections.size() == 0) && (tmp->mPassageDateTime.date() < FilterDate) && (tmp->mFileProtected == false))
{
//Remove file from database
QFile::remove(FileInfo.filePath());
}
else
{
IgnoredFiles++;
}
}
else
{
CZT2LogElement *tmp =(CZT2LogElement*)LogsList->at(i);
if(CurDir.dirName() != QFileInfo(tmp->mLogFileName).dir().dirName())
{
//Copy the Log file into the archive
QFile::copy(FileInfo.dir().absoluteFilePath("ZTLog.txt"),CurDir.absoluteFilePath("ZTLog.txt"));
QDir DatabaseDir = FileInfo.dir();
DatabaseDir.setFilter(QDir::Files);
DatabaseDir.setNameFilters(QStringList("*.bin"));
//If no binary file is left in the database dir, delete it.
if(DatabaseDir.count() == 0)
{
RemoveDir(DatabaseDir);
}
//Create the new archive dir.
QFileInfo FilePath(tmp->mLogFileName);
CurDir = ArchiveDir;
QDir StationDir = FilePath.dir();
StationDir.cdUp();
CurDir.mkdir(StationDir.dirName());
CurDir.cd(StationDir.dirName());
CurDir.mkdir(FilePath.dir().dirName());
CurDir.cd(FilePath.dir().dirName());
FileInfo = FilePath;
}
FileInfo = QFileInfo(tmp->mLogFileName);
//Copy the file into archive
QFile::copy(FileInfo.filePath(),CurDir.absoluteFilePath(FileInfo.fileName()));
//Check if we have to delete the source file
if((tmp->mZTDetections.size() == 0) && (tmp->mPassageDateTime.date() < FilterDate))
{
//Remove file from database
QFile::remove(FileInfo.filePath());
}
else
{
IgnoredFiles++;
}
}
}
mDatabaseImporterWorkerThread->SetDatabasePath(mProgramHandle->GetLogDataPath());
mDatabaseImporterWorkerThread->SetLogMgrHandle(mLogMgrHandle);
mDatabaseImporterWorkerThread->SetThreadTask(CDatabaseImporterThread::DATABASE_THREAD_ARCHIVE_DB_TASK);
QDate FilterDate = QDate::currentDate().addDays(-1 * (mArchiveKeepDays->value()));
mDatabaseImporterWorkerThread->SetDatabaseFilters(FilterDate);
mDatabaseImporterThread->start();
return true;
@@ -633,6 +497,15 @@ void CDatabaseMgrPage::DatabaseImportFinished(bool ret,QStringList* FilesList)
}
}
void CDatabaseMgrPage::DatabaseArchiveFinished(bool success, int IgnoredFiles)
{
mProgramHandle->RebuildDatabaseFile();
mDatabaseImporterThread->quit();
mCancelButton->show();
mImportDataButton->show();
mCancelImportButton->hide();
}
void CDatabaseMgrPage::SetProgressText(QString Text)
{
mProgressStatusText->setPlainText(Text);
@@ -740,6 +613,238 @@ CDatabaseImporterThread::CDatabaseImporterThread()
mKillThread = false;
}
void CDatabaseImporterThread::ExecuteThread()
{
switch(mThreadTask)
{
case DATABASE_THREAD_NO_TASK:
{
return;
break;
}
case DATABASE_THREAD_IMPORT_LOGS_TASK:
{
ImportLogs();
break;
}
case DATABASE_THREAD_ARCHIVE_DB_TASK:
{
ArchiveDB();
break;
}
}
}
int CDatabaseImporterThread::ArchiveDB()
{
mKillThread = false;
emit SetProgressBarRange(0,0);
emit ResetProgressBar();
emit SetProgressText("Copie des fichiers dans l'archive");
//Create archive dir.
QDir ArchiveDir = mLogMgrHandle->GetBaseLogDataDir();
ArchiveDir.cdUp();
QString Path = QString("Archives");//.arg(QDate::currentDate().toString("yyyy-MM-dd"));
ArchiveDir.mkpath(Path);
ArchiveDir.cd(Path);
/* int ret = -1;
emit SetProgressText("Compression de l'archive...");
QString CmdLine = QString(".\\7zip\\7z a %1\\ArchiveTrains%2.7z %3 -r").arg(QDir::toNativeSeparators(ArchiveDir.absolutePath())).arg(QDate::currentDate().toString("yyyy-MM-dd")).arg(QDir::toNativeSeparators(mLogMgrHandle->GetBaseLogDataDir().absolutePath()));
//ret = QProcess::execute(CmdLine.toAscii().data());
QString Exec7zip = ".\\7zip\\7z.exe";
QStringList Params;
Params << "a"
<< QString("%1\\ArchiveTrains%2.7z").arg(QDir::toNativeSeparators(ArchiveDir.absolutePath())).arg(QDate::currentDate().toString("yyyy-MM-dd"))
<< QDir::toNativeSeparators(mLogMgrHandle->GetBaseLogDataDir().absolutePath())
<< "-r"
<< "-bsp1"
<< "-bso0";
m7zipProcess = new QProcess();
m7zipProcess->start(Exec7zip,Params);
if(m7zipProcess->waitForStarted() == false)
{
ret = -1;
}
else
{
while(m7zipProcess->state() == QProcess::Running)
{
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
QString StdOut;
StdOut = QString(m7zipProcess->readAllStandardOutput());
if(StdOut.isEmpty() == false)
{
qDebug(qPrintable(StdOut));
emit SetProgressText(StdOut);
}
}
ret = 0;
}
emit SetProgressBarRange(0,1);
emit ResetProgressBar();
if(ret != 0 && ret != 1)
{
//Return values of 7z.exe
mKillThread = true;
switch(ret)
{
case 2:
{
emit SetProgressText("Échec de compression, erreur fatale.");
break;
}
case 7:
{
emit SetProgressText("Échec de compression, erreur ligne de commande.");
break;
}
case 8:
{
emit SetProgressText("Échec de compression, mémoire insuffisante");
break;
}
case 255:
{
emit SetProgressText("Échec de compression, intervention de l'utilisateur.");
break;
}
case -2:
{
emit SetProgressText("Échec de compression, 7z.exe introuvable.");
break;
}
default:
{
break;
}
}
emit DatabaseArchiveFinished(false,0);
mThreadTask = DATABASE_THREAD_NO_TASK;
return RET_ERROR;
}
*/
int IgnoredFiles = 0;
QList<CLogElement*> *LogsList = mLogMgrHandle->GetLogsList();
emit SetProgressBarRange(0,LogsList->size());
emit ResetProgressBar();
emit SetProgressText("Nettoyage de l'archive");
QDir LastDir;
if(LogsList->at(0)->mZTLogType == ZT1_LOG_TYPE)
{
CZT1LogElement *tmp = (CZT1LogElement*)LogsList->at(0);
QFileInfo FilePath(tmp->mLogFileName);
LastDir = FilePath.dir();
}
else
{
CZT2LogElement *tmp =(CZT2LogElement*)LogsList->at(0);
QFileInfo FilePath(tmp->mLogFileName);
LastDir = FilePath.dir();
}
for(int i = 0; i < LogsList->size(); i++)
{
bool DeleteFile = false;
QFileInfo FileInfo;
emit SetProgressBarVal(i);
// if(IsThreadKilled())
// {
// emit DatabaseArchiveFinished(false,0);
// return;
// }
if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE)
{
CZT1LogElement *tmp = (CZT1LogElement*)LogsList->at(i);
FileInfo = QFileInfo(tmp->mLogFileName);
emit SetProgressText(QString("Analyse: %1").arg(FileInfo.fileName()));
if((tmp->mZTDetections.size() == 0) && (tmp->mPassageDateTime.date() < mDatabaseArchiveFilterDate) && (tmp->mFileProtected == false))
{
//Remove file from database
DeleteFile = true;
}
else
{
DeleteFile = false;
IgnoredFiles++;
}
}
else
{
CZT2LogElement *tmp = (CZT2LogElement*)LogsList->at(i);
FileInfo = QFileInfo(tmp->mLogFileName);
if((tmp->mZTDetections.size() == 0) && (tmp->mPassageDateTime.date() < mDatabaseArchiveFilterDate) && (tmp->mFileProtected == false))
{
//Remove file from database
DeleteFile = true;
}
else
{
DeleteFile = false;
IgnoredFiles++;
}
}
//Delete the current file if necessary...
if(DeleteFile == true)
{
QFile::remove(FileInfo.filePath());
}
//Check if we are changing directory or analyzing the last one...
if(LastDir.dirName() != FileInfo.dir().dirName() ||
i == LogsList->size() - 1 )
{
//Check if we need to delete the directory (if there are any .bin in the dir, we have to keep it)
//Make a list of the .bin files in the directory
LastDir.setFilter(QDir::Files);
QStringList filter;
filter << "*.bin";
LastDir.setNameFilters(filter);
//If no binary file is left in the database dir, delete it.
if(LastDir.count() == 0)
{
LastDir.setNameFilters(QStringList());
ClearDir(LastDir);
if(QDir().rmdir(LastDir.absolutePath()) == false)
{
qDebug("Could not delete dir...");
}
}
}
LastDir = FileInfo.dir();
}
emit ResetProgressBar();
emit SetProgressText(QString("Archivage terminé. %1 fichiers conservés").arg(IgnoredFiles));
emit DatabaseArchiveFinished(true,IgnoredFiles);
mThreadTask = DATABASE_THREAD_NO_TASK;
return RET_OK;
}
void CDatabaseImporterThread::ImportLogs()
{
@@ -787,6 +892,7 @@ void CDatabaseImporterThread::ImportLogs()
if(DataFilePath.isEmpty())
{
emit DatabaseImportFinished(false,0);
mThreadTask = DATABASE_THREAD_NO_TASK;
return;
}
@@ -909,6 +1015,7 @@ void CDatabaseImporterThread::ImportLogs()
if(IsThreadKilled())
{
emit DatabaseImportFinished(false,0);
mThreadTask = DATABASE_THREAD_NO_TASK;
return;
}
}
@@ -972,6 +1079,7 @@ void CDatabaseImporterThread::ImportLogs()
if(IsThreadKilled())
{
emit DatabaseImportFinished(false,0);
mThreadTask = DATABASE_THREAD_NO_TASK;
return;
}
// emit SetProgressBarVal(i+1);
@@ -981,13 +1089,15 @@ void CDatabaseImporterThread::ImportLogs()
emit SetProgressText(QString().sprintf("Importation terminée avec succès\n%d passages ignorés\n%d fichiers copiés dans %d répertoires",NbDeletedFiles,NbCopiedFiles,NbCopiedDirs));
emit DatabaseImportFinished(true,NewFilesList);
mThreadTask = DATABASE_THREAD_NO_TASK;
return;
}
int CDatabaseImporterThread::CopyDir(QDir Dir, QDir DestDir, bool NotifyWhenCopied)
int CDatabaseImporterThread::CopyDir(QDir Dir, QDir DestDir, bool NotifyWhenCopied, bool Recursive)
{
int CopiedFiles = 0;
@@ -1008,13 +1118,26 @@ int CDatabaseImporterThread::CopyDir(QDir Dir, QDir DestDir, bool NotifyWhenCopi
{
ProgressValue++;
emit SetProgressBarVal(ProgressValue);
emit SetProgressText(QString().sprintf("Copie des fichiers dans la BD\n%s",f.toUtf8().data()));
emit SetProgressText(QString().sprintf("Copie des fichiers\n%s",f.toUtf8().data()));
}
if(IsThreadKilled())
{
return CopiedFiles;
}
}
if(Recursive)
{
foreach (QString f, Dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot))
{
CopyDir(Dir.absolutePath()+QDir::separator()+f,DestDir.absolutePath()+QDir::separator()+f,true,true);
if(IsThreadKilled())
{
return CopiedFiles;
}
}
}
return CopiedFiles;
}
@@ -1092,6 +1215,14 @@ int CDatabaseImporterThread::ParseDir(QDir dir)
return 1;
}
bool CDatabaseImporterThread::SetThreadTask(int task)
{
mMutex.lockForWrite();
mThreadTask = task;
mMutex.unlock();
return true;
}
void CDatabaseImporterThread::SetImporParams(QStringList SelectedDirs, bool FilterDuplicates, bool OnlyErrorLogs)
{
mSelectedDirs = SelectedDirs;
@@ -1099,6 +1230,11 @@ void CDatabaseImporterThread::SetImporParams(QStringList SelectedDirs, bool Filt
mOnlyErrorLogs = OnlyErrorLogs;
}
void CDatabaseImporterThread::SetDatabaseFilters(QDate FilterDate)
{
mDatabaseArchiveFilterDate = FilterDate;
}
void CDatabaseImporterThread::KillThread()
{
mMutex.lockForWrite();
@@ -1117,3 +1253,8 @@ bool CDatabaseImporterThread::IsThreadKilled()
return tmp;
}
void CDatabaseImporterThread::New7zipStdOutput()
{
}
+30 -3
View File
@@ -43,6 +43,8 @@
#include <QReadWriteLock>
#include "ZTLogFilesMgr.h"
#include <QSpinBox>
#include <QDateTime>
#include <QProcess>
//#include "DatabaseArchiver.h"
class COutilZT;
@@ -51,23 +53,41 @@ class CDatabaseImporterThread : public QObject
{
Q_OBJECT
public:
enum eDatabaseThreadTask
{
DATABASE_THREAD_NO_TASK,
DATABASE_THREAD_IMPORT_LOGS_TASK,
DATABASE_THREAD_ARCHIVE_DB_TASK
};
CDatabaseImporterThread();
void SetDatabasePath(QString path){mDatabasePath = path;}
void SetLogMgrHandle(CLogMgr *Handle){mLogMgrHandle = Handle;}
void SetImporParams(QStringList SelectedDirs, bool FilterDuplicates, bool OnlyErrorLogs);
void SetDatabaseFilters(QDate FilterDate);
void KillThread();
bool SetThreadTask(int task);
public slots:
void ImportLogs();
void ExecuteThread();
void New7zipStdOutput();
// void Process7zipFinished();
private:
int ParseDir(QDir dir);
int CopyDir(QDir Dir, QDir DestDir,bool NotifyWhenCopied = false);
int CopyDir(QDir Dir, QDir DestDir,bool NotifyWhenCopied = false, bool Recursive = false);
bool ClearDir(QDir Dir);
bool DeleteFile(QString FilePath);
void ImportLogs();
int ArchiveDB();
// bool mProcess7zipRunning
bool mKillThread;
QReadWriteLock mMutex;
@@ -81,6 +101,9 @@ private:
bool IsThreadKilled();
int ProgressValue;
int mThreadTask;
QDate mDatabaseArchiveFilterDate;
QProcess *m7zipProcess;
signals:
@@ -89,6 +112,8 @@ signals:
void SetProgressBarVal(int);
void ResetProgressBar();
void SetProgressText(QString);
void DatabaseArchiveFinished(bool, int);
};
@@ -133,6 +158,7 @@ private:
CDatabaseImporterThread *mDatabaseImporterWorkerThread;
QThread *mDatabaseImporterThread;
bool ImportData(bool OnlyError, bool FilterDuplicates);
bool CleanDBDuplicates();
bool CleanDBNormalPasses();
@@ -153,6 +179,7 @@ private:
public slots:
void ButtonClicked(CTextButtonWidget *);
void DatabaseImportFinished(bool,QStringList*);
void DatabaseArchiveFinished(bool,int);
void SetProgressText(QString);
};
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef OUTILZTVERSION_H
#define OUTILZTVERSION_H
#define SOFTWARE_VERSION "1.14"
#define SOFTWARE_VERSION "1.15"
#endif // OUTILZTVERSION_H