FANTAzeRus
Guest
NestedSets
Вопрос к тем кто занимался реализацией Subj'а на БД Interbase/Firebird. Если возможно поделитесь опытом создания хронимых процедур, тригеров и т.д. для работы с Subj'евыми деревьями.
-~{}~ 31.10.04 15:37:
Попробовал вроде получилось! Но прошу ЗНАЮЩИХ поправить если где ошибся! Пока нужны только ВСТАВКА и УДАЛЕНИЕ ...
CREATE PROCEDURE GET_NODE_INFO (
C_ID INTEGER)
RETURNS (
CLEFT INTEGER,
CRIGHT INTEGER,
CLEVEL INTEGER)
AS BEGIN
SELECT CLEFT,CRIGHT,CLEVEL FROM CAT WHERE CID=:C_ID
INTO :CLEFT,:CRIGHT,:CLEVEL;
SUSPEND;
END
CREATE PROCEDURE INSERT_NODE (
CID INTEGER,
TITLE VARCHAR (254),
CTYPE CHAR (1))
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
DECLARE VARIABLE new_LE INTEGER;
DECLARE VARIABLE new_RI INTEGER;
DECLARE VARIABLE new_LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
new_LE = RI;
new_RI = RI+1;
new_LL = LL+1;
UPDATE CAT
SET cleft = cleft + 2,
cright = cright + 2
WHERE cleft > :RI;
UPDATE CAT
SET cright = cright + 2
WHERE cright >= :RI AND cleft < :RI;
INSERT INTO CAT (CLEFT,CRIGHT,CLEVEL,TITLE,CTYPE)
VALUES
new_LE,:new_RI,:new_LL,:TITLE,:CTYPE);
END
CREATE PROCEDURE DELETE_NODE (
CID INTEGER)
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
DELETE FROM CAT WHERE CID=:CID;
UPDATE CAT SET cright = cright -
RI - :LE + 1) WHERE cright > :RI AND cleft < :LE;
UPDATE CAT SET cleft = cleft -
RI - :LE + 1), cright = cright -
RI - :LE + 1) WHERE cleft > :RI;
END
Вопрос к тем кто занимался реализацией Subj'а на БД Interbase/Firebird. Если возможно поделитесь опытом создания хронимых процедур, тригеров и т.д. для работы с Subj'евыми деревьями.
-~{}~ 31.10.04 15:37:
Попробовал вроде получилось! Но прошу ЗНАЮЩИХ поправить если где ошибся! Пока нужны только ВСТАВКА и УДАЛЕНИЕ ...
CREATE PROCEDURE GET_NODE_INFO (
C_ID INTEGER)
RETURNS (
CLEFT INTEGER,
CRIGHT INTEGER,
CLEVEL INTEGER)
AS BEGIN
SELECT CLEFT,CRIGHT,CLEVEL FROM CAT WHERE CID=:C_ID
INTO :CLEFT,:CRIGHT,:CLEVEL;
SUSPEND;
END
CREATE PROCEDURE INSERT_NODE (
CID INTEGER,
TITLE VARCHAR (254),
CTYPE CHAR (1))
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
DECLARE VARIABLE new_LE INTEGER;
DECLARE VARIABLE new_RI INTEGER;
DECLARE VARIABLE new_LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
new_LE = RI;
new_RI = RI+1;
new_LL = LL+1;
UPDATE CAT
SET cleft = cleft + 2,
cright = cright + 2
WHERE cleft > :RI;
UPDATE CAT
SET cright = cright + 2
WHERE cright >= :RI AND cleft < :RI;
INSERT INTO CAT (CLEFT,CRIGHT,CLEVEL,TITLE,CTYPE)
VALUES
![Smile :) :)](/talk/styles/default/xenforo/smilies/smile.png)
END
CREATE PROCEDURE DELETE_NODE (
CID INTEGER)
AS
DECLARE VARIABLE LE INTEGER;
DECLARE VARIABLE RI INTEGER;
DECLARE VARIABLE LL INTEGER;
BEGIN
EXECUTE PROCEDURE GET_NODE_INFO :CID
RETURNING_VALUES :LE,:RI,:LL;
DELETE FROM CAT WHERE CID=:CID;
UPDATE CAT SET cright = cright -
![Smile :) :)](/talk/styles/default/xenforo/smilies/smile.png)
UPDATE CAT SET cleft = cleft -
![Smile :) :)](/talk/styles/default/xenforo/smilies/smile.png)
![Smile :) :)](/talk/styles/default/xenforo/smilies/smile.png)
END