/******************************************************************************* * * * Société de Transports de Montréal. * * 2012 * * * * Projet Zones Tests * * * * * * * *******************************************************************************/ /* Description: Page de sélection des options (sélection des fonctions de détection, ingénierie, mode entretien, etc.). */ /* ************************************************************************** */ /* Revision: ### 20131021 JFM Verision d'origine. ### YYYMMDD Description du besoin ou du bug Description du changement. */ /* ************************************************************************** */ #include "DatabaseMgrPage.h" #include #include "GlobalDefine.h" #include #include #include "OutilZT.h" #include #include #include #include #include "OutilZT.h" #include #include #include #include #include #include #include #include #include CDatabaseMgrPage::~CDatabaseMgrPage() { delete mDatabaseImporterThread; delete mDatabaseImporterWorkerThread; } CDatabaseMgrPage::CDatabaseMgrPage(QGraphicsWidget *Parent, bool EngMode) { Q_UNUSED(Parent) mProgramHandle = 0; mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); QBrush BackgroundBrush(QColor(245, 245, 255)); mBackgroundRect->setBrush(BackgroundBrush); QGraphicsTextItem *Title = new QGraphicsTextItem("Base de données",this); QFont font; font.setPointSize(18); Title->setFont(font); Title->setPos(40,10); mCancelButton = new CTextButtonWidget("Fermer"); mCancelButton->setParentItem(this); mCancelButton->setPos(50,360); connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mImportDataButton = new CTextButtonWidget("Importer"); mImportDataButton->setParentItem(this); mImportDataButton->setPos(125,200); connect(mImportDataButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mImportDataButton->hide(); mCancelImportButton = new CTextButtonWidget("Annuler"); mCancelImportButton->setParentItem(this); mCancelImportButton->setPos(125,200); mCancelImportButton->hide(); connect(mCancelImportButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); Title = new QGraphicsTextItem("Importation de passages",this); font.setPointSize(14); Title->setFont(font); Title->setPos(40,70); QPen RectPen; RectPen.setWidth(2); QGraphicsRectItem *ImportZoneFrame = new QGraphicsRectItem(this); ImportZoneFrame->setRect(QRectF(0,0,230,230)); ImportZoneFrame->setPos(40,100); ImportZoneFrame->setPen(RectPen); QGraphicsProxyWidget *WidgetProxy = new QGraphicsProxyWidget(this); mImportErrorDataOnlyChkBx = new QCheckBox("Seulement les déclenchements"); WidgetProxy->setWidget(mImportErrorDataOnlyChkBx); WidgetProxy->setPos(60,110); mImportErrorDataOnlyChkBx->setChecked(false); WidgetProxy = new QGraphicsProxyWidget(this); mFilterDuplicateChkBx = new QCheckBox("Filtrer les doublons"); WidgetProxy->setWidget(mFilterDuplicateChkBx); WidgetProxy->setPos(60,140); mFilterDuplicateChkBx->setChecked(true); // WidgetProxy = new QGraphicsProxyWidget(this); // mDeleteSourceDataChkBx = new QCheckBox("Effacer données sources"); // WidgetProxy->setWidget(mDeleteSourceDataChkBx); // WidgetProxy->setPos(60,170); mProgressBar = new QProgressBar(); WidgetProxy = new QGraphicsProxyWidget(this); WidgetProxy->setWidget(mProgressBar); WidgetProxy->setPos(60,240); font.setPointSize(8); mProgressStatusText = new QGraphicsTextItem(this); mProgressStatusText->setFont(font); mProgressStatusText->setPos(60,260); mProgressStatusText->setPlainText("Progrès de l'importation"); mDatabaseImporterWorkerThread = new CDatabaseImporterThread(); mDatabaseImporterThread = new QThread(); mDatabaseImporterWorkerThread->moveToThread(mDatabaseImporterThread); 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); font.setPointSize(14); Title->setFont(font); Title->setPos(350,70); QGraphicsRectItem *MaintenanceZoneFrame = new QGraphicsRectItem(this); MaintenanceZoneFrame->setRect(QRectF(0,0,320,240)); MaintenanceZoneFrame->setPos(350,100); MaintenanceZoneFrame->setPen(RectPen); mDeleteDBDuplicatesBtn = new CTextButtonWidget("Effacer doublons"); mDeleteDBDuplicatesBtn->setParentItem(this); mDeleteDBDuplicatesBtn->setPos(360,110); connect(mDeleteDBDuplicatesBtn,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mDeleteDBDuplicatesBtn->hide(); mDeleteNonErrorLogs = new CTextButtonWidget("Effacer passages sans décl."); mDeleteNonErrorLogs->setParentItem(this); mDeleteNonErrorLogs->setPos(360,140); connect(mDeleteNonErrorLogs,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mDeleteZTLogFiles = new CTextButtonWidget("Effacer fichiers ZTLOG orphelins"); mDeleteZTLogFiles->setParentItem(this); mDeleteZTLogFiles->setPos(360,170); connect(mDeleteZTLogFiles,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mRebuildDatabaseFile = new CTextButtonWidget("Reconstruire le fichier BD"); mRebuildDatabaseFile->setParentItem(this); mRebuildDatabaseFile->setPos(360,200); connect(mRebuildDatabaseFile,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mArchiveDatabase = new CTextButtonWidget("Archiver les passages"); mArchiveDatabase->setParentItem(this); mArchiveDatabase->setPos(360,230); connect(mArchiveDatabase,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); mArchiveKeepDays = new QSpinBox(); WidgetProxy = new QGraphicsProxyWidget(this); WidgetProxy->setWidget(mArchiveKeepDays); WidgetProxy->setPos(525,230); mArchiveKeepDays->setMaximum(100); mArchiveKeepDays->setMinimum(0); mArchiveKeepDays->setValue(10); mArchiveKeepDays->setSuffix(" Jours conservés"); mArchiveKeepDays->resize(140,30); mDBMaintenanceProgressBar = new QProgressBar(); WidgetProxy = new QGraphicsProxyWidget(this); WidgetProxy->setWidget(mDBMaintenanceProgressBar); WidgetProxy->setPos(360,275); font.setPointSize(8); mDBMaintenanceProgressStatusText = new QGraphicsTextItem(this); mDBMaintenanceProgressStatusText->setFont(font); mDBMaintenanceProgressStatusText->setPos(360,305); mDBMaintenanceProgressStatusText->setPlainText(""); if(EngMode == false) { mDeleteDBDuplicatesBtn->hide(); mDeleteNonErrorLogs->hide(); mDeleteZTLogFiles->hide(); mRebuildDatabaseFile->hide(); mDBMaintenanceProgressBar->hide(); mDBMaintenanceProgressStatusText->hide(); mFilterDuplicateChkBx->hide(); } font.setPointSize(12); mDBFileCountText = new QGraphicsTextItem(this); mDBFileCountText->setFont(font); mDBFileCountText->setPos(300,10); mDBFileCountText->setPlainText("Nombre de passages: 440\nNombre de fichiers ZTLog: 30"); } void CDatabaseMgrPage::resizeEvent(QGraphicsSceneResizeEvent *event) { Q_UNUSED(event) mBackgroundRect->setRect(boundingRect()); } void CDatabaseMgrPage::ButtonClicked(CTextButtonWidget *BtnPtr) { if(BtnPtr == mCancelButton) { hide(); } else if(BtnPtr == mImportDataButton) { ImportData(mImportErrorDataOnlyChkBx->isChecked(), mFilterDuplicateChkBx->isChecked()); } else if(BtnPtr == mCancelImportButton) { mDatabaseImporterWorkerThread->KillThread(); } else if(BtnPtr == mDeleteDBDuplicatesBtn) { CleanDBDuplicates(); } else if(BtnPtr == mDeleteNonErrorLogs) { if(QMessageBox::question(0,"Attention","Voulez vous vraiment éliminer les passages\nsans déclenchements?\nCette action est irréversible",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) { CleanDBNormalPasses(); } } else if(BtnPtr == mDeleteZTLogFiles) { if(QMessageBox::question(0,"Attention","Voulez vous vraiment éliminer les fichiers orphelins?\nCette action est irréversible",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) { CleanSingleZTLogFiles(); } } else if(BtnPtr == mRebuildDatabaseFile) { mProgramHandle->RebuildDatabaseFile(); } else if(BtnPtr == mArchiveDatabase) { ArchiveDB(); } } bool CDatabaseMgrPage::ImportData(bool OnlyErrorLogs, bool FilterDuplicates) { //Ask the user to select the data source directories... QStringList SelectedDirs; SelectedDirs.clear(); QFileDialog FileDlg; FileDlg.setFileMode(QFileDialog::DirectoryOnly); QListView *l = FileDlg.findChild("listView"); if (l) { l->setSelectionMode(QAbstractItemView::MultiSelection); } QTreeView *t = FileDlg.findChild(); if (t) { t->setSelectionMode(QAbstractItemView::MultiSelection); } if(FileDlg.exec() == QDialog::Rejected) { return false; } SelectedDirs = FileDlg.selectedFiles(); if(SelectedDirs.isEmpty()) return false; mDatabaseImporterWorkerThread->SetDatabasePath(mProgramHandle->GetLogDataPath()); mDatabaseImporterWorkerThread->SetImporParams(SelectedDirs,FilterDuplicates,OnlyErrorLogs); mDatabaseImporterWorkerThread->SetLogMgrHandle(mLogMgrHandle); mDatabaseImporterWorkerThread->SetThreadTask(CDatabaseImporterThread::DATABASE_THREAD_IMPORT_LOGS_TASK); mCancelButton->hide(); mImportDataButton->hide(); mCancelImportButton->show(); mDatabaseImporterThread->start(); return true; } bool CDatabaseMgrPage::CleanDBDuplicates() { int NbDeletedFiles = 0; QList *LogsList = mLogMgrHandle->GetLogsList(); mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); mDBMaintenanceProgressBar->setRange(0,LogsList->size()); for(int i = 0; i < LogsList->size(); i++) { mDBMaintenanceProgressBar->setValue(i+1); for(int j = i+1; j < LogsList->size(); j++) { QCoreApplication::processEvents(); if((LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE) && (LogsList->at(j)->mZTLogType == ZT1_LOG_TYPE)) { CZT1LogElement *ZT1LogElement_A = (CZT1LogElement*)LogsList->at(i); CZT1LogElement *ZT1LogElement_B = (CZT1LogElement*)LogsList->at(j); if(ZT1LogElement_A->mStationName == ZT1LogElement_B->mStationName) { if(ZT1LogElement_A->mPassageDateTime == ZT1LogElement_B->mPassageDateTime) { //delete file from element B... DeleteFile(ZT1LogElement_B->mLogFileName); NbDeletedFiles++; mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); } } } else if((LogsList->at(i)->mZTLogType == ZT2_LOG_TYPE) && (LogsList->at(j)->mZTLogType == ZT2_LOG_TYPE)) { CZT2LogElement *ZT2LogElement_A = (CZT2LogElement*)LogsList->at(i); CZT2LogElement *ZT2LogElement_B = (CZT2LogElement*)LogsList->at(j); if(ZT2LogElement_A->mStationName == ZT2LogElement_B->mStationName) { if(ZT2LogElement_A->mPassageDateTime == ZT2LogElement_B->mPassageDateTime) { //delete file from element B... DeleteFile(ZT2LogElement_B->mLogFileName); NbDeletedFiles++; mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); } } } } } mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des doublons terminée\n%d passages éliminés",NbDeletedFiles)); mProgramHandle->LogsDatabaseChanged(0); return true; } bool CDatabaseMgrPage::CleanDBNormalPasses() { int NbDeletedFiles = 0; QList *LogsList = mLogMgrHandle->GetLogsList(); mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); mDBMaintenanceProgressBar->setRange(0,LogsList->size()); for(int i = 0; i < LogsList->size(); i++) { mDBMaintenanceProgressBar->setValue(i+1); QCoreApplication::processEvents(); if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE) { CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->at(i); if(ZT1LogElement->mZTDetections.size() == 0 /*&& ZT1LogElement->mFlags.mIsProblematicPassage != 1*/ && ZT1LogElement->mFileProtected == false) { DeleteFile(ZT1LogElement->mLogFileName); NbDeletedFiles++; mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); } } else { CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->at(i); if(ZT2LogElement->mZTDetections.size() == 0 /*&& ZT2LogElement->mFlags.mIsProblematicPassage != 1*/ && ZT2LogElement->mFileProtected == false) { //delete file from element B... DeleteFile(ZT2LogElement->mLogFileName); NbDeletedFiles++; mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); } } } mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des passages terminée\n%d passages éliminés",NbDeletedFiles)); mProgramHandle->LogsDatabaseChanged(0); return true; } bool CDatabaseMgrPage::CleanSingleZTLogFiles() { QList *ZTLogFilesList; ZTLogFilesList = mZTLogFilesManager->GetZTLogsList(); if(ZTLogFilesList->size() == 0) return true; mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); mDBMaintenanceProgressBar->setRange(0,ZTLogFilesList->size()); int NbRemoved = 0; for(int i = 0; i < ZTLogFilesList->size(); i++) { mDBMaintenanceProgressBar->setValue(i+1); QFileInfo ZTLogFile(ZTLogFilesList->at(i).mZTLogFilePath); QDir ZTLogFileDir = ZTLogFile.absoluteDir(); ZTLogFileDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); if(ZTLogFileDir.entryList().size() == 1) { NbRemoved++; if(ZTLogFileDir.remove(ZTLogFile.absoluteFilePath())) { //qDebug("Removed %s",ZTLogFile.absoluteFilePath().toUtf8().data()); } ZTLogFileDir.rmdir(ZTLogFile.absolutePath()); { //qDebug("Removed %s",ZTLogFile.absolutePath().toUtf8().data()); } ZTLogFilesList->removeAt(i); i--; } } mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des fichiers terminée\n%d fichiers ZTLOG éliminés",NbRemoved)); mDBMaintenanceProgressBar->setRange(0,ZTLogFilesList->size()); mProgramHandle->ZTLogFilesChanged(); return true; } bool CDatabaseMgrPage::ArchiveDB() { 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; } void CDatabaseMgrPage::DatabaseImportFinished(bool ret,QStringList* FilesList) { if(ret == false) { mProgressBar->reset(); mProgressStatusText->setPlainText("Importation non terminée..."); } mDatabaseImporterThread->quit(); mCancelButton->show(); mImportDataButton->show(); mCancelImportButton->hide(); if(ret == true) { mProgramHandle->LogsDatabaseChanged(FilesList); FilesList->clear(); delete 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); } bool CDatabaseMgrPage::DeleteFile(QString FilePath) { QDir dir; if(dir.remove(FilePath) == false) { qDebug("Could not delete file %s",FilePath.toUtf8().data()); return false; } qDebug("File deleted: %s",FilePath.toUtf8().data()); return true; } bool CDatabaseMgrPage::RemoveDir(QDir Dir) { if (!Dir.exists()) return true; QFileInfoList DirList = Dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); for(int i = 0; i < DirList.size(); i++) { // QFileInfo info(DirList.at(i)); if (DirList.at(i).isDir()) { if (!RemoveDir(QDir(DirList.at(i).filePath()))) { qDebug("Cannot delete %s",DirList.at(i).absoluteFilePath().toUtf8().data()); return false; } // else // { // if(Dir.rmdir(DirList.at(i).absoluteFilePath()) == false) // { // qDebug("Could not delete %s",DirList.at(i).filePath().toUtf8().data()); // } // } } else { if (Dir.remove(DirList.at(i).absoluteFilePath()) == false) { qDebug("Cannot delete %s",DirList.at(i).absoluteFilePath().toUtf8().data()); // return false; } } } if(QDir().rmdir(Dir.absolutePath()) == false) { qDebug("Could not delete %s",Dir.absolutePath().toUtf8().data()); return false; } return true; } void CDatabaseMgrPage::UpdateDBStats() { int NbTrains, NbZTLog; NbTrains = mLogMgrHandle->GetLogsCount(); NbZTLog = mZTLogFilesManager->GetZTLogFilesCount(); mDBFileCountText->setPlainText(QString().sprintf("Nombre de passages: %d\nNombre de fichiers ZTLog: %d",NbTrains,NbZTLog)); } void CDatabaseMgrPage::EnableEngineeringMode() { //mDeleteDBDuplicatesBtn->show(); mDeleteNonErrorLogs->show(); mDeleteZTLogFiles->show(); mRebuildDatabaseFile->show(); mDBMaintenanceProgressBar->show(); mDBMaintenanceProgressStatusText->show(); mFilterDuplicateChkBx->show(); } void CDatabaseMgrPage::EnableLogImport() { mImportDataButton->show(); } //Grab the mouse if the user clicks outside buttons void CDatabaseMgrPage::mousePressEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } void CDatabaseMgrPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event) } void CDatabaseMgrPage::showEvent(QShowEvent *event) { //qDebug("Show"); UpdateDBStats(); } CDatabaseImporterThread::CDatabaseImporterThread() { mLogMgrHandle = 0; 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; } delete m7zipProcess; int IgnoredFiles = 0; QList *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() { mKillThread = false; bool OnlyErrorLogs = mOnlyErrorLogs; bool FilterDuplicates = mFilterDuplicates; QStringList SelectedDirs = mSelectedDirs; int NbDeletedFiles = 0; int NbCopiedFiles = 0; int NbCopiedDirs = 0; ClearDir(QDir("./Temp")); emit SetProgressBarRange(0,SelectedDirs.size()); emit ResetProgressBar(); emit SetProgressText("Copie des répertoires temporaires"); //Copy the files for(int i = 0; i < SelectedDirs.size(); i++) { QDir SrcDir(SelectedDirs.at(i)); QString tmp = "./Temp/" + SrcDir.dirName(); QDir DestDir(tmp); CopyDir(SrcDir,DestDir); emit SetProgressBarVal(i+1); if(IsThreadKilled()) { emit DatabaseImportFinished(false,0); return; } } // Parse each directory to add. QFileInfoList DataFilePath; DataFilePath.clear(); QDir TempDir("./Temp"); DataFilePath = TempDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); if(DataFilePath.isEmpty()) { emit DatabaseImportFinished(false,0); mThreadTask = DATABASE_THREAD_NO_TASK; return; } QString DatabasePath = mDatabasePath; QList *ExistingLogsList = mLogMgrHandle->GetLogsList(); QStringList LogFilters; LogFilters << "*.bin"; bool CopyDirectory = true; if(FilterDuplicates == true || OnlyErrorLogs == true) { for(int i = 0; i < DataFilePath.size(); i++) { QFileInfoList list; //Load files in base directory QDir LogDir(DataFilePath.at(i).absoluteFilePath()); LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); LogDir.setNameFilters(LogFilters); LogDir.setSorting(QDir::Name); list = LogDir.entryInfoList(); if(list.size() != 0) { //If no filtering is required, just copy the directory... if(FilterDuplicates == false && OnlyErrorLogs == false) { CopyDirectory = true; } else { unsigned int ret; emit SetProgressBarRange(0,list.size()); emit ResetProgressBar(); emit SetProgressText(QString().sprintf("Vérification du répertoire:\n%s",DataFilePath.at(i).fileName().toUtf8().data())); for(int NewLogIndex = 0; NewLogIndex < list.size(); NewLogIndex++) { CLogElement *CurLogElement = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(NewLogIndex).absoluteFilePath(),ret); if(CurLogElement->mZTLogType == ZT1_LOG_TYPE) { CZT1LogElement * NewZT1Element = (CZT1LogElement*)CurLogElement; bool FileDeleted = false; if(OnlyErrorLogs && (FileDeleted == false)) { if(NewZT1Element->mZTDetections.size() == 0) { DeleteFile(list.at(NewLogIndex).absoluteFilePath()); FileDeleted = true; NbDeletedFiles++; } } if(FilterDuplicates && (FileDeleted == false)) { for(int ExistingLogIndex = 0; ExistingLogIndex < ExistingLogsList->size(); ExistingLogIndex++) { if(ExistingLogsList->at(ExistingLogIndex)->mZTLogType == ZT1_LOG_TYPE) { CZT1LogElement * ExistingZT1Element = (CZT1LogElement*)ExistingLogsList->at(ExistingLogIndex); if(ExistingZT1Element->mStationName == NewZT1Element->mStationName) { if(ExistingZT1Element->mPassageDateTime == NewZT1Element->mPassageDateTime) { //Delete the file from the temporary directory. DeleteFile(list.at(NewLogIndex).absoluteFilePath()); FileDeleted = true; NbDeletedFiles++; break; } } } } } } else //ZT2 { CZT2LogElement * NewZT2Element = (CZT2LogElement*)CurLogElement; bool FileDeleted = false; if(OnlyErrorLogs && (FileDeleted == false)) { if(NewZT2Element->mZTDetections.size() == 0) { DeleteFile(list.at(NewLogIndex).absoluteFilePath()); FileDeleted = true; NbDeletedFiles++; } } if(FilterDuplicates && (FileDeleted == false)) { for(int ExistingLogIndex = 0; ExistingLogIndex < ExistingLogsList->size(); ExistingLogIndex++) { if(ExistingLogsList->at(ExistingLogIndex)->mZTLogType == ZT2_LOG_TYPE) { CZT2LogElement * ExistingZT2Element = (CZT2LogElement*)ExistingLogsList->at(ExistingLogIndex); if(ExistingZT2Element->mStationName == NewZT2Element->mStationName) { if(ExistingZT2Element->mPassageDateTime == NewZT2Element->mPassageDateTime) { //Delete the file from the temporary directory. DeleteFile(list.at(NewLogIndex).absoluteFilePath()); FileDeleted = true; NbDeletedFiles++; } } } } } } emit SetProgressBarVal(NewLogIndex+1); delete CurLogElement; if(IsThreadKilled()) { emit DatabaseImportFinished(false,0); mThreadTask = DATABASE_THREAD_NO_TASK; return; } } } } else { CopyDirectory = true; } } } QStringList *NewFilesList = new QStringList; if(CopyDirectory) { QDir TmpDir("./Temp"); DataFilePath.clear(); DataFilePath = TmpDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); //Find the number of files to copy for the progress bar... int NbFilesToCopy = 0; for(int i = 0; i < DataFilePath.size(); i++) { QDir SrcDir(DataFilePath.at(i).absoluteFilePath()); NbFilesToCopy += SrcDir.entryList(QDir::Files).size(); } emit SetProgressBarRange(0,NbFilesToCopy); emit ResetProgressBar(); ProgressValue = 0; emit SetProgressText("Copie des fichiers dans la BD"); for(int i = 0; i < DataFilePath.size(); i++) { QString StationDir; StationDir.clear(); QStringList DirNameNibbles = DataFilePath.at(i).fileName().split('_'); if(DirNameNibbles.size() == 3) { StationDir = DirNameNibbles.at(1); QDir SrcDir(DataFilePath.at(i).absoluteFilePath()); QString tmp = DatabasePath + SrcDir.separator() + StationDir + SrcDir.separator() + SrcDir.dirName(); QDir DestDir(QDir::cleanPath(tmp)); NbCopiedFiles += CopyDir(SrcDir,DestDir,true); NbCopiedDirs++; QFileInfoList FilesList = DestDir.entryInfoList(QDir::Files); for(int i = 0; i < FilesList.size(); i++) { NewFilesList->append(FilesList.at(i).absoluteFilePath()); } } else { qDebug("Erreur, nom de répertoire illégal : %s",DataFilePath.at(i).absoluteFilePath().toUtf8().data()); } if(IsThreadKilled()) { emit DatabaseImportFinished(false,0); mThreadTask = DATABASE_THREAD_NO_TASK; return; } // emit SetProgressBarVal(i+1); } } emit ResetProgressBar(); 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, bool Recursive) { int CopiedFiles = 0; if (!Dir.exists()) { return false; } Dir.mkpath(DestDir.absolutePath()); foreach (QString f, Dir.entryList(QDir::Files)) { QFile::copy(Dir.absolutePath() + QDir::separator() + f, DestDir.absolutePath() + QDir::separator() + f); CopiedFiles++; if(NotifyWhenCopied) { ProgressValue++; emit SetProgressBarVal(ProgressValue); 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; } bool CDatabaseImporterThread::ClearDir(QDir Dir) { if (!Dir.exists()) return true; QFileInfoList DirList = Dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); for(int i = 0; i < DirList.size(); i++) { // QFileInfo info(DirList.at(i)); if (DirList.at(i).isDir()) { if (!ClearDir(QDir(DirList.at(i).filePath()))) { return false; } else { if(Dir.rmdir(DirList.at(i).absoluteFilePath()) == false) { qDebug("Could not delete %s",DirList.at(i).filePath().toUtf8().data()); } } } else { if (Dir.remove(DirList.at(i).absoluteFilePath()) == false) { qDebug("Cannot delete %s",DirList.at(i).absoluteFilePath().toUtf8().data()); // return false; } } } return true; } bool CDatabaseImporterThread::DeleteFile(QString FilePath) { QDir dir; if(dir.remove(FilePath) == false) { qDebug("Could not delete file %s",FilePath.toUtf8().data()); return false; } qDebug("File deleted: %s",FilePath.toUtf8().data()); return true; } int CDatabaseImporterThread::ParseDir(QDir dir) { QStringList LogFilters; QFileInfoList list; // QString LogDataDir = mProgramHandle->GetLogDataPath(); LogFilters << "*.bin"; //Load files in base directory QDir LogDir(dir); LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); LogDir.setNameFilters(LogFilters); LogDir.setSorting(QDir::Name); list = LogDir.entryInfoList(); if(list.size() != 0) { } else return 0; 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; mFilterDuplicates = FilterDuplicates; mOnlyErrorLogs = OnlyErrorLogs; } void CDatabaseImporterThread::SetDatabaseFilters(QDate FilterDate) { mDatabaseArchiveFilterDate = FilterDate; } void CDatabaseImporterThread::KillThread() { mMutex.lockForWrite(); mKillThread = true; mMutex.unlock(); qDebug("Thread killed"); } bool CDatabaseImporterThread::IsThreadKilled() { bool tmp; mMutex.lockForRead(); tmp = mKillThread; mMutex.unlock(); return tmp; } void CDatabaseImporterThread::New7zipStdOutput() { }