DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::conffwk::ConfigurationImpl Class Referenceabstract

Provides pure virtual interface used by the Configuration class. More...

#include <ConfigurationImpl.hpp>

Inheritance diagram for dunedaq::conffwk::ConfigurationImpl:
[legend]
Collaboration diagram for dunedaq::conffwk::ConfigurationImpl:
[legend]

Public Types

typedef void(*) notify(std::vector< ConfigurationChange * > &changes, Configuration *)
 Callback to notify database changes.
typedef void(*) pre_notify(Configuration *)
 Callback to pre-notify database changes.

Public Member Functions

 ConfigurationImpl () noexcept
 The constructor.
virtual ~ConfigurationImpl ()
 Virtual destructor.
virtual void open_db (const std::string &db_name)=0
 Open database implementation in accordance with given name.
virtual void close_db ()=0
 Close database implementation.
virtual bool loaded () const noexcept=0
 Check if a database is loaded.
virtual void create (const std::string &db_name, const std::list< std::string > &includes)=0
 Create database.
virtual bool is_writable (const std::string &db_name)=0
 Return write access status.
virtual void add_include (const std::string &db_name, const std::string &include)=0
 Add include file.
virtual void remove_include (const std::string &db_name, const std::string &include)=0
 Remove include file.
virtual void get_includes (const std::string &db_name, std::list< std::string > &includes) const =0
 Get included files.
virtual void get_updated_dbs (std::list< std::string > &dbs) const =0
 Get uncommitted files.
virtual void set_commit_credentials (const std::string &user, const std::string &password)=0
 Set commit credentials.
virtual void commit (const std::string &log_message)=0
 Commit database changes.
virtual void abort ()=0
 Abort database changes.
virtual void prefetch_all_data ()=0
 Prefetch all data into client cache.
virtual std::vector< dunedaq::conffwk::Version > get_changes ()=0
 Get newly available versions.
virtual std::vector< dunedaq::conffwk::Version > get_versions (const std::string &since, const std::string &until, dunedaq::conffwk::Version::QueryType type, bool skip_irrelevant)=0
 Get archived versions.
virtual void get (const std::string &class_name, const std::string &id, ConfigObject &object, unsigned long rlevel, const std::vector< std::string > *rclasses)=0
 Get object of class by id.
virtual void get (const std::string &class_name, std::vector< ConfigObject > &objects, const std::string &query, unsigned long rlevel, const std::vector< std::string > *rclasses)=0
 Get objects of class according to query.
virtual void get (const ConfigObject &obj_from, const std::string &query, std::vector< ConfigObject > &objects, unsigned long rlevel, const std::vector< std::string > *rclasses)=0
 Get objects according to path.
virtual bool test_object (const std::string &class_name, const std::string &id, unsigned long rlevel, const std::vector< std::string > *rclasses)=0
 Test object existence (used by Python binding).
virtual void create (const std::string &at, const std::string &class_name, const std::string &id, ConfigObject &object)=0
 Create object of class by id at given file.
virtual void create (const ConfigObject &at, const std::string &class_name, const std::string &id, ConfigObject &object)=0
 Create object of class by id at file identified by object 'at'.
virtual void destroy (ConfigObject &object)=0
 Destroy object of class by id.
virtual dunedaq::conffwk::class_t * get (const std::string &class_name, bool direct_only)=0
 Get description of class in accordance with parameters.
virtual void get_superclasses (conffwk::fmap< conffwk::fset > &schema)=0
 Get inheritance hierarchy.
virtual void subscribe (const std::set< std::string > &class_names, const std::map< std::string, std::set< std::string > > &objs, notify cb, pre_notify pre_cb)=0
 Subscribe on database changes.
virtual void unsubscribe ()=0
 Remove subscription on database changes.
virtual void print_profiling_info () noexcept=0
 Print implementation specific profiling information.
void print_cache_info () noexcept
 Print profiling information about objects in cache.
void set (Configuration *db) noexcept
 set configuration object
void rename_impl_object (const std::string *class_name, const std::string &old_id, const std::string &new_id) noexcept
 rename object in cache

Protected Member Functions

ConfigObjectImpl * get_impl_object (const std::string &class_name, const std::string &id) const noexcept
 get object from cache
void put_impl_object (const std::string &class_name, const std::string &id, ConfigObjectImpl *obj) noexcept
 put object to cache
