Bon voici ce que j'ai fait pour l'instant en php pour manipuler tout ça (insertion, suppression) :
<?php
class ArbreIntervallaire {
private $_bg = 'borne_gauche';
private $_bd = 'borne_droite';
public static function insert($table,$borne_gauche_parent,Array $data=array()){
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$fields=array($this->_bg,$this->_bd);
$values = array($borne_gauche_parent,$borne_gauche_parent+1);
foreach($data as $k=>$v){
$values[]=$v;
$fields[]=$k;
}
$interros = array_fill(0,count($values),'?');
$db->beginTransaction();
try {
$db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' + 2 WHERE '.$this->_bd.' >= ?',$borne_gauche_parent);
$db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' + 2 WHERE '.$this->_bg.' >= ?',$borne_gauche_parent);
$db->query('INSERT INTO '.$table.' ('.implode('',$fields).') VALUES ('.implode('',$interros).')',$values);
$db->commit();
$return = $db->lastInsertId();
} catch (Exception $e) {
$db->rollBack();
$return = false;
}
return $return;
}
public static function delete($table,$borne_gauche){
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
try {
$db->query('DELETE FROM '.$table.' WHERE '.$this->_bg.' = ?',$borne_gauche);
$db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' - 2 WHERE '.$this->_bg.' >= ?',$borne_gauche);
$db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' - 2 WHERE '.$this->_bd.' >= ?',$borne_gauche);
$db->commit();
$return = true;
} catch (Exception $e) {
$db->rollBack();
$return = false;
}
return $return;
}
public static function deleteChildren($table,$borne_gauche,$borne_droite){
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
try {
$db->query('DELETE FROM '.$table.' WHERE '.$this->_bg.' >= ? AND '.$this->_bd.' <= ?',array($borne_gauche,$borne_droite));
$db->query('UPDATE '.$table.' SET '.$this->_bd.' = '.$this->_bd.' - '.($borne_droite-$borne_gauche+1).' WHERE '.$this->_bd.' >= ?',$borne_gauche);
$db->query('UPDATE '.$table.' SET '.$this->_bg.' = '.$this->_bg.' - '.($borne_droite-$borne_gauche+1).' WHERE '.$this->_bg.' >= ?',$borne_gauche);
$db->commit();
$return = true;
} catch (Exception $e) {
$db->rollBack();
$return = false;
}
return $return;
}
}
Il me manque les déplacement à coder et j'appliquerais ensuite tout ça à mon application pour vérifier que cela fonctionne bien
Merci encore