tdbengine -
news vom 18.12.1999
Seit Sonntag, dem 19.12.1999, liegt nun eine neue Version der tdbengine
im Download-Bereich.
Zusätzlich gibt es ein kleines Demoprojekt: das Vogel-Archiv der
guten alten WinTDB.
Hier ein kurzer Überblick über die Änderungen gegenüber
der Vorgängerversion:
Neue und geänderte Funktionen
CGIExec(commandline : STRING [; s_timeout : REAL]) : REAL
(Änderung der Syntax, modifizierte Arbeitsweise)
Diese Funktion führt ein externes Programm aus.
Der Parameter s_timeout wird (vorläufig) nur unter Win9x / WinNT
ausgewertet.
Das aufgerufene Programm wird komplett ausgeführt und gibt dann
die Kontrolle an das CGI-Programm zurück.
In diesem Fall liefert die Funktion das Ergebnis 0, in allen anderen
Fällen den Fehlercode des Betriebssystems.
Das aufgerufene Programm erhält die Ein- und Ausgabeströme
des CGI-Programms. Deshalb sollte vor der Ausführung
die Ausgabe-Pufferung beendet werden (da das externe Programm nicht
in den tdbengine-Puffer schreiben kann).
Besonderheiten
Win9x, WinNT:
Das Programm wird direkt gestartet. Mit s_timeout kann die maximal verfügbare
Zeit (in Sekunden) angegeben werden.
Wird dann das Programm vorzeitig abgebrochen, ist der Funktionswert
-1.
Wird für s_timeout der Wert -1 angegeben, so wird das Programm
zwar komplett ausgeführt, die Ausgabe jedoch unterdrückt.
Diese Vorgegensweise ist der Ausgabeumleitung in jedem Fall vorzuziehen.
Die Rechte des ausgeführten Programms werden aus den Rechten des
Internet-Klienten abgeleitet.
Beispiel:
richtig: (pkzip25.exe befindet sich in /home/tdbengine/)
CGICloseBuffer .. Puffer leeren
CGIWrite('<pre>') .. Ausgabe entsprechend Bildschirm
CGIExec('pkzip25.exe -add backup.zip *') .. zeigt die gesamte Liste
CGIWriteLn('</pre>') .. und erzeugt backup.zip im CGI-Verzeichnis
richtig: (cmd.exe befindet sich in /home/tdbengine/)
...
CGIExec('cmd.exe /c set') .. zeigt das gesamte Environment
falsch: (cmd.exe und pkzip25 befinden sich in /home/tdbengine/)
...
CGIExe('cmd.exe /c pkzip25.exe -add backup.zip * > nul') .. erzeugt
backup.zip ohne Ausgabe
richtig: (pkzip25.exe befindet sich in /home/tdbengine/)
CGIExec('pkzip25.exe -add backup.zip *',-1) .. erzeugt backup.zip
ohne Ausgabe
Einschränkung: CGIExec kann (zumindest problemlos)
nur echte 32-Bit Anwendungen ausführen.
Linux:
Die commandline von CGIExec wird an die Shell des Internet-Klienten
mit dessen Rechten übergeben.
Hinweis: Hier ist die Ausgabeumleitung der empfohlene Weg, die Ausgaben
des aufgerufenen Programms zu unterdrücken.
Beispiel:
CGICloseBuffer .. Puffer leeren
CGIWrite('<pre>') .. Ausgabe entsprechend Bildschirm
CGIExec('set') .. zeigt das gesamte Environment
CGIWriteLn('</pre>')
..
CGIExec('tar -cz -fbackup.tar.gz *') .. erzeugt das Archiv backup.tar.gz
mit Ausgabe
..
..
CGIExec('tar -cz -fbackup.tar.gz * > /dev/zero') .. erzeugt das
Archiv backup.tar.gz ohne Ausgabe
..
Hinweis:
Sie sollten CGIExec immer mit besonderer Vorsicht einsetzen.
Unterbinden Sie durch geeignete Semaphoren gleichzeitige Aufrufe (vor
allem bei Archivierungsprogrammen).
Bedenken Sie, daß jeder CGI-Prozess nur eine beschränkte
Zeit zur Verfügung hat (im http-Server einstellbar).
VarName(VAR x) : STRING
(neue Funktion)
Diese Funktion liefert der Deklarationsnamen der Variablen x. Damit
kann man recht schöne Sachen machen, wie zum Beispiel eine Menge Code
einsparen.
Beispiel:
Gut:
VARDEF Name, Vorname, Strasse, PLZ, Ort : STRING
...
Name:=CgiGetParam("Name")
Vorname:=CgiGetParam("Vorname")
...
Besser:
VARDEF Name, Vorname, Strasse, PLZ, Ort : STRING
...
Name:=CgiGetParam(VarName(Name))
Vorname:=CgiGetParam(VarName(Vornam))
...
Noch besser:
VARDEF Name, Vorname, Strasse, PLZ, Ort : STRING
...
PROCEDURE CgiGetVar(VAR x : STRING)
x:=CgiGetParam(VarName(x))
ENDPROC
...
CgiGetVar(Name)
CgiGetVar(Vorname)
....
TestSel(selection : STRING) : REAL
(neue Funktion)
Liefert 0, wenn es sich bei dem Argument um eine gültige Selektion
handelt, andernfalls der tdbengine-Fehlercode.
Diese Funktion ist praktisch, wenn dem Anwender eine Selektionseingabe
gestattet wird. Beispiel: Siehe dmk.mod.
SetCGILog(msg : STRING) : REAL
(neue Funktion)
Mit dieser Funktion kann man die tdbengine veranlassen, einen erweiterten
Log-Eintrag zu schreiben. Die genaue Diskussion erfolgt im Kapitel Debugging.
Der Rückgabewert ist immer 0.
SetFields(replacestr : STRING) : REAL
(neue Funktion)
Diese Funkion erlaubt das Setzen von Feldinhalten der Form: "Feld:=Ausdruck,Feld:=Ausdruck..."
Der Funktionswert ist 0, wenn alle Feldzuweisungen gültig sind,
andernfalls der Fehlercode. Beispiel siehe dmk.mod.
CGIBuffer(mode : REAL) : REAL
(neue Funktion)
Mit dieser Funktion kann man die Pufferung der CGI-Ausgabe ein- und
ausschalten. Nicht zu verwechseln mit CGICloseBuffer.
CGIBuffer gibt den bisherigen Pufferinhalt nicht aus (im Gegensatz
zu CGICloseBuffer) und wirkt sich demnach nur auf die folgenden Schreiboperationen
aus.
CGIBuffer(0) -> keine Pufferung
CGIBuffer(1) -> Ausgaben werden gepuffert.
Hinweis: Normalerweise ist die Pufferung der Ausgabe aus Performancegründen
immer eingeschaltet. Der Puffer umfaßt 64 kByte.
SetIdent(IniFile,Indentifier,Value : STRING) : REAL
(neue Funkion)
Mit dieser Funktion kann in einer bestehenden Ini-Datei ein neuer Wert
gesetzt werden, ohne dass hierfür die Datei komplett neu geschreiben
werden muß. Sie bildet demnach das Gegenstück zu GetIdent. Mit
diesen beiden Funktionen werden Textdateien der folgenden Form bearbeitet:
[Gruppe_1]
Bezeichner_1=Wert_1
Bezeichner_2=Wert_2
...
[Gruppe_2]
Bezeichner_1=Wert_1
Bezeichner_2=Wert_2
...
GetIdent(Inifile,'Gruppe_1.Bezeichner_1') liefert Wert_1
SetIdent(Inifile,'Gruppe_1.Bezeichner_1','Neuer Wert') führt zu
folgendem Eintrag
[Gruppe_1]
Bezeichner_1=Neuer Wert
Bezeichner_2=Wert_2
...
SetIdent(Inifile,'Gruppe_1.Bezeichner_3','Neuer Wert') führt zu
folgendem Eintrag
[Gruppe_1]
Bezeichner_1=Wert_1
Bezeichner_2=Wert_2
Bezeichner_3=Neuer Wert
SetIdent(Inifile,'Neue_Gruppe.Bezeichner_1','Neuer Wert') führt
zu folgendem Eintrag
[Gruppe_1]
Bezeichner_1=Wert_1
Bezeichner_2=Wert_2
...
[Gruppe_2]
Bezeichner_1=Wert_1
Bezeichner_2=Wert_2
...
[Neue_Gruppe]
Bezeichner_1=Neuer Wert
Der neu gesetzte Wert ist sofort gültig, ein Aufruf von GetIdent(....)
liefert also immer den aktuellsten Wert .
Achtung: Setdent führt kein File-Locking durch, sondern liest den
beim Aufruf aktuellen Stand der Datei.
Hinweis: Inidateien sind ein höchst komfortabler und effizienter
Weg zur Verwaltung von nicht-relationalen Daten wie Systemdateien etc.
Der Zugriff auf die einzenen Bezeichner (Idents) erfolgt extrem schnell:
Eine Inidatei wird nur beim ersten Aufruf gelesen, dabei werden sämtliche
darin enthaltenen Informationen in einer sehr schnellen (Baum-)Suchstruktur
abgelegt.
GetEnv(Name : STRING) : STRING
(erweiterte Funktion)
GetEnv liefert bekanntermaßen den Wert der Environment-Variablen
mit dem angegebenen Namen.
Neu ist, dass nach jedem Aufruf ein Ramtext mit dem Namen "ramtext:environment"
zur Verfügung steht, der ebenfalls die Environmentvariable enthält.
Damit kann auch auf Einvironment-Variablen zugriffen werden, deren Inhalt
255 Zeichen übersteigt.
Beispiel:
CgiCloseBuffer
CgiWrite("<pre>")
GetEnv("HTTP_ACCEPT")
CopyFile("ramtext:environment","con")
CgiWriteLn('</pre>')
Debugging
Fehlerpositionen aufspüren
Falls ein CGI-Programm seine Arbeit vorzeitig beendet (abstürzt),
aber auch, wenn ein interner Fehler auftritt (beispielsweise bei VAL),
schreibt die tdbengine einen entsprechenden Eintrag in die Datei error.msg
im Verzeichnis der tdbengine (falls dort ein Schreibrecht eingerichtet
wurde). Zusätzlich zur Fehlerart wird die Position des Programms ausgegeben.
Sie können die Fehlerstelle im Quelltext bestimmen, wenn Sie auf der
Kommandoebene compilieren und die Fehleradresse als zweites Argument angeben:
tdbengine test.mod 12345
Das Programm test.mod wird compiliert, und solange die Fehlerstelle
nicht ereicht ist, wird der Quelltext ausgegeben. Die Fehlerstelle befindet
sich also in er letzten ausgegebenen Zeile.
Logfile modifizieren
Wenn in der Datei tdbengine.ini unter [globals] das Flag
Logcgi=1
Enthalten ist, schreibt tdbengine bei jedem Aufruf einen Eintrag in
die Datei cgi.log:
Datum - Zeit_1 - Zeit_2 - Zeit_3 - Programm [ - erweiterte Loginformation
]
Zeit_1: Aufruf tdbengine, Initialisierung, Übertragung der Informationen
vom Browser
Zeit_2: Semaphor-Einrichtung, Programm-Laufzeit, Semaphor-Aufhebung
Zeit_3: Übertragung aller gepufferten Informationen, Freigabe
des Speichers, Schliessen aller offen Dateien
Die erweiterte Log-Information können Sie selbst bestimmen: CgiLog(msg)
Cookies
Da die Auswertung von Environment-Variablen nicht jedermanns Sache ist,
wird die Auswertung der Variablen HTTP_COOKIE jetzt auch von der tdbengine
übernommen. Diese stellt die einzelnen Cookies über die Funktion
CGIGetParam zur Verfügung:
CGIGetParam("cookie.name") liefert den Wert des Cookies mit dem Bezeichner
"name".
Der sinnvolle Einsatz von Cookies und Sessions wird später in diesem
Forum diskutiert.
Unterschiede:Linux und Windows
Die Versionen der tdbengine für Linux und Windows sind weitgehend
identisch, ebenso die verwendeten Dateiformate. Unterschiede treten nur
da auf, wo auch das jeweilige Betriebssystem seine Besonderheiten hat
Die Timer-Auflösung bei den Semaphoren beträgt bei Linux 1
Sekunde, unter Windows 1/1000 Sekunde, was jedoch in der Praxis keine Rolle
spielt.
Bei den Dateiattributen, die von den Directory-Funktionen FirstDir und
NextDir geliefert werden, wird unter Linux nur "d" (=Directory) gesetzt,
dafür werden die Dateirechte komplett ausgegeben.
FirstDir, NextDir:
Zeichen Anzahl Win9x, WinNT Linux
--------------------------------------------------
1 63 Dateiname Dateiname
64 7 Dateiattribute Dateiattribute
64 R=Readonly d=directory
65 H=Hidden
66 S=System
67 V=Volume
68 D=Directory
69 A=Archiv
71 12 Dateigröße Dateigröße
84 10 Datum Datum der letzten Änderung
96 8 Zeit Zeit der letzten Änderung
110 9 Zugriffsrechte
110 x Ausführungsrecht Besitzer
111 w Schreibrecht Besitzer
112 r Leserecht Besitzer
113 x Ausführungsrecht Gruppe
114 w Schreibrecht Gruppe
115 r Leserecht Gruppe
116 x Ausführungsrecht Rest
117 w Schreibrecht Rest
118 r Leserecht Rest
128 127 Verzeichnis Verzeichnis
Die Funktion ChMod(Dateiname, Rechte : STRING) : REAL setzt unter Linux
die Rechte an der Datei neu, je nach den Rechten, mir der diese Funktion
ausgeführt wird (also nur als root bzw Besitzer der Datei). Die neuen
Rechte werden als 'rwxrwxrwx' angegeben, wobei das erste Trippel für
die Rechte des Benutzers, das zweite für die Rechte der Gruppe und
das letzte für die Rechte des Rests der Welt gilt. Das Funktionsergebnis
liefert den Linux-Fehlerstatus.
Hinweis: Neben der wesentlich dedizierteren Rechte-Vergabe ist unter
Linux die Unterscheidung der Groß-/Kleinschreibung zu beachten!
Im Zuge der Vereinheitlichung der Programme, und weil es sich bei allen
Adressierungen im Internet um Unix-Adressierungen handelt, sollten auch
unter Windows alle Pfadangaben mit dem normalen Schrägstrich "/" angegeben
werden. Die tdbengine akzeptiert beide Schreibweisen.
|