/** delete node */ public function delNode($node, $cascade = false) { global $ari; $ari->internalChrono('delNode_start'); if (!is_a($node, 'OOB_tree_node')) { if ($this->multiple) { return false; } else { if ($node = OOB_tree::getNode(false, $node, $this)) { } else { return false; } } } //var_dump ($node); //exit; // $id = $ari->db->qMagic($node->id()); // $node['id']; $left = $ari->db->qMagic($node->left()); // $node['left']; $right = $ari->db->qMagic($node->right()); // $node['right']; $tree = $ari->db->qMagic($node->treeid()); //$node['treeid']; // $move_cascade = $ari->db->qMagic($node->right() - $node->left() + 1); //$node['right'] - $node['left'] +1 ; $delta = $node->left() - $node->right() - 1; $ari->db->StartTrans(); if ($cascade) { // @todo: verify, no estoy seguro que esto funcione del todo bien! //borro en cascada los hijos $sql_cascade = "DELETE FROM OOB_Tree_Node\n \t\t\t \t \t\tWHERE TreeID = {$tree}\n\t\t\t\t\t\t AND `OOB_Tree_Node.Left` >= {$left} AND `OOB_Tree_Node.Right` <= {$right}"; $ari->db->Execute($sql_cascade); $this->addDelta($node->right() + 1, $delta); //actualizo la cantidad de nodos $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t SET `Nodes` = (SELECT COUNT(True) \n\t\t\t\t \t\t\t\t FROM OOB_Tree_Node\n \t\t \t \t \t\t\t\t WHERE TreeID = {$tree}) \n\t\t\t\t\t "; $ari->db->Execute($sql_update); } else { $sql = "DELETE FROM OOB_Tree_Node\n \t\t\t\t\t WHERE ID = {$id} "; $ari->db->Execute($sql); //actualizo los hijos del borrado $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Left` = `Left` - 1, `Right` = `Right` - 1\n \t\t \t \t WHERE TreeID = {$tree} \n\t\t\t\t\t AND `Left` BETWEEN {$left} AND {$right} "; $ari->db->Execute($sql_update); //actualizo el padre del borrado el cual tiene izquiera menor y derecha mayor $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Right` = `Right` - 2\n \t\t \t \t WHERE TreeID = {$tree}\n\t\t\t\t\t AND `Right` > {$right} \n\t\t\t\t\t AND `Left` < {$left} "; $ari->db->Execute($sql_update); //actualizo los nodos q no estan en la rama del borrado $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t SET `Left` = `Left` - 2, `Right` = `Right` - 2\n \t\t \t \t WHERE TreeID = {$tree} \n\t\t\t\t\t AND `Left` > {$right} "; $ari->db->Execute($sql_update); //actualizo la cantidad de nodos $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t SET `Nodes` = `Nodes` - 1\n \t\t \t \t WHERE ID = {$tree}\n\t\t\t\t\t "; $ari->db->Execute($sql_update); } if (!$ari->db->CompleteTrans()) { throw new OOB_exception("Error en DB: {$ari->db->ErrorMsg()}", "010", "Error en la Base de Datos", false); //return false; } else { $this->fill(); return true; } $ari->internalChrono('delNode_end'); }