/** * Handler for base download coordination * $Id$ * $HeadURL$ * $Author$ * Created by Philipp Dassow, NLST, 15-03-2018 */ #pragma once #include #include #include #include // db #include #include #include #include #include #include #include #include #include #include #include #include #include // dds #include #include #include #include "logger.h" namespace OcBaseDownload { class CopyDatabase; class DbDataEntry { public: virtual ~DbDataEntry() = default; }; template class DbData : public DbDataEntry { public: explicit DbData(std::vector &&dataVec) : m_dataVec(std::move(dataVec)) {} ~DbData() = default; const std::vector &data() const { return m_dataVec; } private: std::vector m_dataVec; }; class MainHandler; class HandlerBaseDownload : public QObject , protected Interface::Fts::StartBaseDownloadRequestHandler , protected Interface::Fts::LifeUpdateRequestHandler , protected ServiceManagement::Interface::Ftc::RestartGroupReplyHandler , protected ServiceManagement::Interface::Ftc::StopGroupReplyHandler { Q_OBJECT public: explicit HandlerBaseDownload(MainHandler *mainHandler, QObject *parent = nullptr); ~HandlerBaseDownload(); bool init(); // handling ErrorMessage void handleErrorMessage(const QString &err); void receiveAsmData(); void receiveExmData(); void receiveIsmData(); void receivePpmEx0Data(); void receivePpmExNData(); void receiveOpmData(); void receiveFlmData(); private slots: void updateBaseDownloadReply(); private: enum State { NotStarted = 0, Finished = 0x8000, StepCount = 20, // Update if adding new steps ... SingleStepSize = 100 / StepCount, ServicePortsInformationRequest = 1, ServicePortsInformationFinished = ServicePortsInformationRequest | Finished, // Donwloads AsmDownloadRequest = 2, AsmDownloadFinished = AsmDownloadRequest | Finished, ExmDownloadRequest = 3, ExmDownloadFinished = ExmDownloadRequest | Finished, IsmDownloadRequest = 4, IsmDownloadFinished = IsmDownloadRequest | Finished, PpmDownloadEx0Request = 5, PpmDownloadEx0Finished = PpmDownloadEx0Request | Finished, PpmDownloadExNRequest = 6, PpmDownloadExNFinished = PpmDownloadExNRequest | Finished, OpmDownloadRequest = 7, OpmDownloadFinished = OpmDownloadRequest | Finished, FlmDownloadRequest = 8, FlmDownloadFinished = FlmDownloadRequest | Finished, // removing old exercise DeletingOldExercise = 20, DeletingOldExerciseFinished = DeletingOldExercise | Finished, // storing new db data InsertingAsmData = 21, InsertingAsmDataFinished = InsertingAsmData | Finished, InsertingPpmEx0Data = 22, InsertingPpmEx0DataFinished = InsertingPpmEx0Data | Finished, InsertingExmData = 23, InsertingExmDataFinished = InsertingExmData | Finished, InsertingIsmData = 24, InsertingIsmDataFinished = InsertingIsmData | Finished, InsertingPpmExNData = 25, InsertingPpmExNDataFinished = InsertingPpmExNData | Finished, InsertingOpmData = 26, InsertingOpmDataFinished = InsertingOpmData | Finished, InsertingFlmData = 27, InsertingFlmDataFinished = InsertingFlmData | Finished, UpdatingLtsConfig = 28, UpdatingLtsConfigFinished = UpdatingLtsConfig | Finished, CopyDatabaseRequest = 29, CopyDatabaseFinished = CopyDatabaseRequest | Finished, DropOldDatabaseRequest = 30, DropOldDatabaseFinished = DropOldDatabaseRequest | Finished, CopyDataRequest = 31, CopyDataFinished = CopyDataRequest | Finished, }; enum DbDataType { AsmTrainingArea = 1, AsmLocation = 2, AsmAsset = 3, AsmTechnicalArea = 4, ExmExercise = 10, ExmExercisePhase = 11, ExmExerciseStateChange = 12, IsmAsset = 20, IsmMainStructureElement = 21, IsmStructureElement = 23, IsmStructureElementFootprint = 24, IsmMountingPointAsset = 25, IsmMountingPointSchedule = 26, IsmMountingPointPlan = 27, IsmSpecialArea = 28, PpmEquipmentType = 30, PpmType = 31, PpmParty = 32, PpmParticipant = 33, OpmGroup = 40, OpmGroupGroup = 41, OpmOperator = 42, OpmOperatorExercise = 43, OpmSettings = 44, OpmAccessControlLevel = 45, OpmAclAllow = 46, OpmAclDeny = 47, FlmFolder = 50, FlmFileContent = 51 }; void onStartBaseDownloadRequest(const rti::core::SampleIdentity &cookie, const StartBaseDownloadRequest &request) override; void onLifeUpdateRequest(const rti::core::SampleIdentity &cookie, const LiveUpdateRequest &request) override; // state, connection, db and service handling void switchLog(State state, const std::string ¤tStep); void stateFinished(); void switchState(); void dropOldDatabase(); void onDropOldDatabaseFailed(); void onDropOldDatabaseFinished(); void copyDatabase(); void onCopyDbFailed(); void onCopyDbFinished(); bool openDbConnection(const QString &databaseName); bool openRemoteDbConnection(const QString &remoteDatabaseName); QSqlDatabase openDb(const QString &databaseName, bool remote, bool *bOk); void closeDb(QSqlDatabase &dbConn); template const std::vector &getDbDataVec(DbDataType type) const; // download completion checks void checkForAsmFinished(); void checkForExmFinished(); void checkForIsmFinished(); void checkForPpmEx0Finished(); void checkForPpmExNFinished(); void checkForOpmFinished(); void checkForFlmFinished(); // inserting new data void removeOldExercises(); void replaceAsmDbData(); void createNewExercise(); void replaceExmDbData(); void replaceIsmDbData(); void replacePpmEx0DbData(); void insertPpmExNDbData(bool live = false); void replaceOpmDbData(); void replaceFlmDbData(); void cleanup(const Core::FtReplyState &replyState, const std::string &errStr = std::string()); void retryCurrentSelect(); void copyFromOldDatabase(); void copyOldOpmData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldEvlData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldMsgData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldFlmData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldMrkData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldEscData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldFltData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; void copyOldAesData(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut) const; bool copyTable(const QSqlDatabase &dbIn, const QSqlDatabase &dbOut, QString tableName); bool fixUpSequence(const QSqlDatabase &dbOut, const QString &tableName); void updateLtsConfig(); void onStopGroupReply(const Core::FunctionReplyObject &reply) override; void onRestartGroupReply(const Core::FunctionReplyObject &reply) override; void restartCoreGroup(); QString currentDatabaseName() const; QString nextDatabaseName() const; int getFolderId(const QVector &dataVec, const QString &folderName, int exerciseId) const; void checkAliveTimer(); std::shared_ptr m_fts; std::shared_ptr m_scmDtc; std::shared_ptr m_scmFtc; // DB data vector QMap m_dataVecMap; template void storeToDataVecMap(DbDataType type, std::vector &&dataVec) { delete m_dataVecMap.take(type); m_dataVecMap[type] = new DbData(std::move(dataVec)); } rti::core::SampleIdentity m_baseDownloadCookie; BaseDownloadReply m_reply; QTimer *m_baseDownloadReplyUpdateTimer; MainHandler *m_mainHandler; int m_exerciseId; int m_operatorId; QString m_hostname; //int m_currentPort; State m_currentState; QSqlDatabase m_dbConnection; QSqlDatabase m_remoteDbConnection; QElapsedTimer m_aliveTimer; //int m_webSocketRetryCounter; int m_remoteDbRetryCounter; QSet m_stopGroupIds; QVector m_databasesToDrop; CopyDatabase *m_copyDatabase; DBAdministration::ExerciseTableGenerator *m_exTblGen; LOGGER_T &m_logger; }; } // namespace OcBaseDownload