From 56ae875861ab260b80a030f50c4aff9f9dc8fff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 13:32:39 +0200 Subject: Adding upstream version 2.14.2. Signed-off-by: Daniel Baumann --- lib/db_ido/dbconnection.hpp | 138 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 lib/db_ido/dbconnection.hpp (limited to 'lib/db_ido/dbconnection.hpp') diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp new file mode 100644 index 0000000..517a8a4 --- /dev/null +++ b/lib/db_ido/dbconnection.hpp @@ -0,0 +1,138 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#ifndef DBCONNECTION_H +#define DBCONNECTION_H + +#include "db_ido/i2-db_ido.hpp" +#include "db_ido/dbconnection-ti.hpp" +#include "db_ido/dbobject.hpp" +#include "db_ido/dbquery.hpp" +#include "base/timer.hpp" +#include "base/ringbuffer.hpp" +#include +#include + +namespace icinga +{ + +/** + * A database connection. + * + * @ingroup db_ido + */ +class DbConnection : public ObjectImpl +{ +public: + DECLARE_OBJECT(DbConnection); + + static void InitializeDbTimer(); + + virtual const char * GetLatestSchemaVersion() const noexcept = 0; + virtual const char * GetCompatSchemaVersion() const noexcept = 0; + + void SetConfigHash(const DbObject::Ptr& dbobj, const String& hash); + void SetConfigHash(const DbType::Ptr& type, const DbReference& objid, const String& hash); + String GetConfigHash(const DbObject::Ptr& dbobj) const; + String GetConfigHash(const DbType::Ptr& type, const DbReference& objid) const; + + void SetObjectID(const DbObject::Ptr& dbobj, const DbReference& dbref); + DbReference GetObjectID(const DbObject::Ptr& dbobj) const; + + void SetInsertID(const DbObject::Ptr& dbobj, const DbReference& dbref); + void SetInsertID(const DbType::Ptr& type, const DbReference& objid, const DbReference& dbref); + DbReference GetInsertID(const DbObject::Ptr& dbobj) const; + DbReference GetInsertID(const DbType::Ptr& type, const DbReference& objid) const; + + void SetObjectActive(const DbObject::Ptr& dbobj, bool active); + bool GetObjectActive(const DbObject::Ptr& dbobj) const; + + void ClearIDCache(); + + void SetConfigUpdate(const DbObject::Ptr& dbobj, bool hasupdate); + bool GetConfigUpdate(const DbObject::Ptr& dbobj) const; + + void SetStatusUpdate(const DbObject::Ptr& dbobj, bool hasupdate); + bool GetStatusUpdate(const DbObject::Ptr& dbobj) const; + + int GetQueryCount(RingBuffer::SizeType span); + virtual int GetPendingQueryCount() const = 0; + + void ValidateFailoverTimeout(const Lazy& lvalue, const ValidationUtils& utils) final; + void ValidateCategories(const Lazy& lvalue, const ValidationUtils& utils) final; + +protected: + void OnConfigLoaded() override; + void Start(bool runtimeCreated) override; + void Stop(bool runtimeRemoved) override; + void Resume() override; + void Pause() override; + + virtual void ExecuteQuery(const DbQuery& query) = 0; + virtual void ExecuteMultipleQueries(const std::vector&) = 0; + virtual void ActivateObject(const DbObject::Ptr& dbobj) = 0; + virtual void DeactivateObject(const DbObject::Ptr& dbobj) = 0; + + virtual void CleanUpExecuteQuery(const String& table, const String& time_column, double max_age); + virtual void FillIDCache(const DbType::Ptr& type) = 0; + virtual void NewTransaction() = 0; + virtual void Disconnect() = 0; + + void UpdateObject(const ConfigObject::Ptr& object); + void UpdateAllObjects(); + + void PrepareDatabase(); + + void IncreaseQueryCount(); + + bool IsIDCacheValid() const; + void SetIDCacheValid(bool valid); + + void EnableActiveChangedHandler(); + + static void UpdateProgramStatus(); + + static int GetSessionToken(); + + void IncreasePendingQueries(int count); + void DecreasePendingQueries(int count); + + WorkQueue m_QueryQueue{10000000, 1, LogNotice}; + +private: + bool m_IDCacheValid{false}; + std::map, String> m_ConfigHashes; + std::map m_ObjectIDs; + std::map, DbReference> m_InsertIDs; + std::set m_ActiveObjects; + std::set m_ConfigUpdates; + std::set m_StatusUpdates; + Timer::Ptr m_CleanUpTimer; + Timer::Ptr m_LogStatsTimer; + + double m_LogStatsTimeout; + + void CleanUpHandler(); + void LogStatsHandler(); + + static Timer::Ptr m_ProgramStatusTimer; + static boost::once_flag m_OnceFlag; + + static void InsertRuntimeVariable(const String& key, const Value& value); + + mutable std::mutex m_StatsMutex; + RingBuffer m_QueryStats{15 * 60}; + bool m_ActiveChangedHandler{false}; + + RingBuffer m_InputQueries{10}; + RingBuffer m_OutputQueries{10}; + Atomic m_PendingQueries{0}; +}; + +struct database_error : virtual std::exception, virtual boost::exception { }; + +struct errinfo_database_query_; +typedef boost::error_info errinfo_database_query; + +} + +#endif /* DBCONNECTION_H */ -- cgit v1.2.3