[Tustep-Liste] SQL in Tustep

Johannes Leicht leic2501 at uni-trier.de
Mi Sep 27 18:36:59 CEST 2006


Liebe Tustepler,

vor einiger Zeit hatte Herr Giaccomazi in seiner der "Quo vadis"-Mail 
angeregt, innerhalb von Tustep Schnittstellen zu schaffen, mit denen 
andere Programme, z.B. Scriptsprachen o.ä. eingebunden werden können. 
Die Diskussion um diesen Wunsch, dem ich mich nur anschließen konnte und 
kann, ist zu meinem Bedauern inzwischen wohl eingeschlafen.
Dennoch ist in der neuen Tustep-Version ein sehr erfreulicher Schritt in 
diese Richtung gemacht worden: Wie bestimmt nicht nur ich festgetellt 
habe kann man mit der Kommandomakro-Funktion REQUEST eine HTML-Seite 
oder ein CGI-Script aufrufen. Wie das recht bequem nutzbar gemacht 
werden kann, möchte ich hier kurz vorstellen.

Bei einem meiner aktuellen Projekte befindet sich ein großer Teil der 
Daten in einer SQL-Datenbank. Um sie in meine restlichen Daten 
einzuarbeiten hatte ich sie zunächst in eine Datei geschrieben, nach 
Tustep importiert und dann auf herkömmliche Art und Weise 
weiterverarbeitet. Da ich jedoch sehr gerne auch die m.E. nur schwer 
leugbaren Stärken von SQL-Abfragen, indizierter Suche usw. nutzen 
wollte, suchte ich nach einer Möglichkeit, solche Abfragen in Tustep zu 
verarbeiten und stieß dabei auf REQUEST. Damit sind Zugriffe auf einen 
Webserver möglich, und über diesen - z.B. verwaltet durch ein PHP-Script 
- auch auf eine SQL-Datenbank.
Da es natürlich ein wenig umständlich wäre, extra einen Apache + MySQL + 
PHP zu installieren, habe ich mir einen kleinen Server gebastelt, der 
(ohne jegliche Installation) lokal (127.0.0.1) ausgeführt wird, an Port 
80 lauscht und ankommende SQL-Queries an eine SQLite-Datenbank 
weiterleitet. Auf diesen Server kann mittels REQUEST zugegriffen werden. 
Zusätzlich habe ich in Tustep ein paar Submakros geschrieben, die den 
Zugriff auf diesen Server vereinfachen.

Sobald der Server läuft ist ein recht komfortabler Zugriff auf die 
SQLite-Datenbank möglich:

01: $$!
02: $$=- {}
03: MODE VARIABLE
04:
05: INCLUDE sql
06:
07: SET result = ""
08: SET status = ""
09: SET request = ""
10:
11: CALL SQL_OPEN_DB("db_test.db", status)
12:
13: CALL SQL_UPDATE("CREATE TABLE emp (id int, name CHAR(20));", result, 
status)
14:
15: LOOP x = 1, 100
16:    SET request = "{request}INSERT INTO emp VALUES ({x}, 'test{x}');"
17: ENDLOOP
18:
19: CALL SQL_UPDATE(request, result, status)
20:
21: CALL SQL_QUERY("SELECT * FROM emp", result, status)
22:
23: LOOP x = result
24: + {x}
25: ENDLOOP
26:
27: CALL SQL_CLOSE_DB(status)

Erläuterung:
05: SQL-Makrosegment einbinden
11: Datenbank öffnen/anlegen
13: neue Tabelle erstellen
15-17: mehrere INSERT-Statements aneinanderkleben, damit nicht für jedes 
INSERT ein Zugriff nötig ist.
19: INSERT-Statements ausführen
21: Tabelle auslesen
23-25: Tabelle anzeigen
27: Datenbank schließen


Soweit so gut. Leider hat diese Methode den Nachteil, daß ein Zugriff 
auf die Datenbank nicht allzu schnell ist (bei mir ca. 0,5s - 1s), da 
bei jedem Zugiff eine neue Verbindung aufgebaut werden muß. Es ist also 
zwar gut möglich, größere Datenmengen auf einmal abzurufen und in einer 
Sternvariablen weiterzuverarbeiten, sobald man jedoch mehr als nur eine 
Handvoll Zugriffe benötigt, wird die Zugriffszeit empfindlich bemerkbar.

Deshalb würde ich es sehr begrüßen, wenn Schnittstellen wie REQUEST 
weiter entwickelt werden könnten. Ich vermute, daß z.B. durch 
persistente Verbindungen, die nicht nach jedem REQUEST getrennt werden, 
die Zugriffsgeschwindigkeit deutlich erhöht würde.

Und vielleicht läßt sich ja dieses Server-Modell, das zumindest für die 
SQL-Datenbank gut funktioniert, so ausbauen, daß auch die von Herrn 
Giaccomazi erwähnten Skriptsprachen eingebunden werden können.

Falls übrigens jemand gerne meine SQL-Lösung ausprobieren möchte, 
schicke ich ihm gerne den Server und das dazugehörende Makrosegment zu. 
Der Server ist in C++ (wxWidgets) geschrieben und für Windows 
kompiliert. Er ist momentan noch eine typische quick-and-dirty-Lösung, 
die in erster Linie das beherrscht, was ich für mein Projekt benötige. 
Ich habe ihn auch noch nicht allzu intensiv getestet, aber falls 
Interesse besteht und Anregungen kommen, werde ich ihn gerne 
weiterentwickeln.

Viele Grüße

Johannes Leicht



Mehr Informationen über die Mailingliste Tustep-Liste