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 13.08.2000

Inzwischen ist die Angleichnung von Linux- und WIn32-Version so weit fortgeschritten, dass sich die Unterschiede nur noch auf rein betriebssystemspetifische Belange reduzieren. Von Markus Schwaiger kam die gute Nachricht, dass die tdbengine auch unter FreeBSD problemlos läuft. Ich hoffe, dass er seine Änderungen des Installations-Skripts zur Verfügung stellt, damit wir auch eine komplette FreeBSD-Version anbieten können.

Beim Schreiben der 6. Lektion des Einführungskurses in die CGI Programmierung mit der tdbengine fiel mir das Fehlen einer simplen Selektierungsfunktion auf. Deshalb gibt es nun eine neue Version 6.2.4, die darüber hinaus noch eine Reihe von weiteren Features bietet:

  • Verbessertes Handling bei abgebrochenen Verbindungen
  • Einstellbarer CGI-Puffer
  • Erweitertes Zahlenformat für Zeitangaben
  • Neue Funktion zum Löschen eines Index
  • Neue Funktion zum Suchen und Markieren von Datensätzen
  • Umbenennung der Funktion PRIMFILE in PRIMTABLE
  • Aufhebung der 64-KByte-Grenze für Ramtexte

Verbessertes Handling bei abgebrochenen Verbindungen

Wir haben mit einer Reihe von Linux- und CGI-Entwicklern die Frage diskutiert, was passiert, wenn während der Ausführung eines CGI-Programms der Klient die Stop-Taste bei seinem Browser drückt oder einen anderen Link aktiviert (was auf das Gleiche hinauskommt). Wir haben nämlich bemerkt, dass in einem solchen Fall je nach http-Server das CGI-Programm einfach (aber dafür brutal) terminiert wird oder ein (spät feststellbarer) IO-Fehler ausgelöst wird.

Wir haben jetzt die tdbengine so erweitert, dass in jedem Fall ein kontrollierter Programmabbruch erfolgt, bei dem alle Dateien sauber geschlossen werden.

Eine wichtige Lehre aus der Diskussion für CGI-Programmierer: Keine CGI-Ausgaben während einer Transaktion, denn nur bei Ausgaben können Abbruchsbedingungen auftreten!

Einstellbarer CGI-Puffer

Langsame Verbindungen können ein CGI-Programm ganz schön 'runterbremsen - aber nur, wenn Daten übertragen werden. Das ist solange nicht schlimm, solange das CGI-Programm keinen Semaphoren einrichtet und damit andere Klienten warten müssen, bis der Semaphor wieder frei wird.

Damit auch in solchen Fällen möglichst viele Klienten quais gleichzeitig ein CGI-Programm ausführen können, haben wir die Ausgabe-Pufferung eingeführt. Alle Ausgaben (inkl. CGIWriteTemplate) erfolgen zunächst in einen Puffer. Erst am Ende des Programms, nach der Freigabe des Semaphoren (oder wenn der Puffer voll ist), erfolgt die Übertragung der Daten. Während dieser Zeit kann das Programm bereits von anderer Seite wieder gestartet werden. Die Pufferung erlaubt es also, die Zeitspanne des Sperrens auf die reine Programmlaufzeit zu reduzieren.

Wir haben eigentlich gedacht, dass ein 64-KByte-Puffer locker ausreichen sollte, denn größere HTML-Dateien werden nicht gerne gesehen. Im Zeitalter von DSL wurden wir nun eines Besseren(?) belehrt. Aus diesem Grund kann jetzt die Puffergröße global und (bei Bedarf) für jedes Programm einzeln festgelegt werden.

Dazu gibt es einen neuen Eintrag in  tdbengine/bin/tdbengine.ini:

cgibuf=Größe des Puffers in Bytes (Minimum = 1024)

Beispiel:

[globals]
cgibuf=200000
[programm_a]
cgibuf=1024

Hier wird der CGI-Puffer global auf 200000 Bytes eingestellt. Nur das Programm "programm_a" muss mit 1024 Bytes auskommen.

Erweitertes Zahlenformat für Zeitangaben

Programme der TDB-Familie speichern Zeitangaben bekanntlich als Minuten ab. Die tdbengine kann zusätzlich schon seit geraumer Zeit auch Bruchteile davon verarbeiten: Sekunden und Sekundenbruchteile. So liefert beispielsweise die Funktion NOW die Systemzeit in einer Auflösung von 1/1000 Sekunden.

