Deutsch English
Blog
Home
Über tdbengine
Newsletter
Abonnement
November 2003
August 2002
Dezember 2001
Mai 2001
Dezember 2000
August 2000
Juni 2000
Dezember 1999
Download
Helpware
Chat
Dokumentation
Einführungskurs
Befehlsreferenz
HOWTO - Wie kann ich...?
Projekte
Links
Benchmarks
Bug Reporting
Supportanfrage
 
Home    Überblick    Suche    Impressum    Kontakt    Mitglieder
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.



tdbengine Anwendungen im Web:

Open-Source Web CMS


Open-Source Bug-Tracking


Free wiki hosting

Open-Source Wiki-System

Kostenloses Foren-Hosting

Diät mit tdbengine 8-)

tdbengine chat
irc.tdbengine.org
#tdbengine

   Copyright © 2003-2004 tdb Software Service GmbH
   Alle rechte vorbehalten. / All rights reserved
   Letzte Änderung: 16.02.2005
{Fehler für :execmacro{execmacro="sessionspy"}


ranking-charts.de

Programmers Heaven - Where programmers go!