Left Up Right Nisserver mit mehreren Typen von Maps

weitere Ideen

group.byname und group.bygid
In relationalen Datenbanken sollten diese in mehrere Relationen aufgebrochen werden:
// MMIMS-Unix-Strukturen
CREATE TABLE passwd
(
  login VARCHAR(16) KEY,
  pwd   CHAR(15),
  uid   FIXED(6,0) UNIQUE NOT NULL,
  gid   FIXED(6,0),
  gcos  VARCHAR(80),
  home  VARCHAR(30),
  shell VARCHAR(30),
  status CHAR(1) ,
  aendtaeter   CHAR(15),
  aendzeit     TIMESTAMP
);

// CONSTRAINT status IN ('N','A','K')

CREATE TABLE ugroup
(
  gname VARCHAR(16) KEY,
  gid  FIXED(6,0) UNIQUE NOT NULL,
  passwd VARCHAR(15)
);
//
CREATE TABLE ugroupmembers
(
  login VARCHAR(16),
  gname VARCHAR(16),

  FOREIGN KEY(login) REFERENCES passwd ON DELETE CASCADE,
  FOREIGN KEY(gname) REFERENCES ugroup
  ON DELETE CASCADE
);
  
Mit den folgenden zugehörigen DB-Prozeduren wird die Gruppenzeile richtig zusammengebaut:
  
DBPROC MG.GETGROUP PARMS ( IN gruppe  VARCHAR(15), OUT erg VARCHAR(256) );
 
 SQL ( SELECT gname,passwd,gid INTO :@gname,:@passwd,:@gid
       FROM "MDBA"."UGROUP"
       WHERE gname=:gruppe );
 
 IF $RC<>0 THEN STOP(100,'Gruppe ' & gruppe & ' nicht gefunden ');
 erg := @gname & ':' & @passwd & ':' & @gid & ':';
 SQL ( SELECT gm (login) FROM "MDBA"."UGROUPMEMBERS" WHERE gname=:gruppe );
 IF $RC = 0 THEN
 BEGIN
  @i:=0;
  SQL ( FETCH FIRST gm INTO :@u );
  WHILE $RC=0 DO
  BEGIN
     IF @i=0 THEN erg := erg & @u
            ELSE erg := erg & ',' & @u;
     SQL (FETCH NEXT gm INTO :@u );
     @i:=@i+1;
  END
 END;
ENDMODULE
 
DBPROC MG.GETGROUPUID PARMS ( IN gid FIXED(6,0) , OUT erg VARCHAR(256) );
 
 SQL ( SELECT gname,passwd,gid INTO :@gname,:@passwd,:@gid
       FROM "MDBA"."UGROUP"
       WHERE gid=:gid );
 
 IF $RC<>0 THEN STOP(100,'BSGruppe ' & gid & ' nicht gefunden ');
 erg := @gname & ':' & @passwd & ':' & @gid & ':';
 SQL ( SELECT gm (login) FROM "MDBA"."UGROUPMEMBERS" WHERE gname=:@gname );
 IF $RC = 0 THEN
 BEGIN
  @i:=0;
  SQL ( FETCH FIRST gm INTO :@u );
  WHILE $RC=0 DO
  BEGIN
     IF @i=0 THEN erg := erg & @u
            ELSE erg := erg & ',' & @u;
     SQL (FETCH NEXT gm INTO :@u );
     @i:=@i+1;
  END
 END;
ENDMODULE
 
PROC MG.START
BEGIN
  WRITE CLEAR,'Gruppe ?';READ gruppe;
  WRITE NL;
  CALL DBPROC GETGROUP PARMS (gruppe,erg);
  WRITE erg,NL;
  WRITE PAUSE;
END
ENDMODULE
PCREATE MG.GETGROUP
PGRANT MG.GETGROUP TO BSAUTH
PCREATE MG.GETGROUPUID
PGRANT MG.GETGROUPUID TO BSAUTH
Leider gelang mir nicht erfolgreich, den gemeinsamen Teil der Prozeduren in eine extra Prozedur auszulageren und diese dann aufzurufen.
hosts.byname und hosts.byaddr
man könnte den Bind bzw. hesiod als Maptype bauen. first und next würden z.B. nur durch die eigene Domain laufen
yppasswd
Muß auch noch angepasst werden. Dazu muß z.B. der AdabasMap-Typ auch änderbar werden. Die Hierarchie der Dmap muß erweitert werden, daß es eine Schnittstelle gibt, die nur änderbar, aber nicht erzeugbar ist.

Rudolf Weber Informatik und Netzwerkverein Ravensburg e.V