template<class T, class OBJ>
T * insert_object (OBJ &obj, const std::string &id, const std::string &class_name) noexcept
 insert new object (update cache or create-and-insert)
void clean () noexcept
 clean cache (e.g. to be used by destructor)
std::mutex & get_conf_impl_mutex () const
 Is required by reload methods.

Protected Attributes

Configuration * m_conf
 Configuration pointer is needed for notification on changes, e.g. in case of subscription or an object deletion.

Private Attributes

conffwk::pmap< conffwk::map< ConfigObjectImpl * > * > m_impl_objects
 cache of implementation objects (class-name::->object_id->implementation)
std::vector< ConfigObjectImpl * > m_tangled_objects
unsigned long p_number_of_cache_hits
unsigned long p_number_of_object_read

Friends

class ConfigObject
class ConfigObjectImpl
class Configuration

Detailed Description

Provides pure virtual interface used by the Configuration class.

The class has several pure virtual methods to manipulate databases, access database information, subscribe and receive notification on data changes. Any database implementation inherits from this class and implements it's methods.

The methods may throw dunedaq::conffwk::Exception exception (like Generic, NotFound) in case of an error unless noexcept is explicitly used in their specification.

Definition at line 48 of file ConfigurationImpl.hpp.

Member Typedef Documentation

◆ notify

typedef void(*) dunedaq::conffwk::ConfigurationImpl::notify(std::vector< ConfigurationChange * > &changes, Configuration *)

Callback to notify database changes.

Definition at line 201 of file ConfigurationImpl.hpp.

◆ pre_notify

typedef void(*) dunedaq::conffwk::ConfigurationImpl::pre_notify(Configuration *)

Callback to pre-notify database changes.

Definition at line 205 of file ConfigurationImpl.hpp.

Constructor & Destructor Documentation

◆ ConfigurationImpl()

dunedaq::conffwk::ConfigurationImpl::ConfigurationImpl ( )
noexcept

The constructor.

Definition at line 285 of file ConfigurationImpl.cpp.

288 , m_conf(0)
289{
290}
Configuration * m_conf
Configuration pointer is needed for notification on changes, e.g. in case of subscription or an objec...

◆ ~ConfigurationImpl()

dunedaq::conffwk::ConfigurationImpl::~ConfigurationImpl ( )
virtual

Virtual destructor.

Definition at line 292 of file ConfigurationImpl.cpp.

293{
294 clean();
295}
void clean() noexcept
clean cache (e.g. to be used by destructor)

Member Function Documentation

◆ abort()

virtual void dunedaq::conffwk::ConfigurationImpl::abort ( )
pure virtual

Abort database changes.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ add_include()

virtual void dunedaq::conffwk::ConfigurationImpl::add_include ( const std::string & db_name,
const std::string & include )
pure virtual

Add include file.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ clean()

void dunedaq::conffwk::ConfigurationImpl::clean ( )
protectednoexcept

clean cache (e.g. to be used by destructor)

Definition at line 433 of file ConfigurationImpl.cpp.

434{
435 for (auto& i : m_impl_objects) {
436 for (auto& j : *i.second)
437 delete j.second;
438
439 delete i.second;
440 }
441
442 m_impl_objects.clear();
443
444 for (auto& x : m_tangled_objects)
445 delete x;
446
447 m_tangled_objects.clear();
448}
conffwk::pmap< conffwk::map< ConfigObjectImpl * > * > m_impl_objects
cache of implementation objects (class-name::->object_id->implementation)
std::vector< ConfigObjectImpl * > m_tangled_objects

◆ close_db()

virtual void dunedaq::conffwk::ConfigurationImpl::close_db ( )
pure virtual

Close database implementation.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ commit()

virtual void dunedaq::conffwk::ConfigurationImpl::commit ( const std::string & log_message)
pure virtual

Commit database changes.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ create() [1/3]

virtual void dunedaq::conffwk::ConfigurationImpl::create ( const ConfigObject & at,
const std::string & class_name,
const std::string & id,
ConfigObject & object )
pure virtual

Create object of class by id at file identified by object 'at'.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ create() [2/3]

virtual void dunedaq::conffwk::ConfigurationImpl::create ( const std::string & at,
const std::string & class_name,
const std::string & id,
ConfigObject & object )
pure virtual

Create object of class by id at given file.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ create() [3/3]

