Um Bibliotheken zu bearbeiten, müssen sie zuerst zugewiesen werden. Erst nach dem erfolgreichen Zuweisen können Elemente aufgenommen und/oder bearbeitet werden.
In LMS-Anweisungen werden Bibliotheken durch den Operanden LIBRARY angegeben. Es gibt mehrere Möglichkeiten eine Bibliothek zuzuordnen, die letztlich direkt oder indirekt auf PLAM-Bibliotheken führen:
Global vereinbarte Bibliothek (*STD)
Direkter Name einer PLAM-Bibliothek
Indirekt über Linkname
Bibliotheksliste (Variable "SYSPLAMALT-")
Typumlenkung (Variable "SYSPLAMLIB.")
Die global vereinbarte Bibliothek wird durch OPEN-LIBRARY zugewiesen und durch CLOSE-LIBRARY auf undefiniert zurückgesetzt. Die Möglichkeiten 2-5 können zur Vereinbarung der globalen Bibliothek genutzt werden.
Bibliothekslisten ermöglichen die Verwendung von alternate libraries bei Bibliotheksangaben. Eine Bibliotheksliste ist eine Liste, die anzeigt, welche Bibliotheken in welcher Reihenfolge nach einem Element durchsucht werden sollen. Auf Bibliothekslisten kann nur lesend zugegriffen werden. Eine Variable "SYSPLAMALT-" definiert eine Bibliotheksliste (ALT für ALTernate library).
Mittels Typumlenkung kann ein Standardtyp auf einen Benutzertyp umgelenkt werden. Damit können existierende Programme, die keine Benutzertypen erlauben, auch Benutzertypen nutzen. Eine Variable "SYSPLAMLIB." definiert eine Typumlenkung. Die Typumlenkung ist ein zentraler Mechanismus, der in allen Kommandos, unabhängig von LMS, verwendet werden kann.
Die LMS-Anweisung SHOW-LIBRARY-STATUS gibt Auskunft über den Zustand der zu bearbeiteten Bibliotheken.
Direkter Name einer PLAM-Bibliothek
Der angegebene Dateiname bezeichnet eine PLAM-Bibliothek. Diese Angabe wird beim Arbeiten mit LMS häufig benutzt. Normalerweise bezeichnet der angegebene Dateiname auch wirklich eine Datei. Es gibt aber folgende Ausnahmen:
der Dateiname beginnt mit "SYSPLAMALT-" und eine gleichnamige S-Variable existiert: es liegt eine Bibliotheksliste vor (siehe "Zuweisen von Bibliotheken")
der Dateiname beginnt mit "SYSPLAMLIB." und eine gleichnamige S-Strukturvariable existiert: es liegt eine Typumlenkung vor (siehe "Zuweisen von Bibliotheken")
Indirekt über Linkname
Der unter *LINK angegebene Name <link> bezeichnet einen Linknamen. Im Allgemeinen ist der Name ein durch /ADD-FILE-LINK vereinbarter Dateikettungsname, dem eine PLAM-Bibliothek zugeordnet ist. Hiervon gibt es folgende Ausnahme:
eine S-Strukturvariable SYSPLAMLIB.<link> existiert: es liegt eine Typumsteuerung vor (siehe dort)
Beispiele
Zuweisen einer globalen Bibliothek durch OPEN-LIBRARY
Eine Bibliothek wird als globale Bibliothek eröffnet, wenn sie durch die LMS-Anweisung OPEN-LIBRARY zugewiesen wird.
Es ist nur eine globale Bibliothek pro LMS-Lauf möglich. Wird durch eine zweite OPEN-LIBRARY-Anweisung eine neue globale Bibliothek eröffnet, wird die erste globale Bibliothek durch ein LMS-internes CLOSE geschlossen und die neue Bibliothek als globale Bibliothek betrachtet.
Eine globale Bibliothek kann bereits bestehen oder neu eingerichtet werden. Wird eine Bibliothek neu eingerichtet, muss sie mit MODE=*UPDATE erzeugt werden.
Eine globale Bibliothek wird standardmäßig nur zum Lesen eröffnet. Soll sie zum Lesen und Schreiben eröffnet werden, muss der Operand MODE=*UPDATE in der OPEN-LIBRARY-Anweisung gesetzt werden.
In den LMS-Anweisungen wird eine globale Bibliothek mit LIBRARY=*STD angesprochen. Dieser Wert ist dort standardmäßig vorgegeben, so dass keine explizite Bibliotheksangabe mehr nötig ist.
/START-LMS
//WRITE-COMMENT 'Eröffnen einer globalen Bibliothek zum Lesen und Schreiben'
//OPEN-LIBRARY LIBRARY = global-lib, MODE = *UPDATE
.
.
//WRITE-COMMENT 'Inhaltsverzeichnis der globalen Bibliothek anzeigen'
//SHOW-ELEMENT-ATTRIBUTES
..
Zuweisen einer globalen Bibliothek über ihren Dateikettungsnamen
Eine globale Bibliothek kann auch mit ihrem Dateikettungsnamen zugewiesen werden. Bei der Verwendung des Dateikettungsnamens muss jedoch vor dem Aufruf von LMS ein /ADD-FILE-LINK-Kommando gegeben werden, das die Verbindung zum Dateinamen der Bibliothek herstellt.
/ADD-FILE-LINK FILE-NAME = global-lib, LINK-NAME = testlib
/START-LMS
//WRITE-COMMENT 'Eröffnen einer globalen Bibliothek über Dateikettungsnamen'
//OPEN-LIBRARY LIBRARY = *LINK(LINK-NAME = testlib)
. .
Zuweisen einer lokalen Bibliothek in einer Anweisung
Durch die Angabe einer Bibliothek in der Datenstruktur *LIBRARY-ELEMENT werden mit dem Operanden LIBRARY Bibliotheken anweisungslokal vereinbart. Sie gelten nur für diese Anweisung.
/START-LMS
//WRITE-COMMENT 'Beispiel für das Zuweisen einer lokalen Bibliothek '
//WRITE-COMMENT ' in der Anweisung EDIT-ELEMENT '
. .
//EDIT-ELEMENT *LIBRARY-ELEMENT(LIBRARY = local-lib, ELEMENT = test)
. .
Zuweisen einer lokalen Bibliothek über ihren Dateikettungsnamen
Eine lokale Bibliothek kann auch mit ihrem Dateikettungsnamen zugewiesen werden. Bei der Verwendung des Dateikettungsnamens muss jedoch vor dem Aufruf von LMS ein /ADD-FILE-LINK-Kommando gegeben werden, das die Verbindung zum Dateinamen der Bibliothek herstellt.
/ADD-FILE-LINK FILE-NAME = lokal-lib, LINK-NAME = testlib
/START-LMS .
//WRITE-COMMENT 'Eröffnen einer lokalen Bibliothek über Dateikettungsnamen'
//WRITE-COMMENT ' in der Anweisung EDIT-ELEMENT '
.
//EDIT-ELEMENT (LIBRARY = *LINK(LINK-NAME = testlib), ELEMENT = test)
.
.
Zuweisen einer Bibliothek aus einer Liste
Bibliothekslisten ermöglichen die Verwendung von alternate libraries bei Bibliotheksangaben. Die Reihenfolge der alternate libraries in der Bibliotheksliste bestimmt, in welcher Reihenfolge Bibliotheken nach Elementen durchsucht werden.
Wenn ein Element in einer Bibliotheksliste gesucht wird, arbeitet PLAM die Liste ab, um zunächst ein Element mit dem gewünschten Typ und Namen zu finden. Die Bibliotheken in der Bibliotheksliste werden dabei der Reihe nach durchsucht, bis der angegebene Elementname mit dem zugehörigen Elementtyp gefunden wird. Das heißt, gibt es mehrere Bibliotheken in der Liste, die Elemente mit gleichem Typ und Namen enthalten, wird das Element stets in der ersten davon gefunden; diese Bibliothek ist die Trefferbibliothek.
Die Versionsangabe zum Element bestimmt, welche Elementversion aus der Trefferbibliothek ausgewählt wird. Damit überdeckt eine Elementversion in einer Bibliothek alle Elementversionen in später genannten Bibliotheken, wodurch der Auswahlvorgang leicht nachvollziehbar ist (siehe Beispiel "Zuweisen von Bibliotheken")
Auf Bibliothekslisten kann nur lesend zugegriffen werden. Eine Bibliotheksliste wird über eine S-Variable definiert. Die Variable hat den Typ String und der Name beginnt mit 'SYSPLAMALT-' (ALT für ALTernate library). Der Variableninhalt wird wie folgt gesetzt:
SYSPLAMALT-<name> = '(<lib>,<lib>,...)'
<name>: | Rest des Variablenbezeichners |
<lib>: | Bibliotheksangabe |
Wird als Name der Bibliotheksliste ein Dateiname ":Catid:$Userid.SYSPLAMALT-" angegeben, werden Catid und Userid ignoriert. Namen, die mit 'SYS' beginnen, sind für zukünftige Entwicklung reserviert. Kleinbuchstaben im Inhalt der Variablen "SYSPLAMALT-" werden als Großbuchstaben interpretiert.
Bibliothekslisten sind einstufig; das heißt, Angaben in der Bibliotheksliste werden immer als PLAM-Bibliotheken oder Typumsteuerungen aufgefasst. Alle Bibliotheken in der Liste müssen vorhanden sein.
Hinweis
Auf Bibliothekslisten kann nur lesend zugegriffen werden, d.h. spezifiziert der Operand LIBRARY eine Ausgabebibliothek, ist keine Bibliotheksliste erlaubt. Bei Bibliothekslisten dürfen keine Wildcard-Angaben verwendet werden.
Beispiel
Mit Bibliothekslisten kann die make-Funktionalität komfortabel für Projekte verwendet werden, bei denen Sourcen mit dem Ausleihmechanismus verwaltet werden. Die Sourcen befinden sich in einer der Bibliotheken LIB.LOCAL oder $GLOBAL.LIB. Mit dem Ausleihmechanismus wird zwischen diesen beiden Bibliotheken hin und her kopiert. Im Makefile wird SYSPLAMALT-HUGO direkt als einzige Source-Bibliothek angegeben. Der Inhalt von SYSPLAMALT-HUGO bestimmt, welche Bibliotheken durchsucht werden sollen.
Die Bibliotheken haben folgende Inhalte:
Zusammenfassen der Bibliotheken LIB.LOCAL und $GLOBAL.LIB für den lokalen Make-Lauf:
/set-variable sysplamalt-hugo = '(lib.local,$global.lib)'
Es wird A.C aus LIB.LOCAL berücksichtigt, B.C aus $GLOBAL.LIB.
Bei zentralem Make-Lauf enthält SYSPLAMALT-HUGO nur eine Bibliothek:
/set-variable sysplamalt-hugo = '($global.lib)'
Es werden nur bereits wieder zurückgegebene Sourcen A.C und B.C aus $GLOBAL.LIB berücksichtigt. Die Anweisungen für Make sind in beiden Fällen die gleichen:
//modify-make-defaults library=sysplamalt-hugo
Gültigkeit von globalen und lokalen Bibliotheken
Eine globale Bibliothek gilt solange für den gesamten LMS-Lauf, bis entweder eine neue globale Bibliothek eröffnet wird oder die Bibliothek durch eine explizite CLOSE-LIBRARY-Anweisung geschlossen wird.
Wird zudem eine lokale Bibliothek eröffnet, dann ist diese nur innerhalb dieser Anweisung gültig. Nach Beendigung dieser Anweisung gilt wieder die globale Bibliothek.
Die LMS-Anweisung SHOW-LIBRARY-STATUS (siehe "SHOW-LIBRARY-STATUS Zustand der Bibliotheken anzeigen") gibt Auskunft über den Zustand der Bibliotheken.
Arbeiten mit mehreren Bibliotheken
Es kann immer nur eine globale Bibliothek zugewiesen werden. Soll gleichzeitig mit zwei Bibliotheken gearbeitet werden, muss die zweite Bibliothek lokal vereinbart werden.
Werden im LMS-Lauf mehrere Bibliotheken global zugewiesen (durch mehrere OPEN-LIBRARY-Anweisungen), verwendet LMS die zuletzt angegebene Bibliothek.
Beispiel
Das Element xyz, das sich in der Bibliothek lib1 befindet, wird in die bereits existierende Bibliothek lib2 kopiert. Es soll lib1 als globale Bibliothek und lib2 als lokale Bibliothek benutzt werden. Nachdem nach dem Aufruf von LMS der Elementtyp noch nicht definiert ist, wird er als globaler Elementtyp S vereinbart. Das Element soll nicht umbenannt werden:
/START-LMS . . //MODIFY-LMS-DEFAULTS TYPE = S //OPEN-LIBRARY LIBRARY = lib1 //COPY-ELEMENT ELEM = *LIB-ELEM(,xyz), TO-ELEM = *LIB-ELEM = (LIBRARY = lib2) . . |
Umlenkmechanismus
Der Benutzer kann neben den Standard-Elementtypen eigene, von ihm definierte Elementtypen verwenden. Diese benutzerdefinierten Typen sollten von einem Standardtyp abgeleitet sein, d.h. für den einstelligen Standardtyp werden als Synonym ein oder mehrere aussagekräftige Namen definiert (z.B. COBSRC, ASSSRC, ...).
Programme, die nicht auf benutzerdefinierte Typen vorbereitet sind, können trotzdem mit diesen Elementen arbeiten. PLAM bietet einen Umlenkmechanismus an, um auf Bibliotheken mit benutzerdefinierten Elementtypen zugreifen zu können. Alle Kommandos und Programme in BS2000/OSD können die Typumlenkung benutzen.
Der Umlenkmechanismus ist durch die S-Variable SYSPLAMLIB realisiert. Sie ist eine Variable vom Typ Struktur. Ihre Strukturelemente bestimmen, was umgelenkt und wohin umgelenkt wird.
Der Name des Strukturelements bestimmt das Was,
der Inhalt des Strukturelements das Wohin.
Der Name des Strukturelements setzt sich zusammen aus dem Dateikettungsnamen und dem benutzerdefinierten Elementtyp.
Der Inhalt des Strukturelements setzt sich zusammen aus
dem Bibliotheksnamen und dem Elementtyp oder
dem Dateikettungsnamen und dem Elementtyp.
Wird kein Elementtyp angegeben, gilt der Wert des Elementtyps aus dem Namen des Strukturelements.
Die S-Variable SYSPLAMLIB, in Form einer Variablenzuweisung geschrieben, hat folgenden Aufbau:
SYSPLAMLIB.<link>.<utype>= ́<libname>(TYPE=<typename> / *SAME) ́
oder
SYSPLAMLIB.<link>.<utype>= ́*LINK(LINK=<linkname>,TYPE=<typename> / *SAME) ́
| Dateikettungsname in der Form <structured-name1..8> benutzerdefinierter Elementtyp in der Form <alphanum-name1..8> |
| Elementtyp in der Form <alphanum-name1..8> |
| Bibliotheksname Dateikettungsname in der Form <structured-name1..8> Der Elementtyp des Inhalts des Strukturelements ist der gleiche wie |
Der Inhalt der S-Variablen ist ein String, der eine Bibliotheks- und eine Typkomponente enthält, die die reale Bibliotheksumgebung widerspiegelt. TYPE=*SAME im Variableninhalt bedeutet <utype>. Die Bibliothekskomponente darf keine Bibliotheksliste sein.
Der Zugriff über die S-Variable SYSPLAMLIB kann auf zwei Arten erfolgen:
Angabe einer Bibliothek über den Dateinamen SYSPLAMLIB.<link>
Angabe über den Dateikettungsnamen <link>
Ist SYSPLAMLIB als Variable mit SCOPE=*VISIBLE oder =*TASK deklariert, wird der Inhalt des Strukturelements ausgewertet und in die entsprechende Bibliothek umgelenkt.
Beispiel
COBOL-Sourcen vom Elementtyp COBSRC sollen übersetzt werden. Sie stehen in der Bibliothek MY.COBLIB, die durch den Dateikettungsnamen SRCLIB bestimmt ist. Die Copy-Elemente sollen vom Typ COBCOPY sein und ebenfalls in der Bibliothek MY.COBLIB stehen.
/DECLARE-VARIABLE SYSPLAMLIB(TYPE=*STRUCTURE),SCOPE=*TASK ————————————— (1) /SET-VARIABLE SYSPLAMLIB.SRCLIB.S = ́MY.COBLIB(COBSRC) ́ ——————————————— (2) /SET-VARIABLE SYSPLAMLIB.COBLIB.S = ́MY.COBLIB(COBCOPY) ́ —————————————— (3) /ADD-FILE-LINK FILE-NAME=SYSPLAMLIB.SRCLIB,LINK=SRCLIB ———————————————— (4) /ADD-FILE-LINK FILE-NAME=SYSPLAMLIB.COBLIB,LINK=COBLIB /MODIFY-JOB-SWITCHES ON=1 /ASSIGN-SYSDTA *SYSCMD /ASSIGN-SYSLST #L /START-EXECUTABLE-PROGRAM COBOL85 COMOPT SOURCE-ELEMENT=LMSCOBS COMOPT SOURCE-VERSION=399 COMOPT MODULE=MY.COBLIB COMOPT SYSLST=(DIAG,MAP,SOURCE) END /STEP /MODIFY-JOB-SWITCHES OFF=1 /EXIT-PROC
(1) | Deklarieren der zentralen S-Variablen (mit Scope Task) |
(2) | Setzen der Umlenkung:über den Kettungsnamen SRCLIB oder den Dateinamen SYSPLAMLIB.SRCLIB wird die Umlenkung wirksam. Wenn z.B. vom Cobol-Compiler auf den Typ S zugegriffen wird, wird dies PLAM-intern auf den Typ COBSRC abgebildet. |
(3) | Die Copy-Elemente werden wie unter (2) auf den Typ COBCOPY abgebildet. |
(4) | Der Dateikettungsname SRCLIB wird mit einer tatsächlich vorhandenen Bibliothek SYSPLAMLIB.SRCLIB gekoppelt. Das ist notwendig, wenn Programme dezentral das Vorhandensein der Bibliothek testen. |
Nach SYSPLAMLIB.SRCLIB.S = ́MY.COBLIB(COBSRC) ́ entsteht folgende Situation:
Nur auf die Elemente vom Typ COBSRC kann zugriffen werden und nicht auf alle in der Bibliothek vorhandenen. Der Zugriff erfolgt über den Elementtyp S und bei Programmausgaben wird anstelle des „echten“ Typs COBSRC der Typ S verwendet.
In der Bibliothek MYCOPY werden Elemente mit dem Elementtyp COBCOPY gehalten. In einem LMS-Lauf sollen sie mit dem Elementtyp S bezeichnet werden. Zur Umgehung von LMS-Prüfungen muss die Bibliothek SYSPLAMLIB.COBLIB vorhanden sein.
/DECLARE-VARIABLE SYSPLAMLIB(TYPE=*STRUCTURE) /SET-VARIABLE SYSPLAMLIB.COBLIB.S = ́MYCOPY(COBCOPY) ́ /ADD-FILE-LINK SYSPLAMLIB.COBLIB,LINK=COBLIB /START-LMS //SHOW-ELEM-ATTR *LIB(SYSPLAMLIB.COBLIB) "Alle Elemente vom Typ COBCOPY aus MYCOPY werden angezeigt. Typ S wird protokolliert." //SHOW-ELEM-ATTR *LIB(SYSPLAMLIB.COBLIB,*ALL(*ALL),COBCOPY) "Kein Treffer (der Typ COBCOPY existiert nicht in der Benutzersicht)" //SHOW-ELEM-ATTR *LIB(SYSPLAMLIB.COBLIB,*ALL(*ALL),S) "Alle Elemente vom Typ COBCOPY aus MYCOPY werden angezeigt." //SHOW-ELEM-ATTR (*LINK(COBLIB)) "Alle Elemente vom Typ COBCOPY aus MYCOPY werden angezeigt. Typ S wird protokolliert." //END