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

数据库系统

开发平台:

Unix_Linux

  1. -- ************************************************************
  2. -- * 
  3. -- * Tables for the patchfield test of PL/pgSQL
  4. -- * 
  5. -- * $Header: /usr/local/cvsroot/pgsql/src/test/regress/sql/plpgsql.sql,v 1.1 1998/10/01 03:38:45 scrappy Exp $
  6. -- * 
  7. -- ************************************************************
  8. create table Room (
  9.     roomno char(8),
  10.     comment text
  11. );
  12. create unique index Room_rno on Room using btree (roomno bpchar_ops);
  13. create table WSlot (
  14.     slotname char(20),
  15.     roomno char(8),
  16.     slotlink char(20),
  17.     backlink char(20)
  18. );
  19. create unique index WSlot_name on WSlot using btree (slotname bpchar_ops);
  20. create table PField (
  21.     name text,
  22.     comment text
  23. );
  24. create unique index PField_name on PField using btree (name text_ops);
  25. create table PSlot (
  26.     slotname char(20),
  27.     pfname text,
  28.     slotlink char(20),
  29.     backlink char(20)
  30. );
  31. create unique index PSlot_name on PSlot using btree (slotname bpchar_ops);
  32. create table PLine (
  33.     slotname char(20),
  34.     phonenumber char(20),
  35.     comment text,
  36.     backlink char(20)
  37. );
  38. create unique index PLine_name on PLine using btree (slotname bpchar_ops);
  39. create table Hub (
  40.     name char(14),
  41.     comment text,
  42.     nslots integer
  43. );
  44. create unique index Hub_name on Hub using btree (name bpchar_ops);
  45. create table HSlot (
  46.     slotname char(20),
  47.     hubname char(14),
  48.     slotno integer,
  49.     slotlink char(20)
  50. );
  51. create unique index HSlot_name on HSlot using btree (slotname bpchar_ops);
  52. create index HSlot_hubname on HSlot using btree (hubname bpchar_ops);
  53. create table System (
  54.     name text,
  55.     comment text
  56. );
  57. create unique index System_name on System using btree (name text_ops);
  58. create table IFace (
  59.     slotname char(20),
  60.     sysname text,
  61.     ifname text,
  62.     slotlink char(20)
  63. );
  64. create unique index IFace_name on IFace using btree (slotname bpchar_ops);
  65. create table PHone (
  66.     slotname char(20),
  67.     comment text,
  68.     slotlink char(20)
  69. );
  70. create unique index PHone_name on PHone using btree (slotname bpchar_ops);
  71. -- ************************************************************
  72. -- * 
  73. -- * Trigger procedures and functions for the patchfield
  74. -- * test of PL/pgSQL
  75. -- * 
  76. -- * $Header: /usr/local/cvsroot/pgsql/src/test/regress/sql/plpgsql.sql,v 1.1 1998/10/01 03:38:45 scrappy Exp $
  77. -- * 
  78. -- ************************************************************
  79. -- ************************************************************
  80. -- * AFTER UPDATE on Room
  81. -- * - If room no changes let wall slots follow
  82. -- ************************************************************
  83. create function tg_room_au() returns opaque as '
  84. begin
  85.     if new.roomno != old.roomno then
  86.         update WSlot set roomno = new.roomno where roomno = old.roomno;
  87.     end if;
  88.     return new;
  89. end;
  90. ' language 'plpgsql';
  91. create trigger tg_room_au after update
  92.     on Room for each row execute procedure tg_room_au();
  93. -- ************************************************************
  94. -- * AFTER DELETE on Room
  95. -- * - delete wall slots in this room
  96. -- ************************************************************
  97. create function tg_room_ad() returns opaque as '
  98. begin
  99.     delete from WSlot where roomno = old.roomno;
  100.     return old;
  101. end;
  102. ' language 'plpgsql';
  103. create trigger tg_room_ad after delete
  104.     on Room for each row execute procedure tg_room_ad();
  105. -- ************************************************************
  106. -- * BEFORE INSERT or UPDATE on WSlot
  107. -- * - Check that room exists
  108. -- ************************************************************
  109. create function tg_wslot_biu() returns opaque as '
  110. begin
  111.     if count(*) = 0 from Room where roomno = new.roomno then
  112.         raise exception ''Room % does not exist'', new.roomno;
  113.     end if;
  114.     return new;
  115. end;
  116. ' language 'plpgsql';
  117. create trigger tg_wslot_biu before insert or update
  118.     on WSlot for each row execute procedure tg_wslot_biu();
  119. -- ************************************************************
  120. -- * AFTER UPDATE on PField
  121. -- * - Let PSlots of this field follow
  122. -- ************************************************************
  123. create function tg_pfield_au() returns opaque as '
  124. begin
  125.     if new.name != old.name then
  126.         update PSlot set pfname = new.name where pfname = old.name;
  127.     end if;
  128.     return new;
  129. end;
  130. ' language 'plpgsql';
  131. create trigger tg_pfield_au after update
  132.     on PField for each row execute procedure tg_pfield_au();
  133. -- ************************************************************
  134. -- * AFTER DELETE on PField
  135. -- * - Remove all slots of this patchfield
  136. -- ************************************************************
  137. create function tg_pfield_ad() returns opaque as '
  138. begin
  139.     delete from PSlot where pfname = old.name;
  140.     return old;
  141. end;
  142. ' language 'plpgsql';
  143. create trigger tg_pfield_ad after delete
  144.     on PField for each row execute procedure tg_pfield_ad();
  145. -- ************************************************************
  146. -- * BEFORE INSERT or UPDATE on PSlot
  147. -- * - Ensure that our patchfield does exist
  148. -- ************************************************************
  149. create function tg_pslot_biu() returns opaque as '
  150. declare
  151.     pfrec record;
  152.     rename new to ps;
  153. begin
  154.     select into pfrec * from PField where name = ps.pfname;
  155.     if not found then
  156.         raise exception ''Patchfield "%" does not exist'', ps.pfname;
  157.     end if;
  158.     return ps;
  159. end;
  160. ' language 'plpgsql';
  161. create trigger tg_pslot_biu before insert or update
  162.     on PSlot for each row execute procedure tg_pslot_biu();
  163. -- ************************************************************
  164. -- * AFTER UPDATE on System
  165. -- * - If system name changes let interfaces follow
  166. -- ************************************************************
  167. create function tg_system_au() returns opaque as '
  168. begin
  169.     if new.name != old.name then
  170.         update IFace set sysname = new.name where sysname = old.name;
  171.     end if;
  172.     return new;
  173. end;
  174. ' language 'plpgsql';
  175. create trigger tg_system_au after update
  176.     on System for each row execute procedure tg_system_au();
  177. -- ************************************************************
  178. -- * BEFORE INSERT or UPDATE on IFace
  179. -- * - set the slotname to IF.sysname.ifname
  180. -- ************************************************************
  181. create function tg_iface_biu() returns opaque as '
  182. declare
  183.     sname text;
  184.     sysrec record;
  185. begin
  186.     select into sysrec * from system where name = new.sysname;
  187.     if not found then
  188.         raise exception ''system "%" does not exist'', new.sysname;
  189.     end if;
  190.     sname := ''IF.'' || new.sysname;
  191.     sname := sname || ''.'';
  192.     sname := sname || new.ifname;
  193.     if length(sname) > 20 then
  194.         raise exception ''IFace slotname "%" too long (20 char max)'', sname;
  195.     end if;
  196.     new.slotname := sname;
  197.     return new;
  198. end;
  199. ' language 'plpgsql';
  200. create trigger tg_iface_biu before insert or update
  201.     on IFace for each row execute procedure tg_iface_biu();
  202. -- ************************************************************
  203. -- * AFTER INSERT or UPDATE or DELETE on Hub
  204. -- * - insert/delete/rename slots as required
  205. -- ************************************************************
  206. create function tg_hub_a() returns opaque as '
  207. declare
  208.     hname text;
  209.     dummy integer;
  210. begin
  211.     if tg_op = ''INSERT'' then
  212. dummy := tg_hub_adjustslots(new.name, 0, new.nslots);
  213. return new;
  214.     end if;
  215.     if tg_op = ''UPDATE'' then
  216. if new.name != old.name then
  217.     update HSlot set hubname = new.name where hubname = old.name;
  218. end if;
  219. dummy := tg_hub_adjustslots(new.name, old.nslots, new.nslots);
  220. return new;
  221.     end if;
  222.     if tg_op = ''DELETE'' then
  223. dummy := tg_hub_adjustslots(old.name, old.nslots, 0);
  224. return old;
  225.     end if;
  226. end;
  227. ' language 'plpgsql';
  228. create trigger tg_hub_a after insert or update or delete
  229.     on Hub for each row execute procedure tg_hub_a();
  230. -- ************************************************************
  231. -- * Support function to add/remove slots of Hub
  232. -- ************************************************************
  233. create function tg_hub_adjustslots(bpchar, integer, integer)
  234. returns integer as '
  235. declare
  236.     hname alias for $1;
  237.     oldnslots alias for $2;
  238.     newnslots alias for $3;
  239. begin
  240.     if newnslots = oldnslots then
  241.         return 0;
  242.     end if;
  243.     if newnslots < oldnslots then
  244.         delete from HSlot where hubname = hname and slotno > newnslots;
  245. return 0;
  246.     end if;
  247.     for i in oldnslots + 1 .. newnslots loop
  248.         insert into HSlot (slotname, hubname, slotno, slotlink)
  249. values (''HS.dummy'', hname, i, '''');
  250.     end loop;
  251.     return 0;
  252. end;
  253. ' language 'plpgsql';
  254. -- ************************************************************
  255. -- * BEFORE INSERT or UPDATE on HSlot
  256. -- * - prevent from manual manipulation
  257. -- * - set the slotname to HS.hubname.slotno
  258. -- ************************************************************
  259. create function tg_hslot_biu() returns opaque as '
  260. declare
  261.     sname text;
  262.     xname HSlot.slotname%TYPE;
  263.     hubrec record;
  264. begin
  265.     select into hubrec * from Hub where name = new.hubname;
  266.     if not found then
  267.         raise exception ''no manual manipulation of HSlot'';
  268.     end if;
  269.     if new.slotno < 1 or new.slotno > hubrec.nslots then
  270.         raise exception ''no manual manipulation of HSlot'';
  271.     end if;
  272.     if tg_op = ''UPDATE'' then
  273. if new.hubname != old.hubname then
  274.     if count(*) > 0 from Hub where name = old.hubname then
  275. raise exception ''no manual manipulation of HSlot'';
  276.     end if;
  277. end if;
  278.     end if;
  279.     sname := ''HS.'' || trim(new.hubname);
  280.     sname := sname || ''.'';
  281.     sname := sname || new.slotno::text;
  282.     if length(sname) > 20 then
  283.         raise exception ''HSlot slotname "%" too long (20 char max)'', sname;
  284.     end if;
  285.     new.slotname := sname;
  286.     return new;
  287. end;
  288. ' language 'plpgsql';
  289. create trigger tg_hslot_biu before insert or update
  290.     on HSlot for each row execute procedure tg_hslot_biu();
  291. -- ************************************************************
  292. -- * BEFORE DELETE on HSlot
  293. -- * - prevent from manual manipulation
  294. -- ************************************************************
  295. create function tg_hslot_bd() returns opaque as '
  296. declare
  297.     hubrec record;
  298. begin
  299.     select into hubrec * from Hub where name = old.hubname;
  300.     if not found then
  301.         return old;
  302.     end if;
  303.     if old.slotno > hubrec.nslots then
  304.         return old;
  305.     end if;
  306.     raise exception ''no manual manipulation of HSlot'';
  307. end;
  308. ' language 'plpgsql';
  309. create trigger tg_hslot_bd before delete
  310.     on HSlot for each row execute procedure tg_hslot_bd();
  311. -- ************************************************************
  312. -- * BEFORE INSERT on all slots
  313. -- * - Check name prefix
  314. -- ************************************************************
  315. create function tg_chkslotname() returns opaque as '
  316. begin
  317.     if substr(new.slotname, 1, 2) != tg_argv[0] then
  318.         raise exception ''slotname must begin with %'', tg_argv[0];
  319.     end if;
  320.     return new;
  321. end;
  322. ' language 'plpgsql';
  323. create trigger tg_chkslotname before insert
  324.     on PSlot for each row execute procedure tg_chkslotname('PS');
  325. create trigger tg_chkslotname before insert
  326.     on WSlot for each row execute procedure tg_chkslotname('WS');
  327. create trigger tg_chkslotname before insert
  328.     on PLine for each row execute procedure tg_chkslotname('PL');
  329. create trigger tg_chkslotname before insert
  330.     on IFace for each row execute procedure tg_chkslotname('IF');
  331. create trigger tg_chkslotname before insert
  332.     on PHone for each row execute procedure tg_chkslotname('PH');
  333. -- ************************************************************
  334. -- * BEFORE INSERT or UPDATE on all slots with slotlink
  335. -- * - Set slotlink to empty string if NULL value given
  336. -- ************************************************************
  337. create function tg_chkslotlink() returns opaque as '
  338. begin
  339.     if new.slotlink isnull then
  340.         new.slotlink := '''';
  341.     end if;
  342.     return new;
  343. end;
  344. ' language 'plpgsql';
  345. create trigger tg_chkslotlink before insert or update
  346.     on PSlot for each row execute procedure tg_chkslotlink();
  347. create trigger tg_chkslotlink before insert or update
  348.     on WSlot for each row execute procedure tg_chkslotlink();
  349. create trigger tg_chkslotlink before insert or update
  350.     on IFace for each row execute procedure tg_chkslotlink();
  351. create trigger tg_chkslotlink before insert or update
  352.     on HSlot for each row execute procedure tg_chkslotlink();
  353. create trigger tg_chkslotlink before insert or update
  354.     on PHone for each row execute procedure tg_chkslotlink();
  355. -- ************************************************************
  356. -- * BEFORE INSERT or UPDATE on all slots with backlink
  357. -- * - Set backlink to empty string if NULL value given
  358. -- ************************************************************
  359. create function tg_chkbacklink() returns opaque as '
  360. begin
  361.     if new.backlink isnull then
  362.         new.backlink := '''';
  363.     end if;
  364.     return new;
  365. end;
  366. ' language 'plpgsql';
  367. create trigger tg_chkbacklink before insert or update
  368.     on PSlot for each row execute procedure tg_chkbacklink();
  369. create trigger tg_chkbacklink before insert or update
  370.     on WSlot for each row execute procedure tg_chkbacklink();
  371. create trigger tg_chkbacklink before insert or update
  372.     on PLine for each row execute procedure tg_chkbacklink();
  373. -- ************************************************************
  374. -- * BEFORE UPDATE on PSlot
  375. -- * - do delete/insert instead of update if name changes
  376. -- ************************************************************
  377. create function tg_pslot_bu() returns opaque as '
  378. begin
  379.     if new.slotname != old.slotname then
  380.         delete from PSlot where slotname = old.slotname;
  381. insert into PSlot (
  382.     slotname,
  383.     pfname,
  384.     slotlink,
  385.     backlink
  386. ) values (
  387.     new.slotname,
  388.     new.pfname,
  389.     new.slotlink,
  390.     new.backlink
  391. );
  392.         return null;
  393.     end if;
  394.     return new;
  395. end;
  396. ' language 'plpgsql';
  397. create trigger tg_pslot_bu before update
  398.     on PSlot for each row execute procedure tg_pslot_bu();
  399. -- ************************************************************
  400. -- * BEFORE UPDATE on WSlot
  401. -- * - do delete/insert instead of update if name changes
  402. -- ************************************************************
  403. create function tg_wslot_bu() returns opaque as '
  404. begin
  405.     if new.slotname != old.slotname then
  406.         delete from WSlot where slotname = old.slotname;
  407. insert into WSlot (
  408.     slotname,
  409.     roomno,
  410.     slotlink,
  411.     backlink
  412. ) values (
  413.     new.slotname,
  414.     new.roomno,
  415.     new.slotlink,
  416.     new.backlink
  417. );
  418.         return null;
  419.     end if;
  420.     return new;
  421. end;
  422. ' language 'plpgsql';
  423. create trigger tg_wslot_bu before update
  424.     on WSlot for each row execute procedure tg_Wslot_bu();
  425. -- ************************************************************
  426. -- * BEFORE UPDATE on PLine
  427. -- * - do delete/insert instead of update if name changes
  428. -- ************************************************************
  429. create function tg_pline_bu() returns opaque as '
  430. begin
  431.     if new.slotname != old.slotname then
  432.         delete from PLine where slotname = old.slotname;
  433. insert into PLine (
  434.     slotname,
  435.     phonenumber,
  436.     comment,
  437.     backlink
  438. ) values (
  439.     new.slotname,
  440.     new.phonenumber,
  441.     new.comment,
  442.     new.backlink
  443. );
  444.         return null;
  445.     end if;
  446.     return new;
  447. end;
  448. ' language 'plpgsql';
  449. create trigger tg_pline_bu before update
  450.     on PLine for each row execute procedure tg_pline_bu();
  451. -- ************************************************************
  452. -- * BEFORE UPDATE on IFace
  453. -- * - do delete/insert instead of update if name changes
  454. -- ************************************************************
  455. create function tg_iface_bu() returns opaque as '
  456. begin
  457.     if new.slotname != old.slotname then
  458.         delete from IFace where slotname = old.slotname;
  459. insert into IFace (
  460.     slotname,
  461.     sysname,
  462.     ifname,
  463.     slotlink
  464. ) values (
  465.     new.slotname,
  466.     new.sysname,
  467.     new.ifname,
  468.     new.slotlink
  469. );
  470.         return null;
  471.     end if;
  472.     return new;
  473. end;
  474. ' language 'plpgsql';
  475. create trigger tg_iface_bu before update
  476.     on IFace for each row execute procedure tg_iface_bu();
  477. -- ************************************************************
  478. -- * BEFORE UPDATE on HSlot
  479. -- * - do delete/insert instead of update if name changes
  480. -- ************************************************************
  481. create function tg_hslot_bu() returns opaque as '
  482. begin
  483.     if new.slotname != old.slotname or new.hubname != old.hubname then
  484.         delete from HSlot where slotname = old.slotname;
  485. insert into HSlot (
  486.     slotname,
  487.     hubname,
  488.     slotno,
  489.     slotlink
  490. ) values (
  491.     new.slotname,
  492.     new.hubname,
  493.     new.slotno,
  494.     new.slotlink
  495. );
  496.         return null;
  497.     end if;
  498.     return new;
  499. end;
  500. ' language 'plpgsql';
  501. create trigger tg_hslot_bu before update
  502.     on HSlot for each row execute procedure tg_hslot_bu();
  503. -- ************************************************************
  504. -- * BEFORE UPDATE on PHone
  505. -- * - do delete/insert instead of update if name changes
  506. -- ************************************************************
  507. create function tg_phone_bu() returns opaque as '
  508. begin
  509.     if new.slotname != old.slotname then
  510.         delete from PHone where slotname = old.slotname;
  511. insert into PHone (
  512.     slotname,
  513.     comment,
  514.     slotlink
  515. ) values (
  516.     new.slotname,
  517.     new.comment,
  518.     new.slotlink
  519. );
  520.         return null;
  521.     end if;
  522.     return new;
  523. end;
  524. ' language 'plpgsql';
  525. create trigger tg_phone_bu before update
  526.     on PHone for each row execute procedure tg_phone_bu();
  527. -- ************************************************************
  528. -- * AFTER INSERT or UPDATE or DELETE on slot with backlink
  529. -- * - Ensure that the opponent correctly points back to us
  530. -- ************************************************************
  531. create function tg_backlink_a() returns opaque as '
  532. declare
  533.     dummy integer;
  534. begin
  535.     if tg_op = ''INSERT'' then
  536.         if new.backlink != '''' then
  537.     dummy := tg_backlink_set(new.backlink, new.slotname);
  538. end if;
  539. return new;
  540.     end if;
  541.     if tg_op = ''UPDATE'' then
  542.         if new.backlink != old.backlink then
  543.     if old.backlink != '''' then
  544.         dummy := tg_backlink_unset(old.backlink, old.slotname);
  545.     end if;
  546.     if new.backlink != '''' then
  547.         dummy := tg_backlink_set(new.backlink, new.slotname);
  548.     end if;
  549. else
  550.     if new.slotname != old.slotname and new.backlink != '''' then
  551.         dummy := tg_slotlink_set(new.backlink, new.slotname);
  552.     end if;
  553. end if;
  554. return new;
  555.     end if;
  556.     if tg_op = ''DELETE'' then
  557.         if old.backlink != '''' then
  558.     dummy := tg_backlink_unset(old.backlink, old.slotname);
  559. end if;
  560. return old;
  561.     end if;
  562. end;
  563. ' language 'plpgsql';
  564. create trigger tg_backlink_a after insert or update or delete
  565.     on PSlot for each row execute procedure tg_backlink_a('PS');
  566. create trigger tg_backlink_a after insert or update or delete
  567.     on WSlot for each row execute procedure tg_backlink_a('WS');
  568. create trigger tg_backlink_a after insert or update or delete
  569.     on PLine for each row execute procedure tg_backlink_a('PL');
  570. -- ************************************************************
  571. -- * Support function to set the opponents backlink field
  572. -- * if it does not already point to the requested slot
  573. -- ************************************************************
  574. create function tg_backlink_set(bpchar, bpchar)
  575. returns integer as '
  576. declare
  577.     myname alias for $1;
  578.     blname alias for $2;
  579.     mytype char(2);
  580.     link char(4);
  581.     rec record;
  582. begin
  583.     mytype := substr(myname, 1, 2);
  584.     link := mytype || substr(blname, 1, 2);
  585.     if link = ''PLPL'' then
  586.         raise exception 
  587. ''backlink between two phone lines does not make sense'';
  588.     end if;
  589.     if link in (''PLWS'', ''WSPL'') then
  590.         raise exception 
  591. ''direct link of phone line to wall slot not permitted'';
  592.     end if;
  593.     if mytype = ''PS'' then
  594.         select into rec * from PSlot where slotname = myname;
  595. if not found then
  596.     raise exception ''% does not exists'', myname;
  597. end if;
  598. if rec.backlink != blname then
  599.     update PSlot set backlink = blname where slotname = myname;
  600. end if;
  601. return 0;
  602.     end if;
  603.     if mytype = ''WS'' then
  604.         select into rec * from WSlot where slotname = myname;
  605. if not found then
  606.     raise exception ''% does not exists'', myname;
  607. end if;
  608. if rec.backlink != blname then
  609.     update WSlot set backlink = blname where slotname = myname;
  610. end if;
  611. return 0;
  612.     end if;
  613.     if mytype = ''PL'' then
  614.         select into rec * from PLine where slotname = myname;
  615. if not found then
  616.     raise exception ''% does not exists'', myname;
  617. end if;
  618. if rec.backlink != blname then
  619.     update PLine set backlink = blname where slotname = myname;
  620. end if;
  621. return 0;
  622.     end if;
  623.     raise exception ''illegal backlink beginning with %'', mytype;
  624. end;
  625. ' language 'plpgsql';
  626. -- ************************************************************
  627. -- * Support function to clear out the backlink field if
  628. -- * it still points to specific slot
  629. -- ************************************************************
  630. create function tg_backlink_unset(bpchar, bpchar)
  631. returns integer as '
  632. declare
  633.     myname alias for $1;
  634.     blname alias for $2;
  635.     mytype char(2);
  636.     rec record;
  637. begin
  638.     mytype := substr(myname, 1, 2);
  639.     if mytype = ''PS'' then
  640.         select into rec * from PSlot where slotname = myname;
  641. if not found then
  642.     return 0;
  643. end if;
  644. if rec.backlink = blname then
  645.     update PSlot set backlink = '''' where slotname = myname;
  646. end if;
  647. return 0;
  648.     end if;
  649.     if mytype = ''WS'' then
  650.         select into rec * from WSlot where slotname = myname;
  651. if not found then
  652.     return 0;
  653. end if;
  654. if rec.backlink = blname then
  655.     update WSlot set backlink = '''' where slotname = myname;
  656. end if;
  657. return 0;
  658.     end if;
  659.     if mytype = ''PL'' then
  660.         select into rec * from PLine where slotname = myname;
  661. if not found then
  662.     return 0;
  663. end if;
  664. if rec.backlink = blname then
  665.     update PLine set backlink = '''' where slotname = myname;
  666. end if;
  667. return 0;
  668.     end if;
  669. end;
  670. ' language 'plpgsql';
  671. -- ************************************************************
  672. -- * AFTER INSERT or UPDATE or DELETE on slot with slotlink
  673. -- * - Ensure that the opponent correctly points back to us
  674. -- ************************************************************
  675. create function tg_slotlink_a() returns opaque as '
  676. declare
  677.     dummy integer;
  678. begin
  679.     if tg_op = ''INSERT'' then
  680.         if new.slotlink != '''' then
  681.     dummy := tg_slotlink_set(new.slotlink, new.slotname);
  682. end if;
  683. return new;
  684.     end if;
  685.     if tg_op = ''UPDATE'' then
  686.         if new.slotlink != old.slotlink then
  687.     if old.slotlink != '''' then
  688.         dummy := tg_slotlink_unset(old.slotlink, old.slotname);
  689.     end if;
  690.     if new.slotlink != '''' then
  691.         dummy := tg_slotlink_set(new.slotlink, new.slotname);
  692.     end if;
  693. else
  694.     if new.slotname != old.slotname and new.slotlink != '''' then
  695.         dummy := tg_slotlink_set(new.slotlink, new.slotname);
  696.     end if;
  697. end if;
  698. return new;
  699.     end if;
  700.     if tg_op = ''DELETE'' then
  701.         if old.slotlink != '''' then
  702.     dummy := tg_slotlink_unset(old.slotlink, old.slotname);
  703. end if;
  704. return old;
  705.     end if;
  706. end;
  707. ' language 'plpgsql';
  708. create trigger tg_slotlink_a after insert or update or delete
  709.     on PSlot for each row execute procedure tg_slotlink_a('PS');
  710. create trigger tg_slotlink_a after insert or update or delete
  711.     on WSlot for each row execute procedure tg_slotlink_a('WS');
  712. create trigger tg_slotlink_a after insert or update or delete
  713.     on IFace for each row execute procedure tg_slotlink_a('IF');
  714. create trigger tg_slotlink_a after insert or update or delete
  715.     on HSlot for each row execute procedure tg_slotlink_a('HS');
  716. create trigger tg_slotlink_a after insert or update or delete
  717.     on PHone for each row execute procedure tg_slotlink_a('PH');
  718. -- ************************************************************
  719. -- * Support function to set the opponents slotlink field
  720. -- * if it does not already point to the requested slot
  721. -- ************************************************************
  722. create function tg_slotlink_set(bpchar, bpchar)
  723. returns integer as '
  724. declare
  725.     myname alias for $1;
  726.     blname alias for $2;
  727.     mytype char(2);
  728.     link char(4);
  729.     rec record;
  730. begin
  731.     mytype := substr(myname, 1, 2);
  732.     link := mytype || substr(blname, 1, 2);
  733.     if link = ''PHPH'' then
  734.         raise exception 
  735. ''slotlink between two phones does not make sense'';
  736.     end if;
  737.     if link in (''PHHS'', ''HSPH'') then
  738.         raise exception 
  739. ''link of phone to hub does not make sense'';
  740.     end if;
  741.     if link in (''PHIF'', ''IFPH'') then
  742.         raise exception 
  743. ''link of phone to hub does not make sense'';
  744.     end if;
  745.     if link in (''PSWS'', ''WSPS'') then
  746.         raise exception 
  747. ''slotlink from patchslot to wallslot not permitted'';
  748.     end if;
  749.     if mytype = ''PS'' then
  750.         select into rec * from PSlot where slotname = myname;
  751. if not found then
  752.     raise exception ''% does not exists'', myname;
  753. end if;
  754. if rec.slotlink != blname then
  755.     update PSlot set slotlink = blname where slotname = myname;
  756. end if;
  757. return 0;
  758.     end if;
  759.     if mytype = ''WS'' then
  760.         select into rec * from WSlot where slotname = myname;
  761. if not found then
  762.     raise exception ''% does not exists'', myname;
  763. end if;
  764. if rec.slotlink != blname then
  765.     update WSlot set slotlink = blname where slotname = myname;
  766. end if;
  767. return 0;
  768.     end if;
  769.     if mytype = ''IF'' then
  770.         select into rec * from IFace where slotname = myname;
  771. if not found then
  772.     raise exception ''% does not exists'', myname;
  773. end if;
  774. if rec.slotlink != blname then
  775.     update IFace set slotlink = blname where slotname = myname;
  776. end if;
  777. return 0;
  778.     end if;
  779.     if mytype = ''HS'' then
  780.         select into rec * from HSlot where slotname = myname;
  781. if not found then
  782.     raise exception ''% does not exists'', myname;
  783. end if;
  784. if rec.slotlink != blname then
  785.     update HSlot set slotlink = blname where slotname = myname;
  786. end if;
  787. return 0;
  788.     end if;
  789.     if mytype = ''PH'' then
  790.         select into rec * from PHone where slotname = myname;
  791. if not found then
  792.     raise exception ''% does not exists'', myname;
  793. end if;
  794. if rec.slotlink != blname then
  795.     update PHone set slotlink = blname where slotname = myname;
  796. end if;
  797. return 0;
  798.     end if;
  799.     raise exception ''illegal slotlink beginning with %'', mytype;
  800. end;
  801. ' language 'plpgsql';
  802. -- ************************************************************
  803. -- * Support function to clear out the slotlink field if
  804. -- * it still points to specific slot
  805. -- ************************************************************
  806. create function tg_slotlink_unset(bpchar, bpchar)
  807. returns integer as '
  808. declare
  809.     myname alias for $1;
  810.     blname alias for $2;
  811.     mytype char(2);
  812.     rec record;
  813. begin
  814.     mytype := substr(myname, 1, 2);
  815.     if mytype = ''PS'' then
  816.         select into rec * from PSlot where slotname = myname;
  817. if not found then
  818.     return 0;
  819. end if;
  820. if rec.slotlink = blname then
  821.     update PSlot set slotlink = '''' where slotname = myname;
  822. end if;
  823. return 0;
  824.     end if;
  825.     if mytype = ''WS'' then
  826.         select into rec * from WSlot where slotname = myname;
  827. if not found then
  828.     return 0;
  829. end if;
  830. if rec.slotlink = blname then
  831.     update WSlot set slotlink = '''' where slotname = myname;
  832. end if;
  833. return 0;
  834.     end if;
  835.     if mytype = ''IF'' then
  836.         select into rec * from IFace where slotname = myname;
  837. if not found then
  838.     return 0;
  839. end if;
  840. if rec.slotlink = blname then
  841.     update IFace set slotlink = '''' where slotname = myname;
  842. end if;
  843. return 0;
  844.     end if;
  845.     if mytype = ''HS'' then
  846.         select into rec * from HSlot where slotname = myname;
  847. if not found then
  848.     return 0;
  849. end if;
  850. if rec.slotlink = blname then
  851.     update HSlot set slotlink = '''' where slotname = myname;
  852. end if;
  853. return 0;
  854.     end if;
  855.     if mytype = ''PH'' then
  856.         select into rec * from PHone where slotname = myname;
  857. if not found then
  858.     return 0;
  859. end if;
  860. if rec.slotlink = blname then
  861.     update PHone set slotlink = '''' where slotname = myname;
  862. end if;
  863. return 0;
  864.     end if;
  865. end;
  866. ' language 'plpgsql';
  867. -- ************************************************************
  868. -- * Describe the backside of a patchfield slot
  869. -- ************************************************************
  870. create function pslot_backlink_view(bpchar)
  871. returns text as '
  872. <<outer>>
  873. declare
  874.     rec record;
  875.     bltype char(2);
  876.     retval text;
  877. begin
  878.     select into rec * from PSlot where slotname = $1;
  879.     if not found then
  880.         return '''';
  881.     end if;
  882.     if rec.backlink = '''' then
  883.         return ''-'';
  884.     end if;
  885.     bltype := substr(rec.backlink, 1, 2);
  886.     if bltype = ''PL'' then
  887.         declare
  888.     rec record;
  889. begin
  890.     select into rec * from PLine where slotname = outer.rec.backlink;
  891.     retval := ''Phone line '' || trim(rec.phonenumber);
  892.     if rec.comment != '''' then
  893.         retval := retval || '' ('';
  894. retval := retval || rec.comment;
  895. retval := retval || '')'';
  896.     end if;
  897.     return retval;
  898. end;
  899.     end if;
  900.     if bltype = ''WS'' then
  901.         select into rec * from WSlot where slotname = rec.backlink;
  902. retval := trim(rec.slotname) || '' in room '';
  903. retval := retval || trim(rec.roomno);
  904. retval := retval || '' -> '';
  905. return retval || wslot_slotlink_view(rec.slotname);
  906.     end if;
  907.     return rec.backlink;
  908. end;
  909. ' language 'plpgsql';
  910. -- ************************************************************
  911. -- * Describe the front of a patchfield slot
  912. -- ************************************************************
  913. create function pslot_slotlink_view(bpchar)
  914. returns text as '
  915. declare
  916.     psrec record;
  917.     sltype char(2);
  918.     retval text;
  919. begin
  920.     select into psrec * from PSlot where slotname = $1;
  921.     if not found then
  922.         return '''';
  923.     end if;
  924.     if psrec.slotlink = '''' then
  925.         return ''-'';
  926.     end if;
  927.     sltype := substr(psrec.slotlink, 1, 2);
  928.     if sltype = ''PS'' then
  929. retval := trim(psrec.slotlink) || '' -> '';
  930. return retval || pslot_backlink_view(psrec.slotlink);
  931.     end if;
  932.     if sltype = ''HS'' then
  933.         retval := comment from Hub H, HSlot HS
  934. where HS.slotname = psrec.slotlink
  935.   and H.name = HS.hubname;
  936.         retval := retval || '' slot '';
  937. retval := retval || slotno::text from HSlot
  938. where slotname = psrec.slotlink;
  939. return retval;
  940.     end if;
  941.     return psrec.slotlink;
  942. end;
  943. ' language 'plpgsql';
  944. -- ************************************************************
  945. -- * Describe the front of a wall connector slot
  946. -- ************************************************************
  947. create function wslot_slotlink_view(bpchar)
  948. returns text as '
  949. declare
  950.     rec record;
  951.     sltype char(2);
  952.     retval text;
  953. begin
  954.     select into rec * from WSlot where slotname = $1;
  955.     if not found then
  956.         return '''';
  957.     end if;
  958.     if rec.slotlink = '''' then
  959.         return ''-'';
  960.     end if;
  961.     sltype := substr(rec.slotlink, 1, 2);
  962.     if sltype = ''PH'' then
  963.         select into rec * from PHone where slotname = rec.slotlink;
  964. retval := ''Phone '' || trim(rec.slotname);
  965. if rec.comment != '''' then
  966.     retval := retval || '' ('';
  967.     retval := retval || rec.comment;
  968.     retval := retval || '')'';
  969. end if;
  970. return retval;
  971.     end if;
  972.     if sltype = ''IF'' then
  973. declare
  974.     syrow System%RowType;
  975.     ifrow IFace%ROWTYPE;
  976.         begin
  977.     select into ifrow * from IFace where slotname = rec.slotlink;
  978.     select into syrow * from System where name = ifrow.sysname;
  979.     retval := syrow.name || '' IF '';
  980.     retval := retval || ifrow.ifname;
  981.     if syrow.comment != '''' then
  982.         retval := retval || '' ('';
  983. retval := retval || syrow.comment;
  984. retval := retval || '')'';
  985.     end if;
  986.     return retval;
  987. end;
  988.     end if;
  989.     return rec.slotlink;
  990. end;
  991. ' language 'plpgsql';
  992. -- ************************************************************
  993. -- * View of a patchfield describing backside and patches
  994. -- ************************************************************
  995. create view Pfield_v1 as select PF.pfname, PF.slotname,
  996. pslot_backlink_view(PF.slotname) as backside,
  997. pslot_slotlink_view(PF.slotname) as patch
  998.     from PSlot PF;
  999. --
  1000. -- First we build the house - so we create the rooms
  1001. --
  1002. insert into Room values ('001', 'Entrance');
  1003. insert into Room values ('002', 'Office');
  1004. insert into Room values ('003', 'Office');
  1005. insert into Room values ('004', 'Technical');
  1006. insert into Room values ('101', 'Office');
  1007. insert into Room values ('102', 'Conference');
  1008. insert into Room values ('103', 'Restroom');
  1009. insert into Room values ('104', 'Technical');
  1010. insert into Room values ('105', 'Office');
  1011. insert into Room values ('106', 'Office');
  1012. --
  1013. -- Second we install the wall connectors
  1014. --
  1015. insert into WSlot values ('WS.001.1a', '001', '', '');
  1016. insert into WSlot values ('WS.001.1b', '001', '', '');
  1017. insert into WSlot values ('WS.001.2a', '001', '', '');
  1018. insert into WSlot values ('WS.001.2b', '001', '', '');
  1019. insert into WSlot values ('WS.001.3a', '001', '', '');
  1020. insert into WSlot values ('WS.001.3b', '001', '', '');
  1021. insert into WSlot values ('WS.002.1a', '002', '', '');
  1022. insert into WSlot values ('WS.002.1b', '002', '', '');
  1023. insert into WSlot values ('WS.002.2a', '002', '', '');
  1024. insert into WSlot values ('WS.002.2b', '002', '', '');
  1025. insert into WSlot values ('WS.002.3a', '002', '', '');
  1026. insert into WSlot values ('WS.002.3b', '002', '', '');
  1027. insert into WSlot values ('WS.003.1a', '003', '', '');
  1028. insert into WSlot values ('WS.003.1b', '003', '', '');
  1029. insert into WSlot values ('WS.003.2a', '003', '', '');
  1030. insert into WSlot values ('WS.003.2b', '003', '', '');
  1031. insert into WSlot values ('WS.003.3a', '003', '', '');
  1032. insert into WSlot values ('WS.003.3b', '003', '', '');
  1033. insert into WSlot values ('WS.101.1a', '101', '', '');
  1034. insert into WSlot values ('WS.101.1b', '101', '', '');
  1035. insert into WSlot values ('WS.101.2a', '101', '', '');
  1036. insert into WSlot values ('WS.101.2b', '101', '', '');
  1037. insert into WSlot values ('WS.101.3a', '101', '', '');
  1038. insert into WSlot values ('WS.101.3b', '101', '', '');
  1039. insert into WSlot values ('WS.102.1a', '102', '', '');
  1040. insert into WSlot values ('WS.102.1b', '102', '', '');
  1041. insert into WSlot values ('WS.102.2a', '102', '', '');
  1042. insert into WSlot values ('WS.102.2b', '102', '', '');
  1043. insert into WSlot values ('WS.102.3a', '102', '', '');
  1044. insert into WSlot values ('WS.102.3b', '102', '', '');
  1045. insert into WSlot values ('WS.105.1a', '105', '', '');
  1046. insert into WSlot values ('WS.105.1b', '105', '', '');
  1047. insert into WSlot values ('WS.105.2a', '105', '', '');
  1048. insert into WSlot values ('WS.105.2b', '105', '', '');
  1049. insert into WSlot values ('WS.105.3a', '105', '', '');
  1050. insert into WSlot values ('WS.105.3b', '105', '', '');
  1051. insert into WSlot values ('WS.106.1a', '106', '', '');
  1052. insert into WSlot values ('WS.106.1b', '106', '', '');
  1053. insert into WSlot values ('WS.106.2a', '106', '', '');
  1054. insert into WSlot values ('WS.106.2b', '106', '', '');
  1055. insert into WSlot values ('WS.106.3a', '106', '', '');
  1056. insert into WSlot values ('WS.106.3b', '106', '', '');
  1057. --
  1058. -- Now create the patch fields and their slots
  1059. --
  1060. insert into PField values ('PF0_1', 'Wallslots basement');
  1061. --
  1062. -- The cables for these will be made later, so they are unconnected for now
  1063. --
  1064. insert into PSlot values ('PS.base.a1', 'PF0_1', '', '');
  1065. insert into PSlot values ('PS.base.a2', 'PF0_1', '', '');
  1066. insert into PSlot values ('PS.base.a3', 'PF0_1', '', '');
  1067. insert into PSlot values ('PS.base.a4', 'PF0_1', '', '');
  1068. insert into PSlot values ('PS.base.a5', 'PF0_1', '', '');
  1069. insert into PSlot values ('PS.base.a6', 'PF0_1', '', '');
  1070. --
  1071. -- These are already wired to the wall connectors
  1072. --
  1073. insert into PSlot values ('PS.base.b1', 'PF0_1', '', 'WS.002.1a');
  1074. insert into PSlot values ('PS.base.b2', 'PF0_1', '', 'WS.002.1b');
  1075. insert into PSlot values ('PS.base.b3', 'PF0_1', '', 'WS.002.2a');
  1076. insert into PSlot values ('PS.base.b4', 'PF0_1', '', 'WS.002.2b');
  1077. insert into PSlot values ('PS.base.b5', 'PF0_1', '', 'WS.002.3a');
  1078. insert into PSlot values ('PS.base.b6', 'PF0_1', '', 'WS.002.3b');
  1079. insert into PSlot values ('PS.base.c1', 'PF0_1', '', 'WS.003.1a');
  1080. insert into PSlot values ('PS.base.c2', 'PF0_1', '', 'WS.003.1b');
  1081. insert into PSlot values ('PS.base.c3', 'PF0_1', '', 'WS.003.2a');
  1082. insert into PSlot values ('PS.base.c4', 'PF0_1', '', 'WS.003.2b');
  1083. insert into PSlot values ('PS.base.c5', 'PF0_1', '', 'WS.003.3a');
  1084. insert into PSlot values ('PS.base.c6', 'PF0_1', '', 'WS.003.3b');
  1085. --
  1086. -- This patchfield will be renamed later into PF0_2 - so its
  1087. -- slots references in pfname should follow
  1088. --
  1089. insert into PField values ('PF0_X', 'Phonelines basement');
  1090. insert into PSlot values ('PS.base.ta1', 'PF0_X', '', '');
  1091. insert into PSlot values ('PS.base.ta2', 'PF0_X', '', '');
  1092. insert into PSlot values ('PS.base.ta3', 'PF0_X', '', '');
  1093. insert into PSlot values ('PS.base.ta4', 'PF0_X', '', '');
  1094. insert into PSlot values ('PS.base.ta5', 'PF0_X', '', '');
  1095. insert into PSlot values ('PS.base.ta6', 'PF0_X', '', '');
  1096. insert into PSlot values ('PS.base.tb1', 'PF0_X', '', '');
  1097. insert into PSlot values ('PS.base.tb2', 'PF0_X', '', '');
  1098. insert into PSlot values ('PS.base.tb3', 'PF0_X', '', '');
  1099. insert into PSlot values ('PS.base.tb4', 'PF0_X', '', '');
  1100. insert into PSlot values ('PS.base.tb5', 'PF0_X', '', '');
  1101. insert into PSlot values ('PS.base.tb6', 'PF0_X', '', '');
  1102. insert into PField values ('PF1_1', 'Wallslots 1st floor');
  1103. insert into PSlot values ('PS.1st.a1', 'PF1_1', '', 'WS.101.1a');
  1104. insert into PSlot values ('PS.1st.a2', 'PF1_1', '', 'WS.101.1b');
  1105. insert into PSlot values ('PS.1st.a3', 'PF1_1', '', 'WS.101.2a');
  1106. insert into PSlot values ('PS.1st.a4', 'PF1_1', '', 'WS.101.2b');
  1107. insert into PSlot values ('PS.1st.a5', 'PF1_1', '', 'WS.101.3a');
  1108. insert into PSlot values ('PS.1st.a6', 'PF1_1', '', 'WS.101.3b');
  1109. insert into PSlot values ('PS.1st.b1', 'PF1_1', '', 'WS.102.1a');
  1110. insert into PSlot values ('PS.1st.b2', 'PF1_1', '', 'WS.102.1b');
  1111. insert into PSlot values ('PS.1st.b3', 'PF1_1', '', 'WS.102.2a');
  1112. insert into PSlot values ('PS.1st.b4', 'PF1_1', '', 'WS.102.2b');
  1113. insert into PSlot values ('PS.1st.b5', 'PF1_1', '', 'WS.102.3a');
  1114. insert into PSlot values ('PS.1st.b6', 'PF1_1', '', 'WS.102.3b');
  1115. insert into PSlot values ('PS.1st.c1', 'PF1_1', '', 'WS.105.1a');
  1116. insert into PSlot values ('PS.1st.c2', 'PF1_1', '', 'WS.105.1b');
  1117. insert into PSlot values ('PS.1st.c3', 'PF1_1', '', 'WS.105.2a');
  1118. insert into PSlot values ('PS.1st.c4', 'PF1_1', '', 'WS.105.2b');
  1119. insert into PSlot values ('PS.1st.c5', 'PF1_1', '', 'WS.105.3a');
  1120. insert into PSlot values ('PS.1st.c6', 'PF1_1', '', 'WS.105.3b');
  1121. insert into PSlot values ('PS.1st.d1', 'PF1_1', '', 'WS.106.1a');
  1122. insert into PSlot values ('PS.1st.d2', 'PF1_1', '', 'WS.106.1b');
  1123. insert into PSlot values ('PS.1st.d3', 'PF1_1', '', 'WS.106.2a');
  1124. insert into PSlot values ('PS.1st.d4', 'PF1_1', '', 'WS.106.2b');
  1125. insert into PSlot values ('PS.1st.d5', 'PF1_1', '', 'WS.106.3a');
  1126. insert into PSlot values ('PS.1st.d6', 'PF1_1', '', 'WS.106.3b');
  1127. --
  1128. -- Now we wire the wall connectors 1a-2a in room 001 to the
  1129. -- patchfield. In the second update we make an error, and
  1130. -- correct it after
  1131. --
  1132. update PSlot set backlink = 'WS.001.1a' where slotname = 'PS.base.a1';
  1133. update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a3';
  1134. select * from WSlot where roomno = '001' order by slotname;
  1135. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1136. update PSlot set backlink = 'WS.001.2a' where slotname = 'PS.base.a3';
  1137. select * from WSlot where roomno = '001' order by slotname;
  1138. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1139. update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a2';
  1140. select * from WSlot where roomno = '001' order by slotname;
  1141. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1142. --
  1143. -- Same procedure for 2b-3b but this time updating the WSlot instead
  1144. -- of the PSlot. Due to the triggers the result is the same:
  1145. -- WSlot and corresponding PSlot point to each other.
  1146. --
  1147. update WSlot set backlink = 'PS.base.a4' where slotname = 'WS.001.2b';
  1148. update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3a';
  1149. select * from WSlot where roomno = '001' order by slotname;
  1150. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1151. update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3b';
  1152. select * from WSlot where roomno = '001' order by slotname;
  1153. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1154. update WSlot set backlink = 'PS.base.a5' where slotname = 'WS.001.3a';
  1155. select * from WSlot where roomno = '001' order by slotname;
  1156. select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
  1157. insert into PField values ('PF1_2', 'Phonelines 1st floor');
  1158. insert into PSlot values ('PS.1st.ta1', 'PF1_2', '', '');
  1159. insert into PSlot values ('PS.1st.ta2', 'PF1_2', '', '');
  1160. insert into PSlot values ('PS.1st.ta3', 'PF1_2', '', '');
  1161. insert into PSlot values ('PS.1st.ta4', 'PF1_2', '', '');
  1162. insert into PSlot values ('PS.1st.ta5', 'PF1_2', '', '');
  1163. insert into PSlot values ('PS.1st.ta6', 'PF1_2', '', '');
  1164. insert into PSlot values ('PS.1st.tb1', 'PF1_2', '', '');
  1165. insert into PSlot values ('PS.1st.tb2', 'PF1_2', '', '');
  1166. insert into PSlot values ('PS.1st.tb3', 'PF1_2', '', '');
  1167. insert into PSlot values ('PS.1st.tb4', 'PF1_2', '', '');
  1168. insert into PSlot values ('PS.1st.tb5', 'PF1_2', '', '');
  1169. insert into PSlot values ('PS.1st.tb6', 'PF1_2', '', '');
  1170. --
  1171. -- Fix the wrong name for patchfield PF0_2
  1172. --
  1173. update PField set name = 'PF0_2' where name = 'PF0_X';
  1174. select * from PSlot order by slotname;
  1175. select * from WSlot order by slotname;
  1176. --
  1177. -- Install the central phone system and create the phone numbers.
  1178. -- They are weired on insert to the patchfields. Again the
  1179. -- triggers automatically tell the PSlots to update their
  1180. -- backlink field.
  1181. --
  1182. insert into PLine values ('PL.001', '-0', 'Central call', 'PS.base.ta1');
  1183. insert into PLine values ('PL.002', '-101', '', 'PS.base.ta2');
  1184. insert into PLine values ('PL.003', '-102', '', 'PS.base.ta3');
  1185. insert into PLine values ('PL.004', '-103', '', 'PS.base.ta5');
  1186. insert into PLine values ('PL.005', '-104', '', 'PS.base.ta6');
  1187. insert into PLine values ('PL.006', '-106', '', 'PS.base.tb2');
  1188. insert into PLine values ('PL.007', '-108', '', 'PS.base.tb3');
  1189. insert into PLine values ('PL.008', '-109', '', 'PS.base.tb4');
  1190. insert into PLine values ('PL.009', '-121', '', 'PS.base.tb5');
  1191. insert into PLine values ('PL.010', '-122', '', 'PS.base.tb6');
  1192. insert into PLine values ('PL.015', '-134', '', 'PS.1st.ta1');
  1193. insert into PLine values ('PL.016', '-137', '', 'PS.1st.ta3');
  1194. insert into PLine values ('PL.017', '-139', '', 'PS.1st.ta4');
  1195. insert into PLine values ('PL.018', '-362', '', 'PS.1st.tb1');
  1196. insert into PLine values ('PL.019', '-363', '', 'PS.1st.tb2');
  1197. insert into PLine values ('PL.020', '-364', '', 'PS.1st.tb3');
  1198. insert into PLine values ('PL.021', '-365', '', 'PS.1st.tb5');
  1199. insert into PLine values ('PL.022', '-367', '', 'PS.1st.tb6');
  1200. insert into PLine values ('PL.028', '-501', 'Fax entrance', 'PS.base.ta2');
  1201. insert into PLine values ('PL.029', '-502', 'Fax 1st floor', 'PS.1st.ta1');
  1202. --
  1203. -- Buy some phones, plug them into the wall and patch the
  1204. -- phone lines to the corresponding patchfield slots.
  1205. --
  1206. insert into PHone values ('PH.hc001', 'Hicom standard', 'WS.001.1a');
  1207. update PSlot set slotlink = 'PS.base.ta1' where slotname = 'PS.base.a1';
  1208. insert into PHone values ('PH.hc002', 'Hicom standard', 'WS.002.1a');
  1209. update PSlot set slotlink = 'PS.base.ta5' where slotname = 'PS.base.b1';
  1210. insert into PHone values ('PH.hc003', 'Hicom standard', 'WS.002.2a');
  1211. update PSlot set slotlink = 'PS.base.tb2' where slotname = 'PS.base.b3';
  1212. insert into PHone values ('PH.fax001', 'Canon fax', 'WS.001.2a');
  1213. update PSlot set slotlink = 'PS.base.ta2' where slotname = 'PS.base.a3';
  1214. --
  1215. -- Install a hub at one of the patchfields, plug a computers
  1216. -- ethernet interface into the wall and patch it to the hub.
  1217. --
  1218. insert into Hub values ('base.hub1', 'Patchfield PF0_1 hub', 16);
  1219. insert into System values ('orion', 'PC');
  1220. insert into IFace values ('IF', 'orion', 'eth0', 'WS.002.1b');
  1221. update PSlot set slotlink = 'HS.base.hub1.1' where slotname = 'PS.base.b2';
  1222. --
  1223. -- Now we take a look at the patchfield
  1224. --
  1225. select * from PField_v1 where pfname = 'PF0_1' order by slotname;
  1226. select * from PField_v1 where pfname = 'PF0_2' order by slotname;
  1227. --
  1228. -- Finally we want errors
  1229. --
  1230. insert into PField values ('PF1_1', 'should fail due to unique index');
  1231. update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
  1232. update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
  1233. update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
  1234. update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
  1235. insert into HSlot values ('HS', 'base.hub1', 1, '');
  1236. insert into HSlot values ('HS', 'base.hub1', 20, '');
  1237. delete from HSlot;
  1238. insert into IFace values ('IF', 'notthere', 'eth0', '');
  1239. insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', '');