60 lines
1.6 KiB
C++
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
|