1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
| DELIMITER |
CREATE PROCEDURE SP_INS_DOMAINS
(
IN lib VARCHAR(32), -- le libellé à insérer
IN description VARCHAR(1024), -- la description à insérer
IN id_parent int, -- Ancêtre ou frère point d'origine de l'insertion
IN mode_insert VARCHAR(2) -- le mode d'insertion :
-- FA : Fils Ainé,
-- FC : Fils Cadet,
-- GF : Grand frère,
-- PF : Petit Frère,
-- P : Père
)
BEGIN
DECLARE ok int;
DECLARE possible int DEFAULT 1 ; -- Si c'est possible =1 sinon =0
DECLARE bgp int ; -- borne gauche parent
DECLARE bdp int ; -- borne droite parent
DECLARE nivp int ; -- niveau parent
DECLARE bgi int ; -- borne gauche à insérer
DECLARE bdi int ; -- borne droite à insérer
DECLARE nivi int ; -- niveau à insérer
-- SET NOCOUNT ON
-- gestion des effets de bord
IF mode_insert IS NULL OR lib IS NULL OR lib = '' THEN
-- On passe possible a 0
SET possible = 0;
-- RAISERROR ('Insertion impossible sans libellé ou mode ! (TABLE domains)', 16, 1)
-- RETURN
END IF;
-- Test du mode_insert
SET mode_insert = UPPER(mode_insert);
IF NOT( mode_insert = 'FA' OR mode_insert = 'FC' OR mode_insert = 'GF' OR mode_insert = 'PF' OR mode_insert = 'P') THEN
-- On passe possible a 0
SET possible = 0;
-- RAISERROR ('Insertion impossible, mode inconnu !', 16, 1)
-- RETURN
END IF;
-- démarrage transaction
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- BEGIN TRANSACTION INSERT_DOMAINS
-- pas de parent => seul cas, table vide ou insertion d'un collatéral
IF id_parent IS NULL AND possible = 1 THEN
SELECT ok = count(*) FROM domains ;
IF ok = 0 OR ok IS NULL THEN
IF mode_insert = 'FA' OR mode_insert = 'FC' THEN
-- RAISERROR ('Insertion impossible dans un arbre pour un fils sans père !', 16, 1)
-- RETURN
-- On passe possible a 0
SET possible = 0;
ELSE
-- première insertion
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, 0, 1, 2 ) ;
-- SELECT @@IDENTITY
END IF;
ELSE
SET possible = 0;
END IF;
-- On a un parent : on récupère ses éléments
SELECT @bgp = dom_gauche, @bdp = dom_droite, @nivp = dom_level
FROM domains
WHERE dom_id = id_parent ;
-- insertion d'un père
IF mode_insert = 'P' AND possible = 1 THEN
-- Décalage de l'ensemble colatéral droit
UPDATE domains
SET dom_droite = dom_droite + 2
WHERE dom_droite > @bdp ;
UPDATE domains
SET dom_gauche = dom_gauche + 2
WHERE dom_gauche > @bdp ;
-- Décalalage ensemble visé vers le bas
UPDATE domains
SET dom_gauche = dom_gauche + 1,
dom_droite = dom_droite + 1,
dom_level = dom_level + 1
WHERE dom_gauche >= @bgp AND dom_droite <= @bdp ;
-- Insertion du nouveau père
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, @nivp, @bgp, @bdp + 2 ) ;
END IF;
-- Insertion d'un grand frère
IF mode_insert = 'GF' AND possible = 1 THEN
-- Limite sup.
UPDATE domains
SET dom_droite = dom_droite + 2
WHERE dom_droite > @bgp ;
-- Limite inf.
UPDATE domains
SET dom_gauche = dom_gauche + 2
WHERE dom_gauche >= @bgp ;
SET @bgi = @bgp ;
SET @bdi = @bgp + 1 ;
SET @nivi = @nivp ;
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, @nivi, @bgi, @bdi ) ;
END IF;
-- Insertion d'un petit frère
IF mode_insert = 'PF' AND possible = 1 THEN
-- Limite sup.
UPDATE domains
SET dom_droite = dom_droite + 2
WHERE dom_droite > @bdp ;
-- Limite inf.
UPDATE domains
SET dom_gauche = dom_gauche + 2
WHERE dom_gauche >= @bdp ;
SET @bgi = @bdp + 1 ;
SET @bdi = @bdp + 2 ;
SET @nivi = @nivp ;
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, @nivi, @bgi, @bdi ) ;
END IF;
-- Insertion d'un fils ainé
IF mode_insert = 'FA' AND possible = 1 THEN
-- Limite sup.
UPDATE domains
SET dom_droite = dom_droite + 2
WHERE dom_droite > @bgp ;
-- Limite inf.
UPDATE domains
SET dom_gauche = dom_gauche + 2
WHERE dom_gauche > @bgp ;
SET @bgi = @bgp + 1 ;
SET @bdi = @bgp + 2 ;
SET @nivi = @nivp + 1 ;
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, @nivi, @bgi, @bdi );
END IF;
-- Insertion d'un fils cadet
IF mode_insert = 'FC' AND possible = 1 THEN
-- Limite sup.
UPDATE domains
SET dom_droite = dom_droite + 2
WHERE dom_droite >= @bdp ;
-- Limite inf.
UPDATE domains
SET dom_gauche = dom_gauche + 2
WHERE dom_gauche > @bdp ;
SET @bgi = @bdp ;
SET @bdi = @bdp + 1 ;
SET @nivi = @nivp + 1 ;
INSERT INTO domains ( dom_name, dom_description, dom_level, dom_gauche, dom_droite )
VALUES( lib, description, @nivi, @bgi, @bdi );
END IF;
END|
DELIMITER ; |