Die Funktion TimeStr kann auch schon lange ein erweitertes Zeitformat ausgeben:

TIMESTR(Zeit : REAL; Nachkommastellen_bei Sekunden : REAL) : STRING

TIMESTR(NOW)    ->  "15:12"
TIMESTR(NOW,0)  ->  "15:12:48"
TIMESTR(NOW,3)  ->   "15:12:48.429"

Jetzt kann auch der Scanner der tdbengine (=der Programmteil, der Programmtext aufbereitet) das erweiterte Zeitformat lesen:

TIMESTR(15:12:48.429) -> "15:12:48.429"

Neue Funktion zum Löschen eines Index

Machmal muss ein Index wieder gelöscht werden. Dafür gibt es jetzt die Funktion DELINDEX:

DELINDEX(db : Tabellenhandle; index :  Indexnummer) : REAL

Rückgabewert ist 0, wenn alles in Ordnung, sonst Fehlercode.

Die ADL-Indizes können nicht gelöscht werden.

Hinweis: Die Funktion sollte mit Bedacht eingesetzt werden. Eine Tabelle kann von vielen Programmen aus genutzt werden, und vielleicht bentigt ein anderes Programm gerade den Index, den Sie eben gelöscht haben...

Neue Funktion zum Suchen und Markieren von Datensätzen

Es gibt eine neue Funktion zum Suchen und Markieren von Datensätzen: FINDANDMARK

FINDANDMARK(Tabellenhandle : REAL; Selektion : STRING [;Multiexpression : STRING]) : REAL

In die Markierungsliste des Tabellenhandles werden alle Satznummern aufgenommen, die die Selektion erfüllen.
Multiexpression ist ein String der Form "Ausdruck; Ausdruck; ...". Die einzelnen Ausdrücke werden für jeden gefundenen Datensatz berechnet. Sowohl in der Selektion als auch in Multiexpression kann die Feldnotation [Tabellenname.]Feld verwendet werden.

Beispiel:

VARDEF x : REAL
FINDANDMARK(db,'Gehalt>250000','x:=MEAN(Gehalt)')

Damit wird die Tabelle (mit dem Handle db) nach allen Datensätzen durchsucht, bei denen das Feld 'Gehalt' einen höheren Wert als 250000 aufweist. Nach der Ausführung der Funktion sind die gesuchten Datensätze in der Markierungsliste und x hat als Wert den Durchschnittswert des Feldes 'Gehalt' dieser Datensätze.

Der Rückgabewert der Funktion ist negativ, wenn ein Fehler auftrat (in der Selektion oder im Multiexpression). Anderfalls wird die Anzahl der gefundenen Datensätze zurückgeliefert (also NMARKS(db)).

Umbenennung der Funktion PRIMFILE in PRIMTABE

Die Funktion PRIMFILE steht jetzt auch unter dem Namen PRIMTABLE zur Verfügung. Sie sollten den neuen Namen verwenden, da er irgendwann in der Zukunft den alten Funktionsnamen (der semantisch nicht stimmt) ersetzen wird.

Aufhebung der 64-KByte-Grenze für Ramtexte

Ähnliches wie für en CGI-Puffer galt auch die maximale Größe von Ramtexten: Wir dachten, dass 64 KByte bis in alle Ewigkeit ausreichen würden. Hier sind wir aber selbst schon mehrach an die Grenze gestossen: Der Aufbau umfangreicher und hübsch(?!) formatierter Trefferlisten mittels SUBST kann ganz schön in die Breite (Größe) gehen.

Deshalb wachsen die Ramtexte jetzt inkrementell mit dem Bedarf. Das heisst, sie werden anfangs recht klein dimensioniert und stetig erweitert, wenn mittels WRITE oder SUBST mehr Platz benötigt wird.

Dieses Vorgehen schont einerseits die Systemressourcen (Speicher wird nur bei Bedarf angefordert) und andererseits die Nerven der Programmierer (Speicher ohne Ende).

So viel zur neuen Version

Viel Spaß und Erfolg damit wünscht

Ulrich Kern



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


ranking-charts.de

Programmers Heaven - Where programmers go!