virtual void dunedaq::conffwk::ConfigurationImpl::create ( const std::string & db_name,
const std::list< std::string > & includes )
pure virtual

Create database.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ destroy()

virtual void dunedaq::conffwk::ConfigurationImpl::destroy ( ConfigObject & object)
pure virtual

Destroy object of class by id.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get() [1/4]

virtual void dunedaq::conffwk::ConfigurationImpl::get ( const ConfigObject & obj_from,
const std::string & query,
std::vector< ConfigObject > & objects,
unsigned long rlevel,
const std::vector< std::string > * rclasses )
pure virtual

Get objects according to path.

◆ get() [2/4]

virtual dunedaq::conffwk::class_t * dunedaq::conffwk::ConfigurationImpl::get ( const std::string & class_name,
bool direct_only )
pure virtual

Get description of class in accordance with parameters.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get() [3/4]

virtual void dunedaq::conffwk::ConfigurationImpl::get ( const std::string & class_name,
const std::string & id,
ConfigObject & object,
unsigned long rlevel,
const std::vector< std::string > * rclasses )
pure virtual

Get object of class by id.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get() [4/4]

virtual void dunedaq::conffwk::ConfigurationImpl::get ( const std::string & class_name,
std::vector< ConfigObject > & objects,
const std::string & query,
unsigned long rlevel,
const std::vector< std::string > * rclasses )
pure virtual

Get objects of class according to query.

◆ get_changes()

virtual std::vector< dunedaq::conffwk::Version > dunedaq::conffwk::ConfigurationImpl::get_changes ( )
pure virtual

Get newly available versions.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get_conf_impl_mutex()

std::mutex & dunedaq::conffwk::ConfigurationImpl::get_conf_impl_mutex ( ) const
protected

Is required by reload methods.

Definition at line 451 of file ConfigurationImpl.cpp.

452{
453 return m_conf->m_impl_mutex;
454}

◆ get_impl_object()

ConfigObjectImpl * dunedaq::conffwk::ConfigurationImpl::get_impl_object ( const std::string & class_name,
const std::string & id ) const
protectednoexcept

get object from cache

Definition at line 309 of file ConfigurationImpl.cpp.

310{
311
312 conffwk::pmap<conffwk::map<ConfigObjectImpl*>*>::const_iterator i = m_impl_objects.find(&name);
313
314 const std::string* class_name = nullptr;
315
316 if (i != m_impl_objects.end()) {
317 conffwk::map<ConfigObjectImpl*>::const_iterator j = i->second->find(id);
318
319 if (j != i->second->end()) {
321 TLOG_DEBUG(4) << "\n * found the object with id = \'" << id << "\' in class \'" << name << '\'';
322 return j->second;
323 }
324
325 class_name = i->first;
326
327 // prepare and print out debug message
328
329 if (ers::debug_level() >= 4) {
330 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << name
331 << "\' that has " << i->second->size() << " objects in cache: ";
332 for (j = i->second->begin(); j != i->second->end(); ++j) {
333 TLOG_DEBUG(40) << '\'' << j->first << '\'';
334 }
335 }
336
337 } else {
338 class_name = &DalFactory::instance().get_known_class_name_ref(name);
339 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << name
340 << "\' that has no objects in cache";
341 }
342
343 // check implementation objects of subclasses
344
345 if (m_conf) {
346 conffwk::fmap<conffwk::fset>::const_iterator subclasses = m_conf->subclasses().find(class_name);
347
348 if (subclasses != m_conf->subclasses().end()) {
349 for (conffwk::fset::const_iterator k = subclasses->second.begin(); k != subclasses->second.end(); ++k) {
350 i = m_impl_objects.find(*k);
351 if (i != m_impl_objects.end()) {
352 conffwk::map<ConfigObjectImpl*>::const_iterator j = i->second->find(id);
353
354 if (j != i->second->end()) {
356 TLOG_DEBUG(40) << " * found the object with id = \'" << id << "\' in class \'" << *k << '\'';
357
358 return j->second;
359 }
360
361 // prepare and print out debug message
362
363 else if (ers::debug_level() >= 4) {
364 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << *k
365 << "\' that has " << i->second->size() << " objects in cache: ";
366 for (j = i->second->begin(); j != i->second->end(); ++j) {
367 TLOG_DEBUG(40) << '\'' << j->first << '\'';
368 }
369 }
370
371 } else {
372 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << *k
373 << "\' that has no objects in cache\n";
374 }
375 }
376 }
377
378 TLOG_DEBUG(40) << " * there is no object \'" << id << "\' in class \'" << name
379 << "\' and it's subclasses, returning NULL ...";
380 } else {
381 TLOG_DEBUG(40) << " * there is no object \'" << id << "\' in class \'" << name << "\', returning NULL ...";
382 }
383
384 return nullptr;
385}
const conffwk::fmap< conffwk::fset > & subclasses() const
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116
int debug_level()
Definition ers.hpp:80

