bool ManagerArbre::del(const Arbre & node) { if(!node.feuille() || !ManagerSqlArbre::del(node.id())) return false; if(node.parent()) { if(exists(Arbre::Parent,node.parent())) { ListPtr<Arbre> nodes(getList(Arbre::Num,node.num(),Arbre::Parent,node.parent(),Arbre::Num,bdd::Condition::Sup)); for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i) { (*i).setNum((*i).num() - 1); ManagerSqlArbre::modify(*i); } } else { Arbre parent(node.parent()); get(parent); parent.setFeuille(true); ManagerSqlArbre::modify(parent); } } return true; }
void ManagerArbre::add(Arbre &node) { if(node.feuille()) { if(node.parent()) { Arbre parent(node.parent()); get(parent); if(parent.feuille()) { if(node.num()) throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul."); else ManagerSqlArbre::add(node); parent.setFeuille(false); ManagerSqlArbre::modify(parent); } else { int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent()); if(node.num() < 0 || node.num() > max) { node.setNum(max+1); ManagerSqlArbre::add(node); } else { ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(), Arbre::Num,node.num(), Arbre::Num, bdd::Condition::Egal,bdd::Condition::SupEgal, false)); for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i) { (*i).setNum((*i).num() + 1); ManagerSqlArbre::modify(*i); } ManagerSqlArbre::add(node); } } } else { if(node.num()) throw std::invalid_argument("Une racine doit avoir un numéro nul."); else ManagerSqlArbre::add(node); } } else throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille."); }
void ManagerArbre::addUnstable(Arbre &node) { if(node.feuille()) { if(node.parent()) { Arbre parent(node.parent()); get(parent); if(parent.feuille()) { if(node.num()) throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul."); else ManagerSqlArbre::add(node); parent.setFeuille(false); ManagerSqlArbre::modify(parent); } else { int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent()); if(node.num() < 0 || node.num() > max) { node.setNum(max+1); ManagerSqlArbre::add(node); } else { deplace(node); ManagerSqlArbre::add(node); } } } else { if(node.num()) throw std::invalid_argument("Une racine doit avoir un numéro nul."); else ManagerSqlArbre::add(node); } } else throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille."); }