1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
3 #include "db_ido/dbtype.hpp"
4 #include "db_ido/dbconnection.hpp"
5 #include "base/objectlock.hpp"
6 #include "base/debug.hpp"
7 #include <boost/thread/once.hpp>
9 using namespace icinga;
11 DbType::DbType(String name, String table, long tid, String idcolumn, DbType::ObjectFactory factory)
12 : m_Name(std::move(name)), m_Table(std::move(table)), m_TypeID(tid), m_IDColumn(std::move(idcolumn)), m_ObjectFactory(std::move(factory))
15 String DbType::GetName() const
20 String DbType::GetTable() const
25 long DbType::GetTypeID() const
30 String DbType::GetIDColumn() const
35 void DbType::RegisterType(const DbType::Ptr& type)
37 boost::mutex::scoped_lock lock(GetStaticMutex());
38 GetTypes()[type->GetName()] = type;
41 DbType::Ptr DbType::GetByName(const String& name)
45 if (name == "CheckCommand" || name == "NotificationCommand" || name == "EventCommand")
50 boost::mutex::scoped_lock lock(GetStaticMutex());
51 auto it = GetTypes().find(typeName);
53 if (it == GetTypes().end())
59 DbType::Ptr DbType::GetByID(long tid)
61 boost::mutex::scoped_lock lock(GetStaticMutex());
63 for (const TypeMap::value_type& kv : GetTypes()) {
64 if (kv.second->GetTypeID() == tid)
71 DbObject::Ptr DbType::GetOrCreateObjectByName(const String& name1, const String& name2)
73 ObjectLock olock(this);
75 auto it = m_Objects.find(std::make_pair(name1, name2));
77 if (it != m_Objects.end())
80 DbObject::Ptr dbobj = m_ObjectFactory(this, name1, name2);
81 m_Objects[std::make_pair(name1, name2)] = dbobj;
83 String objName = name1;
86 objName += "!" + name2;
88 String objType = m_Name;
90 if (m_TypeID == DbObjectTypeCommand) {
91 if (objName.SubStr(0, 6) == "check_") {
92 objType = "CheckCommand";
93 objName = objName.SubStr(6);
94 } else if (objName.SubStr(0, 13) == "notification_") {
95 objType = "NotificationCommand";
96 objName = objName.SubStr(13);
97 } else if (objName.SubStr(0, 6) == "event_") {
98 objType = "EventCommand";
99 objName = objName.SubStr(6);
103 dbobj->SetObject(ConfigObject::GetObject(objType, objName));
108 boost::mutex& DbType::GetStaticMutex()
110 static boost::mutex mutex;
115 * Caller must hold static mutex.
117 DbType::TypeMap& DbType::GetTypes()
119 static DbType::TypeMap tm;
123 std::set<DbType::Ptr> DbType::GetAllTypes()
125 std::set<DbType::Ptr> result;
128 boost::mutex::scoped_lock lock(GetStaticMutex());
129 for (const auto& kv : GetTypes()) {
130 result.insert(kv.second);
137 DbTypeRegistry *DbTypeRegistry::GetInstance()
139 return Singleton<DbTypeRegistry>::GetInstance();