◆ get_includes()

virtual void dunedaq::conffwk::ConfigurationImpl::get_includes ( const std::string & db_name,
std::list< std::string > & includes ) const
pure virtual

Get included files.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get_superclasses()

virtual void dunedaq::conffwk::ConfigurationImpl::get_superclasses ( conffwk::fmap< conffwk::fset > & schema)
pure virtual

Get inheritance hierarchy.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get_updated_dbs()

virtual void dunedaq::conffwk::ConfigurationImpl::get_updated_dbs ( std::list< std::string > & dbs) const
pure virtual

Get uncommitted files.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ get_versions()

virtual std::vector< dunedaq::conffwk::Version > dunedaq::conffwk::ConfigurationImpl::get_versions ( const std::string & since,
const std::string & until,
dunedaq::conffwk::Version::QueryType type,
bool skip_irrelevant )
pure virtual

Get archived versions.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ insert_object()

template<class T, class OBJ>
T * dunedaq::conffwk::ConfigurationImpl::insert_object ( OBJ & obj,
const std::string & id,
const std::string & class_name )
inlineprotectednoexcept

insert new object (update cache or create-and-insert)

Definition at line 247 of file ConfigurationImpl.hpp.

248 {
249 ConfigObjectImpl* p = get_impl_object(class_name, id);
250
251 if (p == nullptr) {
252 p = static_cast<ConfigObjectImpl*>(new T(obj, this));
253 put_impl_object(class_name, id, p);
254 } else {
255 static_cast<T*>(p)->set(obj);
256 p->m_state = dunedaq::conffwk::Valid;
257 }
258
259 return static_cast<T*>(p);
260 }
void put_impl_object(const std::string &class_name, const std::string &id, ConfigObjectImpl *obj) noexcept
put object to cache
ConfigObjectImpl * get_impl_object(const std::string &class_name, const std::string &id) const noexcept
get object from cache
void set(Configuration *db) noexcept
set configuration object
msgpack::object obj

◆ is_writable()

virtual bool dunedaq::conffwk::ConfigurationImpl::is_writable ( const std::string & db_name)
pure virtual

Return write access status.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ loaded()

virtual bool dunedaq::conffwk::ConfigurationImpl::loaded ( ) const
pure virtualnoexcept

Check if a database is loaded.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ open_db()

virtual void dunedaq::conffwk::ConfigurationImpl::open_db ( const std::string & db_name)
pure virtual

Open database implementation in accordance with given name.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ prefetch_all_data()

virtual void dunedaq::conffwk::ConfigurationImpl::prefetch_all_data ( )
pure virtual

Prefetch all data into client cache.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ print_cache_info()

void dunedaq::conffwk::ConfigurationImpl::print_cache_info ( )
noexcept

Print profiling information about objects in cache.

Definition at line 298 of file ConfigurationImpl.cpp.

299{
300 std::cout << "Configuration implementation profiler report:\n"
301 " number of read objects: "
303 << "\n"
304 " number of cache hits: "
305 << p_number_of_cache_hits << std::endl;
306}

◆ print_profiling_info()

virtual void dunedaq::conffwk::ConfigurationImpl::print_profiling_info ( )
pure virtualnoexcept

Print implementation specific profiling information.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ put_impl_object()

void dunedaq::conffwk::ConfigurationImpl::put_impl_object ( const std::string & class_name,
const std::string & id,
ConfigObjectImpl * obj )
protectednoexcept

put object to cache

Definition at line 388 of file ConfigurationImpl.cpp.

