triggers.sql
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:26k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. -- ************************************************************
  2. -- * 
  3. -- * Trigger procedures and functions for the patchfield
  4. -- * test of PL/pgSQL
  5. -- * 
  6. -- * $Header: /usr/local/cvsroot/pgsql/src/pl/plpgsql/test/triggers.sql,v 1.1 1998/08/24 19:16:27 momjian Exp $
  7. -- * 
  8. -- ************************************************************
  9. -- ************************************************************
  10. -- * AFTER UPDATE on Room
  11. -- * - If room no changes let wall slots follow
  12. -- ************************************************************
  13. create function tg_room_au() returns opaque as '
  14. begin
  15.     if new.roomno != old.roomno then
  16.         update WSlot set roomno = new.roomno where roomno = old.roomno;
  17.     end if;
  18.     return new;
  19. end;
  20. ' language 'plpgsql';
  21. create trigger tg_room_au after update
  22.     on Room for each row execute procedure tg_room_au();
  23. -- ************************************************************
  24. -- * AFTER DELETE on Room
  25. -- * - delete wall slots in this room
  26. -- ************************************************************
  27. create function tg_room_ad() returns opaque as '
  28. begin
  29.     delete from WSlot where roomno = old.roomno;
  30.     return old;
  31. end;
  32. ' language 'plpgsql';
  33. create trigger tg_room_ad after delete
  34.     on Room for each row execute procedure tg_room_ad();
  35. -- ************************************************************
  36. -- * BEFORE INSERT or UPDATE on WSlot
  37. -- * - Check that room exists
  38. -- ************************************************************
  39. create function tg_wslot_biu() returns opaque as '
  40. begin
  41.     if count(*) = 0 from Room where roomno = new.roomno then
  42.         raise exception ''Room % does not exist'', new.roomno;
  43.     end if;
  44.     return new;
  45. end;
  46. ' language 'plpgsql';
  47. create trigger tg_wslot_biu before insert or update
  48.     on WSlot for each row execute procedure tg_wslot_biu();
  49. -- ************************************************************
  50. -- * AFTER UPDATE on PField
  51. -- * - Let PSlots of this field follow
  52. -- ************************************************************
  53. create function tg_pfield_au() returns opaque as '
  54. begin
  55.     if new.name != old.name then
  56.         update PSlot set pfname = new.name where pfname = old.name;
  57.     end if;
  58.     return new;
  59. end;
  60. ' language 'plpgsql';
  61. create trigger tg_pfield_au after update
  62.     on PField for each row execute procedure tg_pfield_au();
  63. -- ************************************************************
  64. -- * AFTER DELETE on PField
  65. -- * - Remove all slots of this patchfield
  66. -- ************************************************************
  67. create function tg_pfield_ad() returns opaque as '
  68. begin
  69.     delete from PSlot where pfname = old.name;
  70.     return old;
  71. end;
  72. ' language 'plpgsql';
  73. create trigger tg_pfield_ad after delete
  74.     on PField for each row execute procedure tg_pfield_ad();
  75. -- ************************************************************
  76. -- * BEFORE INSERT or UPDATE on PSlot
  77. -- * - Ensure that our patchfield does exist
  78. -- ************************************************************
  79. create function tg_pslot_biu() returns opaque as '
  80. declare
  81.     pfrec record;
  82.     rename new to ps;
  83. begin
  84.     select into pfrec * from PField where name = ps.pfname;
  85.     if not found then
  86.         raise exception ''Patchfield "%" does not exist'', ps.pfname;
  87.     end if;
  88.     return ps;
  89. end;
  90. ' language 'plpgsql';
  91. create trigger tg_pslot_biu before insert or update
  92.     on PSlot for each row execute procedure tg_pslot_biu();
  93. -- ************************************************************
  94. -- * AFTER UPDATE on System
  95. -- * - If system name changes let interfaces follow
  96. -- ************************************************************
  97. create function tg_system_au() returns opaque as '
  98. begin
  99.     if new.name != old.name then
  100.         update IFace set sysname = new.name where sysname = old.name;
  101.     end if;
  102.     return new;
  103. end;
  104. ' language 'plpgsql';
  105. create trigger tg_system_au after update
  106.     on System for each row execute procedure tg_system_au();
  107. -- ************************************************************
  108. -- * BEFORE INSERT or UPDATE on IFace
  109. -- * - set the slotname to IF.sysname.ifname
  110. -- ************************************************************
  111. create function tg_iface_biu() returns opaque as '
  112. declare
  113.     sname text;
  114.     sysrec record;
  115. begin
  116.     select into sysrec * from system where name = new.sysname;
  117.     if not found then
  118.         raise exception ''system "%" does not exist'', new.sysname;
  119.     end if;
  120.     sname := ''IF.'' || new.sysname;
  121.     sname := sname || ''.'';
  122.     sname := sname || new.ifname;
  123.     if length(sname) > 20 then
  124.         raise exception ''IFace slotname "%" too long (20 char max)'', sname;
  125.     end if;
  126.     new.slotname := sname;
  127.     return new;
  128. end;
  129. ' language 'plpgsql';
  130. create trigger tg_iface_biu before insert or update
  131.     on IFace for each row execute procedure tg_iface_biu();
  132. -- ************************************************************
  133. -- * AFTER INSERT or UPDATE or DELETE on Hub
  134. -- * - insert/delete/rename slots as required
  135. -- ************************************************************
  136. create function tg_hub_a() returns opaque as '
  137. declare
  138.     hname text;
  139.     dummy integer;
  140. begin
  141.     if tg_op = ''INSERT'' then
  142. dummy := tg_hub_adjustslots(new.name, 0, new.nslots);
  143. return new;
  144.     end if;
  145.     if tg_op = ''UPDATE'' then
  146. if new.name != old.name then
  147.     update HSlot set hubname = new.name where hubname = old.name;
  148. end if;
  149. dummy := tg_hub_adjustslots(new.name, old.nslots, new.nslots);
  150. return new;
  151.     end if;
  152.     if tg_op = ''DELETE'' then
  153. dummy := tg_hub_adjustslots(old.name, old.nslots, 0);
  154. return old;
  155.     end if;
  156. end;
  157. ' language 'plpgsql';
  158. create trigger tg_hub_a after insert or update or delete
  159.     on Hub for each row execute procedure tg_hub_a();
  160. -- ************************************************************
  161. -- * Support function to add/remove slots of Hub
  162. -- ************************************************************
  163. create function tg_hub_adjustslots(bpchar, integer, integer)
  164. returns integer as '
  165. declare
  166.     hname alias for $1;
  167.     oldnslots alias for $2;
  168.     newnslots alias for $3;
  169. begin
  170.     if newnslots = oldnslots then
  171.         return 0;
  172.     end if;
  173.     if newnslots < oldnslots then
  174.         delete from HSlot where hubname = hname and slotno > newnslots;
  175. return 0;
  176.     end if;
  177.     for i in oldnslots + 1 .. newnslots loop
  178.         insert into HSlot (slotname, hubname, slotno, slotlink)
  179. values (''HS.dummy'', hname, i, '''');
  180.     end loop;
  181.     return 0;
  182. end;
  183. ' language 'plpgsql';
  184. -- ************************************************************
  185. -- * BEFORE INSERT or UPDATE on HSlot
  186. -- * - prevent from manual manipulation
  187. -- * - set the slotname to HS.hubname.slotno
  188. -- ************************************************************
  189. create function tg_hslot_biu() returns opaque as '
  190. declare
  191.     sname text;
  192.     xname HSlot.slotname%TYPE;
  193.     hubrec record;
  194. begin
  195.     select into hubrec * from Hub where name = new.hubname;
  196.     if not found then
  197.         raise exception ''no manual manipulation of HSlot'';
  198.     end if;
  199.     if new.slotno < 1 or new.slotno > hubrec.nslots then
  200.         raise exception ''no manual manipulation of HSlot'';
  201.     end if;
  202.     if tg_op = ''UPDATE'' then
  203. if new.hubname != old.hubname then
  204.     if count(*) > 0 from Hub where name = old.hubname then
  205. raise exception ''no manual manipulation of HSlot'';
  206.     end if;
  207. end if;
  208.     end if;
  209.     sname := ''HS.'' || trim(new.hubname);
  210.     sname := sname || ''.'';
  211.     sname := sname || new.slotno::text;
  212.     if length(sname) > 20 then
  213.         raise exception ''HSlot slotname "%" too long (20 char max)'', sname;
  214.     end if;
  215.     new.slotname := sname;
  216.     return new;
  217. end;
  218. ' language 'plpgsql';
  219. create trigger tg_hslot_biu before insert or update
  220.     on HSlot for each row execute procedure tg_hslot_biu();
  221. -- ************************************************************
  222. -- * BEFORE DELETE on HSlot
  223. -- * - prevent from manual manipulation
  224. -- ************************************************************
  225. create function tg_hslot_bd() returns opaque as '
  226. declare
  227.     hubrec record;
  228. begin
  229.     select into hubrec * from Hub where name = old.hubname;
  230.     if not found then
  231.         return old;
  232.     end if;
  233.     if old.slotno > hubrec.nslots then
  234.         return old;
  235.     end if;
  236.     raise exception ''no manual manipulation of HSlot'';
  237. end;
  238. ' language 'plpgsql';
  239. create trigger tg_hslot_bd before delete
  240.     on HSlot for each row execute procedure tg_hslot_bd();
  241. -- ************************************************************
  242. -- * BEFORE INSERT on all slots
  243. -- * - Check name prefix
  244. -- ************************************************************
  245. create function tg_chkslotname() returns opaque as '
  246. begin
  247.     if substr(new.slotname, 1, 2) != tg_argv[0] then
  248.         raise exception ''slotname must begin with %'', tg_argv[0];
  249.     end if;
  250.     return new;
  251. end;
  252. ' language 'plpgsql';
  253. create trigger tg_chkslotname before insert
  254.     on PSlot for each row execute procedure tg_chkslotname('PS');
  255. create trigger tg_chkslotname before insert
  256.     on WSlot for each row execute procedure tg_chkslotname('WS');
  257. create trigger tg_chkslotname before insert
  258.     on PLine for each row execute procedure tg_chkslotname('PL');
  259. create trigger tg_chkslotname before insert
  260.     on IFace for each row execute procedure tg_chkslotname('IF');
  261. create trigger tg_chkslotname before insert
  262.     on PHone for each row execute procedure tg_chkslotname('PH');
  263. -- ************************************************************
  264. -- * BEFORE INSERT or UPDATE on all slots with slotlink
  265. -- * - Set slotlink to empty string if NULL value given
  266. -- ************************************************************
  267. create function tg_chkslotlink() returns opaque as '
  268. begin
  269.     if new.slotlink isnull then
  270.         new.slotlink := '''';
  271.     end if;
  272.     return new;
  273. end;
  274. ' language 'plpgsql';
  275. create trigger tg_chkslotlink before insert or update
  276.     on PSlot for each row execute procedure tg_chkslotlink();
  277. create trigger tg_chkslotlink before insert or update
  278.     on WSlot for each row execute procedure tg_chkslotlink();
  279. create trigger tg_chkslotlink before insert or update
  280.     on IFace for each row execute procedure tg_chkslotlink();
  281. create trigger tg_chkslotlink before insert or update
  282.     on HSlot for each row execute procedure tg_chkslotlink();
  283. create trigger tg_chkslotlink before insert or update
  284.     on PHone for each row execute procedure tg_chkslotlink();
  285. -- ************************************************************
  286. -- * BEFORE INSERT or UPDATE on all slots with backlink
  287. -- * - Set backlink to empty string if NULL value given
  288. -- ************************************************************
  289. create function tg_chkbacklink() returns opaque as '
  290. begin
  291.     if new.backlink isnull then
  292.         new.backlink := '''';
  293.     end if;
  294.     return new;
  295. end;
  296. ' language 'plpgsql';
  297. create trigger tg_chkbacklink before insert or update
  298.     on PSlot for each row execute procedure tg_chkbacklink();
  299. create trigger tg_chkbacklink before insert or update
  300.     on WSlot for each row execute procedure tg_chkbacklink();
  301. create trigger tg_chkbacklink before insert or update
  302.     on PLine for each row execute procedure tg_chkbacklink();
  303. -- ************************************************************
  304. -- * BEFORE UPDATE on PSlot
  305. -- * - do delete/insert instead of update if name changes
  306. -- ************************************************************
  307. create function tg_pslot_bu() returns opaque as '
  308. begin
  309.     if new.slotname != old.slotname then
  310.         delete from PSlot where slotname = old.slotname;
  311. insert into PSlot (
  312.     slotname,
  313.     pfname,
  314.     slotlink,
  315.     backlink
  316. ) values (
  317.     new.slotname,
  318.     new.pfname,
  319.     new.slotlink,
  320.     new.backlink
  321. );
  322.         return null;
  323.     end if;
  324.     return new;
  325. end;
  326. ' language 'plpgsql';
  327. create trigger tg_pslot_bu before update
  328.     on PSlot for each row execute procedure tg_pslot_bu();
  329. -- ************************************************************
  330. -- * BEFORE UPDATE on WSlot
  331. -- * - do delete/insert instead of update if name changes
  332. -- ************************************************************
  333. create function tg_wslot_bu() returns opaque as '
  334. begin
  335.     if new.slotname != old.slotname then
  336.         delete from WSlot where slotname = old.slotname;
  337. insert into WSlot (
  338.     slotname,
  339.     roomno,
  340.     slotlink,
  341.     backlink
  342. ) values (
  343.     new.slotname,
  344.     new.roomno,
  345.     new.slotlink,
  346.     new.backlink
  347. );
  348.         return null;
  349.     end if;
  350.     return new;
  351. end;
  352. ' language 'plpgsql';
  353. create trigger tg_wslot_bu before update
  354.     on WSlot for each row execute procedure tg_Wslot_bu();
  355. -- ************************************************************
  356. -- * BEFORE UPDATE on PLine
  357. -- * - do delete/insert instead of update if name changes
  358. -- ************************************************************
  359. create function tg_pline_bu() returns opaque as '
  360. begin
  361.     if new.slotname != old.slotname then
  362.         delete from PLine where slotname = old.slotname;
  363. insert into PLine (
  364.     slotname,
  365.     phonenumber,
  366.     comment,
  367.     backlink
  368. ) values (
  369.     new.slotname,
  370.     new.phonenumber,
  371.     new.comment,
  372.     new.backlink
  373. );
  374.         return null;
  375.     end if;
  376.     return new;
  377. end;
  378. ' language 'plpgsql';
  379. create trigger tg_pline_bu before update
  380.     on PLine for each row execute procedure tg_pline_bu();
  381. -- ************************************************************
  382. -- * BEFORE UPDATE on IFace
  383. -- * - do delete/insert instead of update if name changes
  384. -- ************************************************************
  385. create function tg_iface_bu() returns opaque as '
  386. begin
  387.     if new.slotname != old.slotname then
  388.         delete from IFace where slotname = old.slotname;
  389. insert into IFace (
  390.     slotname,
  391.     sysname,
  392.     ifname,
  393.     slotlink
  394. ) values (
  395.     new.slotname,
  396.     new.sysname,
  397.     new.ifname,
  398.     new.slotlink
  399. );
  400.         return null;
  401.     end if;
  402.     return new;
  403. end;
  404. ' language 'plpgsql';
  405. create trigger tg_iface_bu before update
  406.     on IFace for each row execute procedure tg_iface_bu();
  407. -- ************************************************************
  408. -- * BEFORE UPDATE on HSlot
  409. -- * - do delete/insert instead of update if name changes
  410. -- ************************************************************
  411. create function tg_hslot_bu() returns opaque as '
  412. begin
  413.     if new.slotname != old.slotname or new.hubname != old.hubname then
  414.         delete from HSlot where slotname = old.slotname;
  415. insert into HSlot (
  416.     slotname,
  417.     hubname,
  418.     slotno,
  419.     slotlink
  420. ) values (
  421.     new.slotname,
  422.     new.hubname,
  423.     new.slotno,
  424.     new.slotlink
  425. );
  426.         return null;
  427.     end if;
  428.     return new;
  429. end;
  430. ' language 'plpgsql';
  431. create trigger tg_hslot_bu before update
  432.     on HSlot for each row execute procedure tg_hslot_bu();
  433. -- ************************************************************
  434. -- * BEFORE UPDATE on PHone
  435. -- * - do delete/insert instead of update if name changes
  436. -- ************************************************************
  437. create function tg_phone_bu() returns opaque as '
  438. begin
  439.     if new.slotname != old.slotname then
  440.         delete from PHone where slotname = old.slotname;
  441. insert into PHone (
  442.     slotname,
  443.     comment,
  444.     slotlink
  445. ) values (
  446.     new.slotname,
  447.     new.comment,
  448.     new.slotlink
  449. );
  450.         return null;
  451.     end if;
  452.     return new;
  453. end;
  454. ' language 'plpgsql';
  455. create trigger tg_phone_bu before update
  456.     on PHone for each row execute procedure tg_phone_bu();
  457. -- ************************************************************
  458. -- * AFTER INSERT or UPDATE or DELETE on slot with backlink
  459. -- * - Ensure that the opponent correctly points back to us
  460. -- ************************************************************
  461. create function tg_backlink_a() returns opaque as '
  462. declare
  463.     dummy integer;
  464. begin
  465.     if tg_op = ''INSERT'' then
  466.         if new.backlink != '''' then
  467.     dummy := tg_backlink_set(new.backlink, new.slotname);
  468. end if;
  469. return new;
  470.     end if;
  471.     if tg_op = ''UPDATE'' then
  472.         if new.backlink != old.backlink then
  473.     if old.backlink != '''' then
  474.         dummy := tg_backlink_unset(old.backlink, old.slotname);
  475.     end if;
  476.     if new.backlink != '''' then
  477.         dummy := tg_backlink_set(new.backlink, new.slotname);
  478.     end if;
  479. else
  480.     if new.slotname != old.slotname and new.backlink != '''' then
  481.         dummy := tg_slotlink_set(new.backlink, new.slotname);
  482.     end if;
  483. end if;
  484. return new;
  485.     end if;
  486.     if tg_op = ''DELETE'' then
  487.         if old.backlink != '''' then
  488.     dummy := tg_backlink_unset(old.backlink, old.slotname);
  489. end if;
  490. return old;
  491.     end if;
  492. end;
  493. ' language 'plpgsql';
  494. create trigger tg_backlink_a after insert or update or delete
  495.     on PSlot for each row execute procedure tg_backlink_a('PS');
  496. create trigger tg_backlink_a after insert or update or delete
  497.     on WSlot for each row execute procedure tg_backlink_a('WS');
  498. create trigger tg_backlink_a after insert or update or delete
  499.     on PLine for each row execute procedure tg_backlink_a('PL');
  500. -- ************************************************************
  501. -- * Support function to set the opponents backlink field
  502. -- * if it does not already point to the requested slot
  503. -- ************************************************************
  504. create function tg_backlink_set(bpchar, bpchar)
  505. returns integer as '
  506. declare
  507.     myname alias for $1;
  508.     blname alias for $2;
  509.     mytype char(2);
  510.     link char(4);
  511.     rec record;
  512. begin
  513.     mytype := substr(myname, 1, 2);
  514.     link := mytype || substr(blname, 1, 2);
  515.     if link = ''PLPL'' then
  516.         raise exception 
  517. ''backlink between two phone lines does not make sense'';
  518.     end if;
  519.     if link in (''PLWS'', ''WSPL'') then
  520.         raise exception 
  521. ''direct link of phone line to wall slot not permitted'';
  522.     end if;
  523.     if mytype = ''PS'' then
  524.         select into rec * from PSlot where slotname = myname;
  525. if not found then
  526.     raise exception ''% does not exists'', myname;
  527. end if;
  528. if rec.backlink != blname then
  529.     update PSlot set backlink = blname where slotname = myname;
  530. end if;
  531. return 0;
  532.     end if;
  533.     if mytype = ''WS'' then
  534.         select into rec * from WSlot where slotname = myname;
  535. if not found then
  536.     raise exception ''% does not exists'', myname;
  537. end if;
  538. if rec.backlink != blname then
  539.     update WSlot set backlink = blname where slotname = myname;
  540. end if;
  541. return 0;
  542.     end if;
  543.     if mytype = ''PL'' then
  544.         select into rec * from PLine where slotname = myname;
  545. if not found then
  546.     raise exception ''% does not exists'', myname;
  547. end if;
  548. if rec.backlink != blname then
  549.     update PLine set backlink = blname where slotname = myname;
  550. end if;
  551. return 0;
  552.     end if;
  553.     raise exception ''illegal backlink beginning with %'', mytype;
  554. end;
  555. ' language 'plpgsql';
  556. -- ************************************************************
  557. -- * Support function to clear out the backlink field if
  558. -- * it still points to specific slot
  559. -- ************************************************************
  560. create function tg_backlink_unset(bpchar, bpchar)
  561. returns integer as '
  562. declare
  563.     myname alias for $1;
  564.     blname alias for $2;
  565.     mytype char(2);
  566.     rec record;
  567. begin
  568.     mytype := substr(myname, 1, 2);
  569.     if mytype = ''PS'' then
  570.         select into rec * from PSlot where slotname = myname;
  571. if not found then
  572.     return 0;
  573. end if;
  574. if rec.backlink = blname then
  575.     update PSlot set backlink = '''' where slotname = myname;
  576. end if;
  577. return 0;
  578.     end if;
  579.     if mytype = ''WS'' then
  580.         select into rec * from WSlot where slotname = myname;
  581. if not found then
  582.     return 0;
  583. end if;
  584. if rec.backlink = blname then
  585.     update WSlot set backlink = '''' where slotname = myname;
  586. end if;
  587. return 0;
  588.     end if;
  589.     if mytype = ''PL'' then
  590.         select into rec * from PLine where slotname = myname;
  591. if not found then
  592.     return 0;
  593. end if;
  594. if rec.backlink = blname then
  595.     update PLine set backlink = '''' where slotname = myname;
  596. end if;
  597. return 0;
  598.     end if;
  599. end;
  600. ' language 'plpgsql';
  601. -- ************************************************************
  602. -- * AFTER INSERT or UPDATE or DELETE on slot with slotlink
  603. -- * - Ensure that the opponent correctly points back to us
  604. -- ************************************************************
  605. create function tg_slotlink_a() returns opaque as '
  606. declare
  607.     dummy integer;
  608. begin
  609.     if tg_op = ''INSERT'' then
  610.         if new.slotlink != '''' then
  611.     dummy := tg_slotlink_set(new.slotlink, new.slotname);
  612. end if;
  613. return new;
  614.     end if;
  615.     if tg_op = ''UPDATE'' then
  616.         if new.slotlink != old.slotlink then
  617.     if old.slotlink != '''' then
  618.         dummy := tg_slotlink_unset(old.slotlink, old.slotname);
  619.     end if;
  620.     if new.slotlink != '''' then
  621.         dummy := tg_slotlink_set(new.slotlink, new.slotname);
  622.     end if;
  623. else
  624.     if new.slotname != old.slotname and new.slotlink != '''' then
  625.         dummy := tg_slotlink_set(new.slotlink, new.slotname);
  626.     end if;
  627. end if;
  628. return new;
  629.     end if;
  630.     if tg_op = ''DELETE'' then
  631.         if old.slotlink != '''' then
  632.     dummy := tg_slotlink_unset(old.slotlink, old.slotname);
  633. end if;
  634. return old;
  635.     end if;
  636. end;
  637. ' language 'plpgsql';
  638. create trigger tg_slotlink_a after insert or update or delete
  639.     on PSlot for each row execute procedure tg_slotlink_a('PS');
  640. create trigger tg_slotlink_a after insert or update or delete
  641.     on WSlot for each row execute procedure tg_slotlink_a('WS');
  642. create trigger tg_slotlink_a after insert or update or delete
  643.     on IFace for each row execute procedure tg_slotlink_a('IF');
  644. create trigger tg_slotlink_a after insert or update or delete
  645.     on HSlot for each row execute procedure tg_slotlink_a('HS');
  646. create trigger tg_slotlink_a after insert or update or delete
  647.     on PHone for each row execute procedure tg_slotlink_a('PH');
  648. -- ************************************************************
  649. -- * Support function to set the opponents slotlink field
  650. -- * if it does not already point to the requested slot
  651. -- ************************************************************
  652. create function tg_slotlink_set(bpchar, bpchar)
  653. returns integer as '
  654. declare
  655.     myname alias for $1;
  656.     blname alias for $2;
  657.     mytype char(2);
  658.     link char(4);
  659.     rec record;
  660. begin
  661.     mytype := substr(myname, 1, 2);
  662.     link := mytype || substr(blname, 1, 2);
  663.     if link = ''PHPH'' then
  664.         raise exception 
  665. ''slotlink between two phones does not make sense'';
  666.     end if;
  667.     if link in (''PHHS'', ''HSPH'') then
  668.         raise exception 
  669. ''link of phone to hub does not make sense'';
  670.     end if;
  671.     if link in (''PHIF'', ''IFPH'') then
  672.         raise exception 
  673. ''link of phone to hub does not make sense'';
  674.     end if;
  675.     if link in (''PSWS'', ''WSPS'') then
  676.         raise exception 
  677. ''slotlink from patchslot to wallslot not permitted'';
  678.     end if;
  679.     if mytype = ''PS'' then
  680.         select into rec * from PSlot where slotname = myname;
  681. if not found then
  682.     raise exception ''% does not exists'', myname;
  683. end if;
  684. if rec.slotlink != blname then
  685.     update PSlot set slotlink = blname where slotname = myname;
  686. end if;
  687. return 0;
  688.     end if;
  689.     if mytype = ''WS'' then
  690.         select into rec * from WSlot where slotname = myname;
  691. if not found then
  692.     raise exception ''% does not exists'', myname;
  693. end if;
  694. if rec.slotlink != blname then
  695.     update WSlot set slotlink = blname where slotname = myname;
  696. end if;
  697. return 0;
  698.     end if;
  699.     if mytype = ''IF'' then
  700.         select into rec * from IFace where slotname = myname;
  701. if not found then
  702.     raise exception ''% does not exists'', myname;
  703. end if;
  704. if rec.slotlink != blname then
  705.     update IFace set slotlink = blname where slotname = myname;
  706. end if;
  707. return 0;
  708.     end if;
  709.     if mytype = ''HS'' then
  710.         select into rec * from HSlot where slotname = myname;
  711. if not found then
  712.     raise exception ''% does not exists'', myname;
  713. end if;
  714. if rec.slotlink != blname then
  715.     update HSlot set slotlink = blname where slotname = myname;
  716. end if;
  717. return 0;
  718.     end if;
  719.     if mytype = ''PH'' then
  720.         select into rec * from PHone where slotname = myname;
  721. if not found then
  722.     raise exception ''% does not exists'', myname;
  723. end if;
  724. if rec.slotlink != blname then
  725.     update PHone set slotlink = blname where slotname = myname;
  726. end if;
  727. return 0;
  728.     end if;
  729.     raise exception ''illegal slotlink beginning with %'', mytype;
  730. end;
  731. ' language 'plpgsql';
  732. -- ************************************************************
  733. -- * Support function to clear out the slotlink field if
  734. -- * it still points to specific slot
  735. -- ************************************************************
  736. create function tg_slotlink_unset(bpchar, bpchar)
  737. returns integer as '
  738. declare
  739.     myname alias for $1;
  740.     blname alias for $2;
  741.     mytype char(2);
  742.     rec record;
  743. begin
  744.     mytype := substr(myname, 1, 2);
  745.     if mytype = ''PS'' then
  746.         select into rec * from PSlot where slotname = myname;
  747. if not found then
  748.     return 0;
  749. end if;
  750. if rec.slotlink = blname then
  751.     update PSlot set slotlink = '''' where slotname = myname;
  752. end if;
  753. return 0;
  754.     end if;
  755.     if mytype = ''WS'' then
  756.         select into rec * from WSlot where slotname = myname;
  757. if not found then
  758.     return 0;
  759. end if;
  760. if rec.slotlink = blname then
  761.     update WSlot set slotlink = '''' where slotname = myname;
  762. end if;
  763. return 0;
  764.     end if;
  765.     if mytype = ''IF'' then
  766.         select into rec * from IFace where slotname = myname;
  767. if not found then
  768.     return 0;
  769. end if;
  770. if rec.slotlink = blname then
  771.     update IFace set slotlink = '''' where slotname = myname;
  772. end if;
  773. return 0;
  774.     end if;
  775.     if mytype = ''HS'' then
  776.         select into rec * from HSlot where slotname = myname;
  777. if not found then
  778.     return 0;
  779. end if;
  780. if rec.slotlink = blname then
  781.     update HSlot set slotlink = '''' where slotname = myname;
  782. end if;
  783. return 0;
  784.     end if;
  785.     if mytype = ''PH'' then
  786.         select into rec * from PHone where slotname = myname;
  787. if not found then
  788.     return 0;
  789. end if;
  790. if rec.slotlink = blname then
  791.     update PHone set slotlink = '''' where slotname = myname;
  792. end if;
  793. return 0;
  794.     end if;
  795. end;
  796. ' language 'plpgsql';