Deutsch English
Blog
Home
Über tdbengine
Newsletter
Download
Helpware
Chat
Dokumentation
Installation
Konfiguration
Erste Schritte
Variablentypen
Laufzeitschalter
Textdateien
Systemfunktionen
Tabellenfunktionen
Indexfunktionen
Volltext-Indizierung
Memos und Blobs
Semaphoren-Konzept
Fehlermeldungen
Tipps für PHP Programmierer
Locking daemon
Einführungskurs
Befehlsreferenz
HOWTO - Wie kann ich...?
Projekte
Links
Benchmarks
Bug Reporting
Supportanfrage
 
Home    Überblick    Suche    Impressum    Kontakt    Mitglieder
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"

VAR 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 sukzessive 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
  • NextDir() ist eine tdbengine-interne Funktion und führt zu keinen Systemcall
  • FirstDir() - NextDir() - 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 FirstDir() - NextDir() - Sequenz eingesetzt werden.

Systemdatum und Systemzeit

Today : REAL

Liefert das aktuelle Datum als Tage seit dem 1.1.1900. 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 Dateifunktionen



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

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



class="code">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 Environment-Variablen zugegriffen werden, deren Inhalt 255 Zeichen übersteigt.

Beispiel:

CGICloseBuffer
CGIWrite("<pre>")
GetEnv("HTTP_ACCEPT")
CopyFile("ramtext:environment","con")
CGIWriteLn('</pre>')

Siehe auch:





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: 10.05.2004


ranking-charts.de

Programmers Heaven - Where programmers go!