389{
391
392 conffwk::pmap<conffwk::map<ConfigObjectImpl*>*>::iterator i = m_impl_objects.find(&name);
393
394 if (i != m_impl_objects.end()) {
395 (*i->second)[id] = obj;
396 obj->m_class_name = i->first;
397 } else {
398 conffwk::map<ConfigObjectImpl*>* m = new conffwk::map<ConfigObjectImpl*>();
399 obj->m_class_name = &DalFactory::instance().get_known_class_name_ref(name);
400 m_impl_objects[obj->m_class_name] = m;
401 (*m)[id] = obj;
402 }
403}

◆ remove_include()

virtual void dunedaq::conffwk::ConfigurationImpl::remove_include ( const std::string & db_name,
const std::string & include )
pure virtual

Remove include file.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ rename_impl_object()

void dunedaq::conffwk::ConfigurationImpl::rename_impl_object ( const std::string * class_name,
const std::string & old_id,
const std::string & new_id )
noexcept

rename object in cache

Definition at line 406 of file ConfigurationImpl.cpp.

409{
410 conffwk::pmap<conffwk::map<ConfigObjectImpl*>*>::iterator i = m_impl_objects.find(class_name);
411
412 if (i != m_impl_objects.end()) {
413 conffwk::map<ConfigObjectImpl*>::iterator j = i->second->find(old_id);
414
415 if (j != i->second->end()) {
416 ConfigObjectImpl*& obj = (*i->second)[new_id];
417
418 if (obj != nullptr) {
420 m_tangled_objects.push_back(obj);
421 }
422
423 obj = j->second;
424
425 TLOG_DEBUG(2) << "rename implementation " << (void*)j->second << " of object \'" << old_id << '@' << *class_name
426 << "\' to \'" << new_id << '\'';
427 i->second->erase(j);
428 }
429 }
430}

◆ set()

void dunedaq::conffwk::ConfigurationImpl::set ( Configuration * db)
inlinenoexcept

set configuration object

Definition at line 278 of file ConfigurationImpl.hpp.

278{ m_conf = db; }

◆ set_commit_credentials()

virtual void dunedaq::conffwk::ConfigurationImpl::set_commit_credentials ( const std::string & user,
const std::string & password )
pure virtual

Set commit credentials.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ subscribe()

virtual void dunedaq::conffwk::ConfigurationImpl::subscribe ( const std::set< std::string > & class_names,
const std::map< std::string, std::set< std::string > > & objs,
notify cb,
pre_notify pre_cb )
pure virtual

Subscribe on database changes.

◆ test_object()

virtual bool dunedaq::conffwk::ConfigurationImpl::test_object ( const std::string & class_name,
const std::string & id,
unsigned long rlevel,
const std::vector< std::string > * rclasses )
pure virtual

Test object existence (used by Python binding).

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ unsubscribe()

virtual void dunedaq::conffwk::ConfigurationImpl::unsubscribe ( )
pure virtual

Remove subscription on database changes.

Implemented in dunedaq::oksconflibs::OksConfiguration.

◆ ConfigObject

friend class ConfigObject
friend

Definition at line 51 of file ConfigurationImpl.hpp.

◆ ConfigObjectImpl

friend class ConfigObjectImpl
friend

Definition at line 52 of file ConfigurationImpl.hpp.

◆ Configuration

friend class Configuration
friend

Definition at line 53 of file ConfigurationImpl.hpp.

Member Data Documentation

◆ m_conf

Configuration* dunedaq::conffwk::ConfigurationImpl::m_conf
protected

Configuration pointer is needed for notification on changes, e.g. in case of subscription or an object deletion.

Definition at line 269 of file ConfigurationImpl.hpp.

◆ m_impl_objects

conffwk::pmap<conffwk::map<ConfigObjectImpl*>*> dunedaq::conffwk::ConfigurationImpl::m_impl_objects
private

cache of implementation objects (class-name::->object_id->implementation)

Definition at line 229 of file ConfigurationImpl.hpp.

◆ m_tangled_objects

std::vector<ConfigObjectImpl*> dunedaq::conffwk::ConfigurationImpl::m_tangled_objects
private

Definition at line 230 of file ConfigurationImpl.hpp.

◆ p_number_of_cache_hits

unsigned long dunedaq::conffwk::ConfigurationImpl::p_number_of_cache_hits
mutableprivate

Definition at line 232 of file ConfigurationImpl.hpp.

◆ p_number_of_object_read

unsigned long dunedaq::conffwk::ConfigurationImpl::p_number_of_object_read
mutableprivate

Definition at line 233 of file ConfigurationImpl.hpp.


The documentation for this class was generated from the following files: