From 5ae20eb31a73ca93cb022cf6ed1573738e76c133 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 31 Jan 2014 10:35:04 +0100 Subject: [PATCH] Fix duplicate object IDs for command objects. Fixes #5584 --- lib/db_ido/dbtype.cpp | 14 ++++++++------ lib/db_ido/dbtype.h | 18 ++++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/db_ido/dbtype.cpp b/lib/db_ido/dbtype.cpp index b4716f67e..66cee3045 100644 --- a/lib/db_ido/dbtype.cpp +++ b/lib/db_ido/dbtype.cpp @@ -26,13 +26,14 @@ using namespace icinga; -DbType::DbType(const String& name, const String& table, long tid, const String& idcolumn, const DbType::ObjectFactory& factory) - : m_Name(name), m_Table(table), m_TypeID(tid), m_IDColumn(idcolumn), m_ObjectFactory(factory) +DbType::DbType(const String& table, long tid, const String& idcolumn, const DbType::ObjectFactory& factory) + : m_Table(table), m_TypeID(tid), m_IDColumn(idcolumn), m_ObjectFactory(factory) { } -String DbType::GetName(void) const +std::vector DbType::GetNames(void) const { - return m_Name; + boost::mutex::scoped_lock lock(GetStaticMutex()); + return m_Names; } String DbType::GetTable(void) const @@ -50,10 +51,11 @@ String DbType::GetIDColumn(void) const return m_IDColumn; } -void DbType::RegisterType(const DbType::Ptr& type) +void DbType::RegisterType(const String& name, const DbType::Ptr& type) { boost::mutex::scoped_lock lock(GetStaticMutex()); - GetTypes()[type->GetName()] = type; + type->m_Names.push_back(name); + GetTypes()[name] = type; } DbType::Ptr DbType::GetByName(const String& name) diff --git a/lib/db_ido/dbtype.h b/lib/db_ido/dbtype.h index a2a774268..f77a47cd0 100644 --- a/lib/db_ido/dbtype.h +++ b/lib/db_ido/dbtype.h @@ -44,14 +44,14 @@ public: typedef std::map TypeMap; typedef std::map, shared_ptr > ObjectMap; - DbType(const String& name, const String& table, long tid, const String& idcolumn, const ObjectFactory& factory); + DbType(const String& table, long tid, const String& idcolumn, const ObjectFactory& factory); - String GetName(void) const; + std::vector GetNames(void) const; String GetTable(void) const; long GetTypeID(void) const; String GetIDColumn(void) const; - static void RegisterType(const DbType::Ptr& type); + static void RegisterType(const String& name, const DbType::Ptr& type); static DbType::Ptr GetByName(const String& name); static DbType::Ptr GetByID(long tid); @@ -59,7 +59,7 @@ public: shared_ptr GetOrCreateObjectByName(const String& name1, const String& name2); private: - String m_Name; + std::vector m_Names; String m_Table; long m_TypeID; String m_IDColumn; @@ -95,8 +95,14 @@ class RegisterDbTypeHelper public: RegisterDbTypeHelper(const String& name, const String& table, long tid, const String& idcolumn, const DbType::ObjectFactory& factory) { - DbType::Ptr dbtype = make_shared(name, table, tid, idcolumn, factory); - DbType::RegisterType(dbtype); + DbType::Ptr dbtype; + + dbtype = DbType::GetByID(tid); + + if (!dbtype) + dbtype = make_shared(table, tid, idcolumn, factory); + + DbType::RegisterType(name, dbtype); } }; -- 2.40.0