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::Versionget_changes ()=0
 Get newly available versions.
virtual std::vector< dunedaq::conffwk::Versionget_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_tget (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

ConfigObjectImplget_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

Configurationm_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 50 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 189 of file ConfigurationImpl.hpp.

◆ pre_notify

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

Callback to pre-notify database changes.

Definition at line 193 of file ConfigurationImpl.hpp.

Constructor & Destructor Documentation

◆ ConfigurationImpl()

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

The constructor.

Definition at line 231 of file ConfigurationImpl.cpp.

231 :
234 m_conf (0)
235{
236}
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 238 of file ConfigurationImpl.cpp.

239{
240 clean();
241}
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 386 of file ConfigurationImpl.cpp.

387{
388 for (auto& i : m_impl_objects)
389 {
390 for (auto& j : *i.second)
391 delete j.second;
392
393 delete i.second;
394 }
395
396 m_impl_objects.clear();
397
398 for (auto& x : m_tangled_objects)
399 delete x;
400
401 m_tangled_objects.clear();
402}
std::vector< ConfigObjectImpl * > m_tangled_objects
conffwk::pmap< conffwk::map< ConfigObjectImpl * > * > m_impl_objects
cache of implementation objects (class-name::->object_id->implementation)

◆ 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 405 of file ConfigurationImpl.cpp.

406{
407 return m_conf->m_impl_mutex;
408}

◆ 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 253 of file ConfigurationImpl.cpp.

254{
255
256 conffwk::pmap<conffwk::map<ConfigObjectImpl *> *>::const_iterator i = m_impl_objects.find(&name);
257
258 const std::string * class_name = nullptr;
259
260 if(i != m_impl_objects.end()) {
261 conffwk::map<ConfigObjectImpl *>::const_iterator j = i->second->find(id);
262
263 if(j != i->second->end()) {
265 TLOG_DEBUG(4) << "\n * found the object with id = \'" << id << "\' in class \'" << name << '\'' ;
266 return j->second;
267 }
268
269 class_name = i->first;
270
271
272 // prepare and print out debug message
273
274 if(ers::debug_level() >= 4) {
275 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << name
276 << "\' that has " << i->second->size() << " objects in cache: ";
277 for(j=i->second->begin(); j != i->second->end();++j) {
278 TLOG_DEBUG(40) << '\'' << j->first << '\'';
279 }
280 }
281
282 }
283 else {
284 class_name = &DalFactory::instance().get_known_class_name_ref(name);
285 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << name
286 << "\' that has no objects in cache";
287 }
288
289 // check implementation objects of subclasses
290
291 if(m_conf) {
292 conffwk::fmap<conffwk::fset>::const_iterator subclasses = m_conf->subclasses().find(class_name);
293
294 if(subclasses != m_conf->subclasses().end()) {
295 for(conffwk::fset::const_iterator k = subclasses->second.begin(); k != subclasses->second.end(); ++k) {
296 i = m_impl_objects.find(*k);
297 if(i != m_impl_objects.end()) {
298 conffwk::map<ConfigObjectImpl *>::const_iterator j = i->second->find(id);
299
300 if(j != i->second->end()) {
302 TLOG_DEBUG(40) << " * found the object with id = \'" << id << "\' in class \'" << *k << '\'';
303
304 return j->second;
305 }
306
307
308 // prepare and print out debug message
309
310 else if(ers::debug_level() >= 4) {
311 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << *k
312 << "\' that has " << i->second->size() << " objects in cache: ";
313 for(j=i->second->begin(); j != i->second->end();++j) {
314 TLOG_DEBUG(40) << '\'' << j->first << '\'';
315 }
316 }
317
318
319 }
320 else {
321 TLOG_DEBUG(40) << " * there is no object with id = \'" << id << "\' found in the class \'" << *k
322 << "\' that has no objects in cache\n";
323 }
324
325 }
326 }
327
328 TLOG_DEBUG(40) << " * there is no object \'" << id << "\' in class \'" << name
329 << "\' and it's subclasses, returning NULL ...";
330 }
331 else {
332 TLOG_DEBUG(40) << " * there is no object \'" << id << "\' in class \'" << name << "\', returning NULL ...";
333 }
334
335 return nullptr;
336}
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
int debug_level()
Definition ers.hpp:77

◆ 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 239 of file ConfigurationImpl.hpp.

240 {
241 ConfigObjectImpl * p = get_impl_object(class_name, id);
242
243 if (p == nullptr)
244 {
245 p = static_cast<ConfigObjectImpl *>(new T(obj, this));
246 put_impl_object(class_name, id, p);
247 }
248 else
249 {
250 static_cast<T *>(p)->set(obj);
251 p->m_state = dunedaq::conffwk::Valid;
252 }
253
254 return static_cast<T *>(p);
255 }
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
std::unordered_set< std::string > set
Definition set.hpp:17
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 244 of file ConfigurationImpl.cpp.

245{
246 std::cout <<
247 "Configuration implementation profiler report:\n"
248 " number of read objects: " << p_number_of_object_read << "\n"
249 " number of cache hits: " << p_number_of_cache_hits << std::endl;
250}

◆ 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 340 of file ConfigurationImpl.cpp.

341{
343
344 conffwk::pmap<conffwk::map<ConfigObjectImpl *> * >::iterator i = m_impl_objects.find(&name);
345
346 if(i != m_impl_objects.end()) {
347 (*i->second)[id] = obj;
348 obj->m_class_name = i->first;
349 }
350 else {
351 conffwk::map<ConfigObjectImpl *> * m = new conffwk::map<ConfigObjectImpl *>();
352 obj->m_class_name = &DalFactory::instance().get_known_class_name_ref(name);
353 m_impl_objects[obj->m_class_name] = m;
354 (*m)[id] = obj;
355 }
356}

◆ 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 359 of file ConfigurationImpl.cpp.

360{
361 conffwk::pmap<conffwk::map<ConfigObjectImpl *> *>::iterator i = m_impl_objects.find(class_name);
362
363 if (i != m_impl_objects.end())
364 {
365 conffwk::map<ConfigObjectImpl *>::iterator j = i->second->find(old_id);
366
367 if (j != i->second->end())
368 {
369 ConfigObjectImpl*& obj = (*i->second)[new_id];
370
371 if (obj != nullptr)
372 {
374 m_tangled_objects.push_back(obj);
375 }
376
377 obj = j->second;
378
379 TLOG_DEBUG(2) << "rename implementation " << (void *)j->second << " of object \'" << old_id << '@' << *class_name << "\' to \'" << new_id << '\'';
380 i->second->erase(j);
381 }
382 }
383}

◆ set()

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

set configuration object

Definition at line 279 of file ConfigurationImpl.hpp.

279{ 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 52 of file ConfigurationImpl.hpp.

◆ ConfigObjectImpl

friend class ConfigObjectImpl
friend

Definition at line 53 of file ConfigurationImpl.hpp.

◆ Configuration

friend class Configuration
friend

Definition at line 54 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 267 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 216 of file ConfigurationImpl.hpp.

◆ m_tangled_objects

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

Definition at line 217 of file ConfigurationImpl.hpp.

◆ p_number_of_cache_hits

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

Definition at line 219 of file ConfigurationImpl.hpp.

◆ p_number_of_object_read

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

Definition at line 220 of file ConfigurationImpl.hpp.


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