Example #1
0
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;
}
Example #2
0
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.");
}
Example #3
0
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.");
}