Home

Grundsätzliches
Installation
Konfiguration
Erste Schritte
Laufzeitschalter
Textdateien
Systemfunktionen
Tabellenfunktionen
Indexfunktionen
Volltext-Indizierung
Memos und Blobs
Semaphoren-Konzept

Support Datenbank
Einführungskurs

Systemfunktionen

Folgende Funktionen werden hier besprochen:
 
GetDir aktuelles Verzeichnis ermitteln
MakeDir Verzeichnis anlegen
DelDir Verzeichnis löschen
ChDir aktuelles Verzeichnis wechseln
FirstDir ersten Verzeichniseintrag ermitteln
NextDir nächsten Verzeichniseintrag ermitteln
DirInfo Verzeichniseintrag holen
today Systemdatum
now Systemzeit
DelFile Datei löschen
CopyFile Datei kopieren
CGIExec externes Programm ausführen
DiskFree freien Speicher in Partition ermitteln
GetEnv Umgebungsvariable ermitteln

Allgemeines

Um systemübergreifend programmieren zu können, können alle Verzeichnisangaben im Unix-Format angegeben werden (also /home/tdbengine/test.prg statt home\tdbengine\test.prg unter Windows). Beachten Sie bitte, daß unter Unix Groß-/Kleinschreibung in Dateinamen unterschieden wird. Unser Tip: verwenden Sie nur Kleinbuchstaben und keine Sonderzeichen in Dateinamen, dann sind Ihre Anwendungen sicher von einer Plattform auf die andere portierbar.

Bitte beachten Sie, daß CGI-Programme normalerweise immer nur die Rechte des (in den meisten Fällen) anonymen Internet-Anwenders haben. Diesen muß also im Verzeichnis, in dem die CGI-Programme liegen, und im Verzeichnis der tdbengine wenigstens das Ausführungsrecht und das Leserecht eingeräumt werden. Wird mit Datenbanken gearbeitet, so muß entsprechend deren Zugriffen (nur lesend, lesend und schreibend) im Datenbank-Verzeichnis die Rechtegabe erfolgen. Selbst wenn keine neuen Tabellen angelegt werden sollen, so erfordert eine eventuelle Volltext-Indizierung auch das Recht, Dateien anzulegen.

Obwohl es den Sicherheitsaspekten des Internets nicht so ganz entspricht, ist es im Falle der CGI-Programmierung gebräuchlich, im CGI-Verzeichnis (und in den darunterliegenden Verzeichnissen) dem anonymen Internet-Anwender alle Rechte einzuräumen. Selbstverständlich darf das Verzeichnis via Anonymous-ftp niemals freigegeben werden! Damit übernehmen Sie als CGI-Programmierer eine ganze Menge Verantwortung, denn der Internet-Anwender kann alle Programme ausführen, die hier vorliegen. Sie müssen also daür sorgen, daß

  •    keine fremden Programme hier gespeichert werden können, und
  •    Ihre Programme keinen Mißbrauch erlauben.
Falls Sie CGI-Administrationsprogramme ebenfalls im Internet installieren (wie etwa unser program development kit), sollten Sie diese ausschließlich in einem (durch Benutzer-Identifizierung) geschützen Verzeichnis ablegen.

Das aktuelle Verzeichnis ermitteln

GetDir(Laufwerknummer : REAL) : string

GetDir liefert das aktuelle Verzeichnis. Ist die Laufwerknummer 0, so wird das aktuelle Verzeichnis des aktuellen Laufwerks geliefert. Unter
Unix gibt es keine verschiedenen Laufwerke, deshalb muß hier immer 0 angegeben werden.

Hinweis: Die tdbengine wechselt immer in das Verzeichnis, in dem das auszuführende prg-File ist.
 

Anlegen und Löschen von Verzeichnissen

MakeDir(Dir  : STRING) : REAL

Legt ein Verzeichnis an, falls der Anwender das Recht dazu hat. Konnte das Verzeichnis angelegt werden, so liefert die Funktion 0, andernfalls den Fehlercode des Betriebssystems.

DelDir(Dir : STRING) : REAL

Löscht das angegebene Verzeichnis, falls der Anwender das Recht dazu hat. Es können nur leere Verzeichnisse gelöscht werden. Die Funktion liefert 0, wenn das Verzeichnis gelöscht wurde, andernfalls den Fehlercode des Betriebssystems.
 

Verzeichnis wechseln

ChDir(Dir : STRING) : REAL

Wechselt in das Verzeichnis. Liefert 0, wenn der Wechsel erfolgreich war, andernfalls den Fehlercode des Betriebssystems.
 

Suche in Verzeichnissen

FirstDir(Pfad,Option : STRING) : STRING

NextDir : STRING

Der Pfad ist eine Verzeichnisangabe, in der auch Wildcards erlaubt sind. Unter Unix sind auch erweiterte Muster der Form "*abc" möglich. Die Option wird nur unter Windows ausgewertet. Es handelt sich dabei um einen String mit einer Kombination folgender Zeichen:

  • D sucht auch Verzeichnissen
  • H sucht nach versteckten Dateien
  • S sucht nach Systemdateien
Zusätzlich wird immer nach einfachen Dateien gesucht.

Hinweis: Änderung gegenüber Vorgängerversion VDP und TDB!

Das Ergebnis der Funktion ist ein Leerstring, wenn kein (weiterer) Verzeichniseintrag vorliegt, andernfalls ein String mit folgendem Aufbau:
 
 
Zeichen   Inhalt
1..63 Dateiname
64..70 Dateiattribute
71..82 Dateigröße
84..94  Datum der letzen Änderung
95..102    Zeit der letzten Änderung
110..118   Rechte in der Form uuugggooo (nur bei Linux)
128..255   Verzeichnis (absolut)

Beispiel: Ausgabe aller Dateien mit der Extension "html" im Verzeichnis "/home/tdbengine/doc"
 
VARDEF dir_entry : STRING
...
  dir_entry:=FirstDir('/home/tdbengine/doc/*.html','')
  WHILE dir_entry DO
    cgiwriteln(rtrim(dir_entry[1,63]+'<br>')
    dir_entry:=NextDir
  END
...

Hinweis: Die tdbengine liest beim Aufruf von FirstDir alle passenden Verzeichniseinträge ein und stellt sie dann suczessive zur Verfügung. Beim nächsten Aufruf von FirstDir (und am Programmende) wird dieser interne Puffer wieder geleert. Diese Vorgegehensweise hat folgende Konsequenzen:

  • es werden keine Systemressourcen belegt
  • NextRec ist eine tdbengine-interne Funktion und führt zu keinen Systemcall
  • FirstRec - NextRec - Sequenzen können nicht geschachtelt werden
Wenn nur die Systemdaten (Datum, Größe, Existenz etc.) einer einzelnen Datei abgefragt werden soll,  kann die Funktion DirInfo eingesetzt werden:

DirInfo(Path : STRING) : STRING

Die Funktion liefert das selbe Ergebnis wie FirstDir(Path,''), kann aber auch innerhalb einer FirstRec - NextRec - Sequenz eingesetzt werden.
 

Systemdatum und Systemzeit

today : REAL

Liefert das aktuelle Datum als Tage seit dem 1.1.0. Mit DateStr(today) erhalten Sie das aktuelle Datum als String.

now : REAL

Liefert die aktuelle Uhrzeit als Anzahl der Minuten seit Mitternacht.

Hinweis: FRAC(now)*60 liefert die Sekunden mit einer Auflösung  1/1000 s

Mit TimeStr(now) erhalten Sie die aktuelle Uhrzeit als String

Beispiel:
 
TimeStr(now) 18:32
TimeStr(now,0)  18:32:47
TimeStr(now,3) 18:32:47.251 
 

Allgemeine Dateifunktion

DelFile(Pfad : STRING) : REAL

Löscht die mit "Pfad" angegebene Datei, wenn es sich nicht um ein Verzeichnis handelt, und wenn der anonyme http-User das Recht dazu hat. Unter Windows wird ein eventuell bestehender Schreibschutz ignoriert. Das Funktionsergebnis ist 0, wenn die Datei gelöscht werden konnte, andernfalls der Fehlercode des Betriebssystems.

CopyFile(p_von, p_nach : STRING) : REAL

Damit wird die Kopie einer Datei angelegt.

p_von darf sein:

  • beliebiger Pfad innerhalb des Verzeichnisbaums
  • interne Textdatei (Ramtext)
  • URL (nur http://*, seit Version 6.2.6)
p_nach darf sein:
  • beliebiger Pfad innerhalb des Verzeichnisbaums
  • interne Textdatei (Ramtext)
  • "con" (für Standardausgabe)
Hinweis: Wird mit CopyFile auf die Standardausgabe kopiert, muss zurvor CgiCloseBuffer aufgerufen werden, da CopyFile die Pufferung umgeht.
 

Externes Programm ausführen

CGIExec(commandline : STRING [; s_timeout : REAL]) : REAL

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
..

Hinweise:

Sie sollten CGIExec immer mit besonderer Vorsicht einsetzen. Keine Experimente!
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).
 

Freien Speicher in Partition ermitteln

DiskFree(drive : REAL) : REAL

drive: 0 = aktuelles Laufwerk (Win32)  bzw. Partition, in der das aktuelle Verzeichnis liegt (Linux, FreeBSD)
        1 = A: (nur Win32)
        2 = B: (nur Win32)
        ...

Rückgabewert: Freier Platz in Laufwerk / Partition bzw. -1, falls Laufwerk nicht verfügbar
 

Umgebungsvariable ermitteln

GetEnv(Name : STRING) : STRING

GetEnv liefert den Wert der Environment-Variablen mit dem angegebenen Namen.

Zusätzlich steht nach jedem Aufruf ein Ramtext mit dem Namen "ramtext:environment" zur Verfügung, 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>')