libinvdb/source/include/dbobjecttree_impl.hh

60 lines
1.6 KiB
C++

#ifndef INVENTORY_OBJECT_TREE_IMPL_HH_
#define INVENTORY_OBJECT_TREE_IMPL_HH_
#include "dbobjecttree.hh"
#include "dbobject.hh"
#include "dbsession.hh"
#include "dbcontainer.hh"
#include "dbcontainerptr.hh"
#include <vector>
namespace inventory {
namespace datamodel {
template<class Object>
void DBObjectTree<Object>::fetch_object(db::DBSession &session) {
m_object->refresh(session);
}
template<class Object>
void DBObjectTree<Object>::fetch_subtree(db::DBSession &session) {
if (!m_object)
fetch_object(session);
if (!m_subtree)
m_subtree.reset(new SubtreeContainer<Object>);
auto inserter =
[this](DBObjectPtr<Object> el, SubtreeContainer<Object> &c) {
DBObjectTreePtr<Object> subtree(new DBObjectTree<Object>(el,
DBObjectTree<Object>::shared_from_this()));
c.push_back(subtree);
};
(*m_object).template get_children<SubtreeContainer>(session,
inserter, m_subtree);
}
template<class Object>
void DBObjectTree<Object>::recurse_subtrees(db::DBSession &session,
DBObjectTree<Object>::Visitor &visitor, int max_level,
int level) {
if (!m_subtree)
fetch_subtree(session);
visitor.apply(m_object, max_level, level);
if (max_level != -1 && level >= max_level)
return;
if (m_subtree) {
for (DBObjectTreePtr<Object> subtree : *m_subtree) {
subtree->recurse_subtrees(session, visitor, max_level, level + 1);
}
}
}
}
}
#endif