#pragma once #include #include #include #include #include "PrtCnvThread.hpp" #include "PrtCnvRadioThread.hpp" #include #include #include namespace N_CoPrtCnv { class CoPrtCnvCentralTelegram; class CoPrtCnvRadioTelegram; } namespace PrtCnv { class PrtCnvThreadStarter; class PrtCnvStoredCentralTelegram; class PrtCnvStoredRadioTelegram; class PrtCnvMember; class PrtCnvDbThread : public PrtCnvThread { Q_OBJECT public: PrtCnvDbThread(const QString &dbDriver, const QString &dbHostName, const QString &dbDatabaseName, const QString &schemaName, const QString &dbUserName, const QString &dbPassword, PrtCnvThreadStarter* a_parent); ~PrtCnvDbThread(); int32_t start() override; int32_t stop() override; int32_t create(NGL::Settings *settings) override; int32_t init() override; void ackCentralTelegrams(int32_t a_counter); N_CoPrtCnv::CoPrtCnvCentralTelegram *getNextCentralTelegram(PrtCnvStoredCentralTelegram *& a_handle); void centralTelegramSent(const int32_t a_counter, PrtCnvStoredCentralTelegram *a_handle); void centralTelegramCouldNotBeSent(PrtCnvStoredCentralTelegram *a_handle); void radioTelegramSent(const uint32_t a_sendCounter, PrtCnvStoredRadioTelegram *a_handle, const uint32_t a_broadcastIndex); std::shared_ptr getNextRadioTelegram(PrtCnvStoredRadioTelegram *&a_handle); std::shared_ptr getNextBroadcastTelegram(); void storeCentralTelegram(const std::shared_ptr &a_centralTelegram, const N_CoPrtCnv::CoPrtCnvRadioTelegram &a_radioTelegram); void storeRadioTelegram(const std::shared_ptr &a_telegram, const int32_t a_readCounter); void centralCounterReadyForAck(const int32_t a_centralCounter); void addSqlCommand(const QString &sql); void cleanAndInit(); bool resendCentralTelegrams(const int32_t a_lastSendCounter); void prepareCentralTelegramsForReconnection(); void waitUntilDbWritten(); PrtCnvMember* getMemberByISSI(const uint32_t a_ISSI) const; PrtCnvMember* getMemberById(const uint16_t a_id); bool licenseMember(PrtCnvMember *a_member, const bool a_doLicense = true); void updateExerciseIdForMember(PrtCnvMember *a_member, int newExerciseId); PrtCnvMember* addMember(const int a_identity, const int a_ISSI); void removeMember(PrtCnvMember* a_member); uint8_t getResetCounter() const; void setResetCounter(uint8_t newVal); uint8_t getBattleFieldOperatingState() const; void setPause(const bool a_doSet = true); void setPositionSendTime(unsigned int sendTime); void setAirLoad(PrtCnvRadioThread::E_TrafficLoad airLoad); bool isEnvironmentResetCounterOld() const; std::shared_ptr getEnvironmentTelegram(); void setResetCounterOnEnvironment(); void incClaimCount(int a_identity); std::map getClaimStatistics() const; void setMachineState(const int a_newMachineState); bool mustProceedCleanup() const; protected: void closeDb(); std::vector m_CentralList; mutable QMutex m_BattleFieldOpStateMutex; mutable QMutex m_MemberListByIdMutex; mutable QMutex m_CentralListMutex; QSqlDatabase m_db; QAtomicInt m_CentralAckCounter; unsigned int m_OldCentralAckCounter; std::list m_RadioList; mutable QMutex m_RadioListMutex; std::vector m_SqlCommandList; mutable QMutex m_SqlCmdListMutex; mutable QMutex m_BroadcastMapMutex; std::list m_BroadcastList; bool m_DoClean; bool m_DoWaitUntilSqlWritten; std::unordered_map m_MemberListById; std::unordered_map m_MemberListByISSI; bool m_DoStorePermanent; uint8_t m_ResetCounter; uint8_t m_BattleFieldOperatingState; PrtCnvStoredRadioTelegram* m_EnvironmentTelegram; bool m_DoProceedCleanup; int32_t m_OldCentralCounter; QBasicAtomicInt m_StorePermanentPending; uint32_t m_NbrOfAttempts; bool createDatabase(); void sendStorePermanentSignal(); void storeCentralTelegrams(); int32_t storeRadioTelegrams(); void handleSqlCommandList(); void deleteTelegramsFromDbById(const QString &table); void updateTelegramsWriteCounter(const QString &table); void updateTelegramsBroadcast(const QString &table); void reinitDatabase(); QString toCentralTableName() const { return tableName(QStringLiteral("prtcnv_to_central")); } QString toRadioTableName() const { return tableName(QStringLiteral("prtcnv_to_radio")); } QString memberTableName() const { return tableName(QStringLiteral("prtcnv_member")); } QString statusTableName() const { return tableName(QStringLiteral("prtcnv_status")); } QString versionTableName() const { return tableName(QStringLiteral("prtcnv_version")); } QString tableName(const QString &table) const { return m_dbSchemaName.isEmpty() ? table : m_dbSchemaName + QLatin1Char('.') + table; } protected slots: void storePermanent(); void clean(); public: signals: void doStorePermanent(); void permanentStored(int32_t a_centralCounter); void doClean(); void playerLicencedChanged(int equipNo, N_CoPrtCnv::E_LicensingKind kind); private: std::vector m_telegramsToDelete; std::vector > m_telegramsToUpdateCounter; std::vector > m_telegramsToUpdateBC; std::vector > m_telegramsToInsert; QString m_dbDriver; QString m_dbHostName; QString m_dbDatabaseName; QString m_dbSchemaName; QString m_dbUserName; QString m_dbPassword; }; }