]> granicus.if.org Git - icinga2/blob - lib/db_ido/dbtype.cpp
Merge pull request #7185 from Icinga/bugfix/gelfwriter-wrong-log-facility
[icinga2] / lib / db_ido / dbtype.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
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>
8
9 using namespace icinga;
10
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))
13 { }
14
15 String DbType::GetName() const
16 {
17         return m_Name;
18 }
19
20 String DbType::GetTable() const
21 {
22         return m_Table;
23 }
24
25 long DbType::GetTypeID() const
26 {
27         return m_TypeID;
28 }
29
30 String DbType::GetIDColumn() const
31 {
32         return m_IDColumn;
33 }
34
35 void DbType::RegisterType(const DbType::Ptr& type)
36 {
37         boost::mutex::scoped_lock lock(GetStaticMutex());
38         GetTypes()[type->GetName()] = type;
39 }
40
41 DbType::Ptr DbType::GetByName(const String& name)
42 {
43         String typeName;
44
45         if (name == "CheckCommand" || name == "NotificationCommand" || name == "EventCommand")
46                 typeName = "Command";
47         else
48                 typeName = name;
49
50         boost::mutex::scoped_lock lock(GetStaticMutex());
51         auto it = GetTypes().find(typeName);
52
53         if (it == GetTypes().end())
54                 return nullptr;
55
56         return it->second;
57 }
58
59 DbType::Ptr DbType::GetByID(long tid)
60 {
61         boost::mutex::scoped_lock lock(GetStaticMutex());
62
63         for (const TypeMap::value_type& kv : GetTypes()) {
64                 if (kv.second->GetTypeID() == tid)
65                         return kv.second;
66         }
67
68         return nullptr;
69 }
70
71 DbObject::Ptr DbType::GetOrCreateObjectByName(const String& name1, const String& name2)
72 {
73         ObjectLock olock(this);
74
75         auto it = m_Objects.find(std::make_pair(name1, name2));
76
77         if (it != m_Objects.end())
78                 return it->second;
79
80         DbObject::Ptr dbobj = m_ObjectFactory(this, name1, name2);
81         m_Objects[std::make_pair(name1, name2)] = dbobj;
82
83         String objName = name1;
84
85         if (!name2.IsEmpty())
86                 objName += "!" + name2;
87
88         String objType = m_Name;
89
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);
100                 }
101         }
102
103         dbobj->SetObject(ConfigObject::GetObject(objType, objName));
104
105         return dbobj;
106 }
107
108 boost::mutex& DbType::GetStaticMutex()
109 {
110         static boost::mutex mutex;
111         return mutex;
112 }
113
114 /**
115  * Caller must hold static mutex.
116  */
117 DbType::TypeMap& DbType::GetTypes()
118 {
119         static DbType::TypeMap tm;
120         return tm;
121 }
122
123 std::set<DbType::Ptr> DbType::GetAllTypes()
124 {
125         std::set<DbType::Ptr> result;
126
127         {
128                 boost::mutex::scoped_lock lock(GetStaticMutex());
129                 for (const auto& kv : GetTypes()) {
130                         result.insert(kv.second);
131                 }
132         }
133
134         return result;
135 }
136
137 DbTypeRegistry *DbTypeRegistry::GetInstance()
138 {
139         return Singleton<DbTypeRegistry>::GetInstance();
140 }
141