1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "db_ido/i2-db_ido.hpp"
7 #include "base/object.hpp"
8 #include "base/registry.hpp"
9 #include "base/singleton.hpp"
18 * A database object type.
22 class DbType final : public Object
25 DECLARE_PTR_TYPEDEFS(DbType);
27 typedef std::function<intrusive_ptr<DbObject> (const intrusive_ptr<DbType>&, const String&, const String&)> ObjectFactory;
28 typedef std::map<String, DbType::Ptr> TypeMap;
29 typedef std::map<std::pair<String, String>, intrusive_ptr<DbObject> > ObjectMap;
31 DbType(String name, String table, long tid, String idcolumn, ObjectFactory factory);
33 String GetName() const;
34 String GetTable() const;
35 long GetTypeID() const;
36 String GetIDColumn() const;
38 static void RegisterType(const DbType::Ptr& type);
40 static DbType::Ptr GetByName(const String& name);
41 static DbType::Ptr GetByID(long tid);
43 intrusive_ptr<DbObject> GetOrCreateObjectByName(const String& name1, const String& name2);
45 static std::set<DbType::Ptr> GetAllTypes();
52 ObjectFactory m_ObjectFactory;
54 static boost::mutex& GetStaticMutex();
55 static TypeMap& GetTypes();
61 * A registry for DbType objects.
65 class DbTypeRegistry : public Registry<DbTypeRegistry, DbType::Ptr>
68 static DbTypeRegistry *GetInstance();
72 * Factory function for DbObject-based classes.
77 intrusive_ptr<T> DbObjectFactory(const DbType::Ptr& type, const String& name1, const String& name2)
79 return new T(type, name1, name2);
82 #define REGISTER_DBTYPE(name, table, tid, idcolumn, type) \
83 INITIALIZE_ONCE([]() { \
84 DbType::Ptr dbtype = new DbType(#name, table, tid, idcolumn, DbObjectFactory<type>); \
85 DbType::RegisterType(dbtype); \