DDL2HTML.ZIP (ca 380 KB)
Das vorliegende Dokument beschreibt die C-API. Remote Enscribe ist jetzt auch als Java-API erhältlich.
Remote Enscribe ist ein Produkt, das es C-Programmierern unter DOS, Windows (3.x, 9x, NT/2000/XP), OS/2 oder Unix/Linux erlaubt, von einem PC oder Unix-Client aus Dateizugriffe auf HP NonStop-Hosts auszuführen.
Remote Enscribe unterstützt die üblichen NonStop-Dateitypen (UNSTRUCTURED, EDIT, ENTRY-SEQUENCED, KEY-SEQUENCED, RELATIVE) und Zugriffsmethoden (READ, WRITE, READUPDATE, WRITEREAD, LOCK/UNLOCK.) Remote Enscribe unterstützt auch den Einsatz von TMF zur Transaktionskapselung.
Alle Zugriffe sind über Benutzer und Kennwort auf dem Host geschützt. Die Zugriffszeiten beim sequentiellen Lesen und Schreiben lassen sich durch Auswahl der Pufferung optimieren.
Sollen auch SQL-Tabellen bearbeitet werden, so ist das Produkt Remote SQL erforderlich. Dieses Produkt setzt allerdings C++ auf der Client-Seite voraus. Remote SQL enthält Remote Enscribe vollständig, unterstützt aber bisher noch nicht so viele Plattformen.
Die Verbindung zum NonStop-Host erfolgt über TCP/IP. Es ist in der LISTNER-Konfiguration lediglich ein neuer Dienst einzutragen, analog etwa zu FTP und das Programm ENSERV bzw. RSQLSRV ist zu installieren. Weitere Maßnahmen auf der Hostseite sind nicht notwendig.
Kopieren Sie ENSERV.BIN bzw RSQLSRV.BIN auf das NonStop-System im Binärformat und ändern Sie den Filecode auf 100. Dies kann mit folgenden FTP-Befehlen geschehen:
FTP nsk1 (User und Passwort) bin put a:\nonstop\enserv.bin $SYSTEM.UTIL.ENSERV,100
oder
put a:\nonstop\rsqlsrv.bin $SYSTEM.UTIL.RSQLSERV,100
Die LISTNER-Konfiguration ist in einer Edit-Datei gespeichert und heißt normalerweise PORTCONF. Fügen Sie die folgende Zeile hinzu:
741 $SYSTEM.UTIL.ENSERV
bzw.
741 $SYSTEM.UTIL.RSQLSRV
Ersetzen Sie dabei den Dateinamen durch den, den Sie dem Server bei der Installation gegeben haben. Die Zahl 741 ist die TCP-Portnummer. Sie kann auch anders gewählt werden. 741 ist der Standardwert.
Nach der Änderung müssen Sie den LISTNER-Prozess neu starten, genauso wie dies in der TCP/IP-Startphase Ihres Systems geschieht.
Auf der Clientseite wird ein TCP/IP-Stack benötigt (zum
Beispiel WINSOCK). Die Anbindung an die Client-Software erfolgt über
die Include-Datei renscrib.h
und eine linkbare
Bibliothek (LIB, OBJ und/oder DLL, je nach Plattform).
DDL2HTML ist eine Beispielanwendung für Remote ENSCRIBE, die kostenfrei zum
Download verfügbar ist. Das Programm wandelt ein DDL-Dictionary in einen HTML-Dateibaum um, der bequem mit einem Internetbrowser betrachtet werden kann. Als Beispiel können Sie hier das Ergebnis der Umwandlung des DDL-Schemas sehen.
NEU: DDL2HTML liegt jetzt für Linux und OS/2 vor.
Starten Sie das Programm DDL2HTML auf einer Kommandozeile:
DDL2HTML -uGROUP.USER -pPASSWORD nsk1:741 $SYSTEM.SYSDICT
Im aktuellen Verzeichnis wird jetzt das Dictionary in eine HTML-Dokumentation umgewandelt.
DDL2HTML gibt ohne Parameter eine kurze Anleitung aus.
Es folgt eine Liste der Funktionen, die der Programmierer nutzen
kann. Die Funktionen und Datentypen sind alle in der Include-Datei
renscrib.h
definiert.
Die Aufrufe sind an die C-stdio
-Funktionen angelehnt.
Alle unten aufgeführten Funktionen hinterlassen einen
Fehlercode in der Variablen errno
. Die Funktion
estrerror() erlaubt es, daraus einen
Fehlertext zu generieren.
HOST *econnect( char *hostname, int port, char *user, char *password );
Die Funktion öffnet eine Verbindung zum NonStop-System. Der TCP/IP-Server wird dabei vom LISTNER automatisch gestartet.
hostname
- IP-Name des NonStop-Systems oder die
IP-Adresse.
port
- TCP-Port für die Verbindung, wie er
in der LISTNER-Konfiguration eingetragen
wurde. Als Standardwert kann die Konstante RENSCRIB_PORT
verwendet werden.
user
- Benutzername auf dem NonStop-System, zum
Beispiel "SUPER.OPERATOR
".
passwort
- Kennwort des NonStop-Benutzers.
Ein Zeiger auf eine HOST
-Struktur. Dieser Zeiger wird
von einigen weiteren Aufrufen benötigt.
typedef struct _host { int is_connected; int socket; char volume[ 8+1+8+1+8+1 ]; /* "\1234567.$1234567.12345678" */ struct _efile *next_file; } HOST;
int edisconnect( HOST *host );
Die Funktion beendet die Verbindung zum NonStop-System und gibt alle Resourcen frei. Alle Dateien werden geschlossen.
host
- Zeiger auf eine gültige
HOST
-Struktur.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
EFILE *eopen( HOST *host, char *filename, char *access, int flags, int recsize );
Die Funktion öffnet eine Datei auf dem NonStop-System.
filename
- Name der NonStop-Datei im externen
Format.
access
- String, der die Zugriffsart ähnlich
wie bei fopen
aus stdio.h
regelt. Es ist
eine Folge von Zeichen mit folgenden Bedeutungen:
"r"
- Die Datei kann nur gelesen
werden, muß erstes Zeichen sein.
"w"
- Die Datei kann geschrieben
werden, muß erstes Zeichen sein. Dateien, die von den
C-Funktionen des NonStop-Servers bearbeitet werden können (EDIT,
UNSTRUCTURED) werden gelöscht.
"a"
- An die Datei können Daten
angehängt werden, muß erstes Zeichen sein. Dateiinhalte
bleiben bestehen.
"+"
- Die Datei kann gelesen und
geschrieben werden. Wird mit "w"
oder "a"
verwendet.
"t"
- Die Datei ist eine Textdatei.
Neue Dateien werden als EDIT-Dateien erzeugt.
"b"
- Die Datei ist eine Binärdatei.
Strukturierte Dateien lassen sich sinnvoll nur mit "ab+"
öffnen.
flags
- Eine Oder-Kombination von folgenden
Konstanten:
OPEN_EXCLUSIVE
oder OPEN_SHARED
-
Steuert den gemeinsamen Zugriff.
OPEN_BUFFERED
oder OPEN_BUFFERED_INPUT
oder OPEN_BUFFERED_OUTPUT
- Steuert die Datenpufferung
beim Lesen und/oder Schreiben. Die Pufferung beschleunigt das
sequentielle Lesen bzw. Schreiben ganz erheblich. Bei Fehlern kann
allerdings der betroffene Datensatz vom Programm nicht exakt
ermittelt werden.
OPEN_FORCE_UPDATE
- Erzwingt beim Fehler 10
(Satz existiert bereits) einen automatischen Update des Satzes.
Dies ermöglicht den Einsatz der Schreibpufferung, wenn mit
doppelten Sätzen gerechnet werden muß.
recsize
- Satzlänge, wird zur Zeit nicht
benutzt.
Ein Zeiger auf eine EFILE
-Struktur. Dieser Zeiger
wird bei allen Zugriffen auf die Datei benötigt.
typedef struct _efile { int is_open; int is_eof; int flags; HOST *host; unsigned short file; char *buffer; int buffer_type; int buffer_count; int buffer_pointer; char filename[ 35 ]; struct _efile *next_file; } EFILE;
int eclose( EFILE *file );
Die Funktion schließt die durch eopen
geöffnete Datei. Danach sind keine Zugriffe mehr möglich.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int eflush( EFILE *file );
Die Funktion leert die Puffer einer geöffneten Datei.
int eflushall( HOST *host );
Die Funktion leert die Puffer aller geöffneten Dateien einer Hostverbindung.
file
- Zeiger auf eine gültige
EFILE
-Struktur (eflush
.)
host
- Zeiger auf eine gültige
HOST
-Struktur (eflushall
.)
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int eread( EFILE *file, void *buffer, int maxlen, int lock_flag );
Die Funktion liest Daten aus einer göffneten Datei. Remote Enscribe führt keinerlei Interpretation der Daten durch. Die Umwandlung in PC-Konforme Datentypen ist Aufgabe der Anwendung. Damit verhält sich Remote Enscribe ähnlich wie das HP-Produkt RSC.
Wurde die Datei mit OPEN
oder
_
BUFFEREDOPEN
geöffnet, greift
Remote Enscribe nur dann auf das NonStop-System zu, wenn der 4096 Byte
große Puffer keine Daten mehr enthält. Bei einem Zugriff
wird der Puffer wieder komplett gefüllt. Tritt hierbei ein
Fehler auf, wird er an das Programm gemeldet, obwohl der eigentlich
zu lesende Satz gar nicht betroffen gewesen sein muß._
BUFFERED_INPUT
file
- Zeiger auf eine gültige
EFILE
-Struktur.
buffer
- Zieladresse für die Daten.
maxlen
- Die maximal zu lesende Satzlänge.
Bei strukturierten Daten oder Textdateien wir jeweils ein Record
oder eine Zeile gelesen. Es können nicht mehr als 4096 Bytes
auf einmal gelesen werden.
lock_flag
- READ_NOLOCK
oder
READ_LOCK
; bei READ_LOCK
wir der Satz
gesperrt und muß vom Programm selber mit den
Locking-Funktionen wieder freigegeben werden
Die gelesene Länge oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int ereadupdate( EFILE *file, void *buffer, int maxlen, int lock_flag );
Die Funktion funktioniert analog zu eread
benutzt auf dem NonStop-System aber die Systemfunktion READUPDATE
statt READ
. Die Pufferung wird nicht benutzt.
int ewrite( EFILE *file, void *buffer, int len );
Die Funktion schreibt einen Datensatz in eine geöffnete Datei.
Wurde die Datei mit OPEN_BUFFERDED
oder
OPEN_BUFFERED_OUTPUT
geöffnet, weden erst bis zu
4096 Bytes gespeichert, bevor die Daten an das NonStop-System
übertragen werden. Tritt beim Schreiben ein Fehler auf, ist
nicht mehr feststellbar bei welchen Satz das geschehen ist. Für
den speziellen Fall doppelter Sätze in strukturierten Dateien
erzwingt OPEN_FORCE_UPDATE
einen Update auf den
entsprechenden Satz. Ein Fehler wird dann nicht gemeldet.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
buffer
- Quelladresse für die Daten.
len
- Länge des Datensatzes. Es können
nicht mehr als 4096 Bytes auf einmal geschrieben werden.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int ewriteupdate( EFILE *file, void *buffer, int len, int unlock );
Die Funktion arbeitet analog zu ewrite, benutzt
aber die Systemfunktion WRITEUPDATE
statt WRITE
.
Die Pufferung wird nicht benutzt.
int ewriteread( EFILE *file, void *buffer, int writelen, int readlen );
Die Funktion kombiniert einen Schreib- mit einem Lesezugriff und ist für Prozesse oder Terminals gedacht. Die Pufferung wird nicht benutzt.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
buffer
- Quell- und Zieladresse für die
Daten.
writelen
- Länge des zu schreibenden
Datensatzes. Es können nicht mehr als 4096 Bytes auf einmal
geschrieben werden.
readlen
- Maximalänge der zu lesenden
Antwort. Es können nicht mehr als 4096 Bytes auf einmal gelesen
werden.
Die Länge der Antwort oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int eseek( EFILE *file, void *keyvalue, int keyspec, int keylen, int cmplen, unsigned mode );
Die Funktion positioniert den Schreib- und Lesezeiger einer strukturierten Datei mit einem primary oder alternate Key.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
keyvalue
- Zeiger auf den Wert des zu
vergleichenden Schlüssels.
keyspec
- Name des Schlüssels; 0 ist der
primary Key; Schlüsselbezeichner, die als Zeichenfolge
definiert sind, wie 'AB'
müssen als ('A' <<
8) | 'B'
angegeben werden.
keylen
- Die Länge des Schlüssels.
cmplen
- Die Länge des Vergleichswertes.
Die Bedeutung dieser Werte ist in den entsprechenden
HP-Handbüchern unter der Funktion KEYPOSITION
erläutert.
mode
- Einer der Werte SEEK_APPROXIMATE
,
SEEK_GENERIC
oder SEEK_EXACT
. Er kann mit
SEEK_SKIP
, SEEK_REVERSE
und SEEK_LOCK
Oder-verknüpft sein. Die Bedeutung der Werte finden Sie wieder
im HP-Handbuch. SEEK_LOCK
ist eine spezielle Remote
Enscribe-Eigenschaft: Die Funktion versucht nämlich bei
eingeschalteter Pufferung nach dem Positionieren direkt den
entsprechenden Satz zu lesen um ihn ohne zusätzlichen I/O dem
Programm mit dem nächsten Lesen präsentieren zu können.
SEEK_LOCK
erzwingt, daß dieses Lesen mit Locking
erfolgt.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
long elseek( EFILE *file, long value, unsigned mode );
Die Funktion positioniert mit Hilfe der Funktion POSITION
auf eine Byteposition innerhalb drer Datei. Bei Edit-Dateien erfolgt
die Positionierung mit der C-Funktion edlseek
auf das
tausendfache einer Zeilennummer.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
value
- Position bzw. Zeilennummer.
mode
- Einer der Werte SEEK_ABSOLUTE
,
SEEK_RELATIVE
oder SEEK_END
; Der Modus
wird an POSITION
übergeben.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
long eltell( EFILE *file );
Die Funktion liefert die Dateiposition einer geöffneten Datei zurück. Nicht alle Dateitypen unterstützen diese Funktion.
int elockfile( EFILE *file );
Die Funktion lockt eine komplette Datei.
int eunlockfile( EFILE *file );
Die Funktion gibt alle Locks einer Datei frei.
int eunlockrecord( EFILE *file );
Die Funktion den Locks auf den aktuellen Record einer Datei frei.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
int esetmode( EFILE *file, int code, int p1, int p2, int *pold );
Die Funktion führt einen SETMODE
-Aufruf durch.
int econtrol( EFILE *file, int code, int p1 );
Die Funktion führt einen CONTROL
-Aufruf durch.
file
- Zeiger auf eine gültige
EFILE
-Struktur.
code
- Funktionscode wie ihn HP definiert.
p1
- Erster Parameter.
p2
- Zweiter Parameter.
pold
- Zeiger auf Rückgabewerte für
die alten Parameter (2 Werte.)
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
char *epurge( HOST *host, char *filename );
Die Funktion löscht eine NonStop-Datei.
char *ecreate( HOST *host, char *filename, int type, int code, int recsize, int pext, int sext, int maxextents );
Die Funktion legt eine NonStop-Datei an. Es können einige
Parameter für strukturierte Dateien gesetzt werden. Primary oder
alternate Keys und partitionierte Dateien werden von dieser Funktion
nicht unterstützt. Benutzen Sie dazu die Werkzeuge auf dem
NonStop-System. Strukturierte Dateien werden als
ENTRY-SEQUENCED
-Dateien erzeugt.
host
- Zeiger auf eine gültige
HOST-Struktur
filename
- Ein NonStop-Dateiname im externen
Format.
type
- Einer der Werte TYPE_UNSTRUCTURED
,
TYPE_EDIT
oder TYPE_ENSCRIBE
.
code
- Der Dateicode der zu erzeugenden Datei.
recsize
- Die Satzlänge.
pext
- Die Größe des primary Extent.
sext
- Die Größe der secondary
Extents.
maxextents
- Die Anzahl der Extents.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
char *einfo( HOST *host, char *filename, FILEDATE *timestamp, long *size, int *code, int *type, int *recsize, char *security );
Die Funktion liefert einige Dateiattribute zurück.
- Zeiger auf eine gültige
host
HOST
-Struktur.
filename
- Ein NonStop-Dateiname im externen
Format.
timestamp
- Zeiger auf eine FILEDATE
-Struktur
mit dem Modification-Timestamp der Datei.
size
- Die Dateigröße (EOF.)
code
- Der Dateicode.
type
- Der Dateityp.
recsize
- Die Satzlänge der Datei.
security
- Die Sicherheitsinformation der Datei
als String ("NUNU"
.)
Der voll qualifizierte Dateiname.
typedef struct _filedate { int year; int month; int day; int hour; int minute; int second; } FILEDATE;
char *evolume( HOST *host, char *volume );
Die Funktion wechselt das Default-Volume für nicht voll qualifizierte Dateinamen. Nach dem Verbindungsaufbau gilt das Default-Verzeichnis des angemeldeten Benutzers.
host
- Zeiger auf eine gültige
HOST
-Struktur.
volume
- Standard-Volume als String.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
short *econtime( HOST *host, char *timestamp, short *result );
Die Funktion rechnet einen 48-Bit-Timestamp in einen Array von Zahlen
um, die das Datum in Jahre bis Bruchteilen einer Sekunde darstellen.
Es wir der CONTIME
-Aufruf des NonStop-Systems benutzt.
host
- Zeiger auf eine gültige
HOST
-Struktur.
timestamp
- Zeiger auf einen 48-Bit-Timestamp (6
Byte.)
result
- Array von 7 short
-Werten
für das Ergebnis.
Zeiger auf result
. Bei Fehlern NULL.
int etransact( HOST *host, int type );
Die Funktion steuert TMF-Transaktionen. Zu jeder Hostverbindung kann eine Transaktion offengehalten werden.
host
- Zeiger auf eine gültige
HOST
-Struktur.
type
- Einer der Werte TT_BEGIN
,
TT_COMMIT
oder TT_ROLLBACK
; Steuert die
Art des Transaktionsbefehls.
OK
oder NOT_OK
. Bei NOT_OK
steht die Fehlernummer in errno
.
char *estrerror( int error );
Die Funktion liefert einen Text zu einer Fehlernummer. Dieser wird
bei NonStop-Fehlern durch Aufruf des Programmes ERROR
ermittelt und kann mehrere Zeilen enthalten.
error
- Fehlercode zum Beispiel aus errno
.
NonStop-Fehler haben einen Offset von ERR_GUARDIAN
(20000). Die Fehler END_OF_FILE
, ERR_DUPLICATE_KEY
,
ERR_NOT_FOUND
und ERR_IN_USE
sind
vordefiniert.
Zeiger auf den Fehlertext.
int eloaddef( char *cmd );
Defines der Form "=NAME" können mit dieser Methode gesetzt werden. Das Argument ist ein Befehl aus folgender Liste:
DELETE DEFINE ** |
Alle Defines löschen. |
DELETE DEFINE =<name> |
Einzelnes Define löschen. |
ADD DEFINE =<name>, <attribut> <wert>, ... |
Define hinzufügen (oder ändern, wenn es existiert). |
ALTER DEFINE =<name>, <attribut> <wert>, ... |
Define ändern. |
[OBEY] <Dateiname> |
Die Befehle in <Dateiname> auf dem Host werden ausgeführt. Sie müssen der obigen Syntax folgen. Der Befehl OBEY kann auch weggelassen werden. OBEY kann auch rekursiv in der Datei vorkommen. |
LOADINFO <Dateiname> |
Analysiere die Ausgabe des TACL-Befehls |
TACL <Befehl> |
Der Befehl wird (via system) ausgeführt. Danach wird ein INFO DEFINE Befehl abgesetzt und dessen Ausgabe wie oben analysiert. Das erlaubt zum Beispiel die Verwendung von TACL-Segment-Files. |
Die Methoden zum Öffnen und Lesen von Dateien erlauben die
Verwendung von zwei Pseudo-Dateien: $DEFINES$
zum Lesen
der aktuell gesetzten Defines und $FILES$
zum Lesen von
Datei- oder Prozessnamen. Die Zeilen sind mit Linefeed getrennt.
Datei |
Beispielausgabe (1. Zeile ist Kommentar) |
---|---|
|
<----- Name (24) ------> <Klasse> <Attri> <----------- Wert (34) ----------> =CTYPEH MAP FILE \GZE.$SYSTEM.SYSTEM.CTYPEH =GNSCTLG CATALOG SUBVOL \GZE.$DEV06.GNSCTLGL |
|
<----------- Name (34) ----------> DevTyp SubDev ObjTyp FilTyp FilCod \GZE.$DEV03.CUBERSQL.TESTFILE 3 39 0 2 7890 \GZE.$DEV03.CUBERSQL.TESTIN 3 39 0 0 101 \GZE.$DEV03.CUBERSQL.TESTTAB 3 39 2 3 0 |
Die Informationen können mit Hilfe der eseek-Methode eingeschränkt werden.
Datei |
Key-Specifier |
Bedeutung |
---|---|---|
|
DEFINES_KEY_NAME |
Der Define-Name muss mit den Key anfangen. |
|
DEFINES_KEY_CLASS |
Der CLASS-Name muss mit den Key anfangen. |
|
DEFINES_KEY_ATTR |
Der Attribut-Name muss mit den Key anfangen. |
|
DEFINES_KEY_VALUE |
Der Attribut-Wert muss mit den Key anfangen. |
|
0 |
Der Key hat mehrere Felder, die durch Space, Tab oder die folgenden Zeichen getrennt werden: ",;:".
Ein "*" setzt den Default. Parameter am Ende können weggelassen werden. Die Parameter 3 und 4 können mit "~" anfangen, um sie zu negieren. Die Parameter 5 bis 7 erlauben einen Vergleichsoperator: "=~<>". Beispiel: " |
int esystem( char *command );
Diese Methode erlaubt die Ausführung beliebiger TACL-Kommandos.
Der Implementierung liegt die Funktion system
der
C-Bibliothek zugrunde. Diese startet beim ersten Aufruf einen
TACL-Prozess mit $RECEIVE
als IN und ohne
OUT-File. Dieser TACL startet weder TACLLOCL
noch
TACLCSTM
, sie können dies aber selber nachholen.
Dem Prozess werden dann alle weiteren system
-Aufrufe
übergeben.
Es bietet sich an, alle Programme mit expliziter OUT-Datei zu starten und diese Datei dann per API zu lesen.