1#ifndef __DUNEDAQ_CONFFWK_DALREGISTRY_HXX__
2#define __DUNEDAQ_CONFFWK_DALREGISTRY_HXX__
14 TLOG_DEBUG(50) <<
"Building object " << obj.UID() <<
" of class " << obj.class_name() <<
" and returning class " << T::s_class_name;
26 auto it_dom =
m_class_domain_map.find(&DalFactory::instance().get_known_class_name_ref(T::s_class_name));
30 const std::string id(obj.UID() +
'@' + obj.class_name());
36 DalObject*& dal_ptr(domain.cache[obj.m_impl->m_id]);
37 T* result =
dynamic_cast<T*
>(dal_ptr);
39 if (result ==
nullptr) {
41 dal_ptr = DalFactory::instance().make(*
this, obj, T::s_class_name);
43 TLOG_DEBUG(50) <<
"Casting " << obj.UID() <<
" of class " << obj.class_name() <<
" to " << T::s_class_name;
44 result =
dynamic_cast<T*
>(dal_ptr);
45 TLOG_DEBUG(50) <<
"From " << (
void*)dal_ptr <<
" to " << (
void*)result;
48 std::lock_guard<std::mutex> scoped_lock(result->m_mutex);
49 result->init(init_children);
52 }
else if (obj.m_impl != result->p_obj.m_impl) {
54 std::lock_guard<std::mutex> scoped_lock(result->m_mutex);
59 TLOG_DEBUG(50) <<
"Returning " << (
void*)result;
67DalRegistry::get(
const std::string& name,
bool init_children,
bool init_object,
unsigned long rlevel,
const std::vector<std::string> * rclasses) {
71 const std::string& ref_name = DalFactory::instance().get_known_class_name_ref(T::s_class_name);
81 const std::string id(name +
'@' + T::s_class_name);
87 TLOG_DEBUG(50) <<
"Class domain for " << ref_name <<
" is " << it_dom->second;
89 auto it_ptr = domain.cache.find(ref_name);
93 if ( it_ptr == domain.cache.end()) {
97 m_confdb.
_get(T::s_class_name, name, obj, rlevel, rclasses);
99 DalObject*& dal_ptr(domain.cache[obj.m_impl->m_id]);
101 T* result =
dynamic_cast<T*
>(dal_ptr);
104 if (result ==
nullptr) {
106 dal_ptr = DalFactory::instance().make(*
this, obj, T::s_class_name);
108 TLOG_DEBUG(50) <<
"Casting " << obj.UID() <<
" of class " << obj.class_name() <<
" to " << T::s_class_name;
109 result =
dynamic_cast<T*
>(dal_ptr);
110 TLOG_DEBUG(50) <<
"From " << (
void*)dal_ptr <<
" to " << (
void*)result;
113 std::lock_guard<std::mutex> scoped_lock(result->m_mutex);
114 result->init(init_children);
116 }
else if (obj.m_impl != result->p_obj.m_impl) {
117 std::lock_guard<std::mutex> scoped_lock(result->m_mutex);
125 if (!strcmp(ex.get_type(),
"class")) {
127 std::ostringstream text;
128 text <<
"wrong database schema, cannot find class \"" << ex.get_data() <<
'\"';
137 std::cout <<
"Found " << (
void*)it_ptr->second << std::endl;
138 return dynamic_cast<T*
>(it_ptr->second);
147 std::lock_guard<std::mutex> scoped_lock(
m_mutex);
156 auto it_obj = domain.cache.find(
id);
157 return (it_obj != domain.cache.end() ?
dynamic_cast<T*
>(it_obj->second) :
nullptr);
174 return ((!res.
is_null()) ? this->get<T>(res, read_children, read_children) :
nullptr);
185 std::vector<ConfigObject> objs;
191 results.reserve(objs.size());
193 for (
auto& i : objs) {
194 auto ptr = this->
get<T>(i, read_children, read_children);
195 results.push_back(ptr);
207 std::lock_guard<std::mutex> scoped_lock(m_mutex);
209 auto it_dom = m_class_domain_map.find(&T::s_class_name);
210 if ( it_dom == m_class_domain_map.end()) {
214 for(
const auto& [uid, ptr] : m_cache_domains[it_dom->second].cache ) {
215 if ( ptr ==
object ) {
226 const std::vector<std::string>& removed,
227 const std::vector<std::string>& created) {
229 this->
update(T::s_class_name, modified, removed, created);
239 auto it_dom =
m_class_domain_map.find(&DalFactory::instance().get_known_class_name_ref(T::s_class_name));
249 for(
const auto& [uid, ptr] : domain.cache ) {
252 T* obj_ptr =
dynamic_cast<T*
>(ptr);
257 std::lock_guard<std::mutex> scoped_lock(domain.mutex);
258 obj_ptr->p_was_read =
false;
Represents database objects.
bool is_null() const noexcept
Check if object's implementation points to null.
void _get(const std::string &class_name, const std::string &id, ConfigObject &object, unsigned long rlevel, const std::vector< std::string > *rclasses)
static std::string mk_ref_ex_text(const char *what, const std::string &cname, const std::string &rname, const ConfigObject &obj) noexcept
bool is_superclass_of(const std::string &target, const std::string &source) noexcept
The base class for any generated DAL object.
DalObject * get(ConfigObject &obj, bool upcast_unregistered=false)
void _reset_objects()
Update state of objects after abort operations.
void update(const std::vector< std::string > &modified, const std::vector< std::string > &removed, const std::vector< std::string > &created)
Update cache of objects in case of modification.
std::unordered_map< uint, DalDomain > m_cache_domains
const T * _ref(ConfigObject &obj, const std::string &name, bool read_children)
Get signle value of object's relation and instantiate result with it (multi-thread safe).
conffwk::fmap< uint > m_class_domain_map
T * find(const std::string &id)
Find template object using ID.
bool is_valid(const T *object) noexcept
Checks validity of pointer to an objects of given user class.
Generic configuration exception.
Try to access non-existent object or class.
#define TLOG_DEBUG(lvl,...)