original in en Diego Alberto Arias Prad
en to de Hermann-Josef Beckers
Ich bin Ingenieur für Telekommunikation und wohne in Lugo, Spanien. Ich weiss nicht mehr genau, wann ich mit Linux begann, es war 1995 oder 1996. Vorher benutzte ich Microsoft Windows und ich wusste sogar gar nicht, dass es Linux gab. Einen Computer unter Linux sah ich erstmals an der Universität. Es sah für mich sehr interessant aus und kurz danach installierte ich es auf meinem Computer zu Hause. Meine erste Linux-Distribution war Slackware.
In all diesen Jahren hatte ich viel Spaß mit anderen Linux-Distributionen
und einigen BSD-"Geschmacksrichtungen", Programmiersprachen wie Java oder Tcl,
und der Benutzung von Datenbank-, Web- und Anwendungsservern. Linux war
nicht nur Spaß für mich, ich hatte auch die Möglichkeit, Linux in meiner
Arbeitsstätte Telefónica I+D zu nutzen.
Falls Ihre Linux-Distribution oder Ihr *BSD-Betriebssystem über Unterstützung
für Pakete (wie z. B. RPM oder DEB) oder Ports
(z. B.Crux Linux oder FreeBSD),
verfügt, können Sie das Paket- oder Ports-System zum Installieren der
MySQLTCL-Bibliothek verwenden und diesen Abschnitt überspringen.
Falls dies nicht der Fall ist oder Sie die manuelle Installation bevorzugen,
zeige ich Ihnen in den nächsten Zeilen, welche Schritte ich durchgeführt
habe. Diese Zeilen sollten als Richtschnur angesehen werden und nicht als
Schritt-für-Schritt-Installation. Zum Beispiel in einer
Linux Mandrake Distribution (Version 9.2) in einer bash-Shell:
$ ./configure --with-mysql-lib=/usr/lib $ make $ make install |
$ export CPP=/usr/bin/cpp $ ./configure --with-tcl=/usr/lib/local/tcl8.3 --with-tclinclude=/usr/local/include/tcl8.3 --with-mysql-include=/usr/local/include/mysql --with-mysql-lib=/usr/local/lib/mysql $ make $ make install |
In diesem Abschnitt erläutere ich einige Tcl-Grundlagen für interessierte
Leser, die nicht in Tcl programmieren können. Wenn Sie bereits ein
Tcl-Programmierer sind, können Sie diesen Abschnitt überspringen.
Sie können die Beispiele aus diesem (und auch den folgenden) Abschnitten
in der Tcl-Shell (tclsh) nachvollziehen.
Tcl-Variablen werden mit dem Befehl set erzeugt. Einige Beispiele:
% set address {Edison Avenue, 83} Edison Avenue, 83 % set zip_code 48631 48631 |
% set address Edison Avenue, 83 % set zip_code 48631Nehmen wir an, wir möchten den Wert der Variablen address auf dem Bildschirm ausgeben. Dies kann über den Befehl puts erfolgen:
% puts stdout [set address] Edison Avenue, 83Der Parameter stdout wird an den Befehl puts übergeben. Dieser Parameter weist den Befehl puts an, auf die Standardausgabe, in unserem Fall den Bildschirm, auszugeben. Der zweite an den puts-Befehl übergebene Parameter ist [set address]. Die eckigen Klammern im zweiten Parameter informieren den Tcl-Interpreter darüber, dass der Wert innerhalb der Klammern ein weiterer Tcl-Befehl ist, der vor dem puts-Befehl ausgeführt werden muss; dies wird als Befehlsersetzung bezeichnet. Das gleiche kann auch auf eine andere Art errreicht werden:
% puts stdout $address Edison Avenue, 83In diesem Beispiel haben wir eine Variablen-Ersetzung vorgenommen: Das Zeichen $ vor einer Variablen veranlaßt diese Variablenersetzung.
% puts stdout "the zip code is [set address]" the zip code is 48631 % puts stdout "the zip code is $address" the zip code is 48631 % puts stdout {the zip code is [set address]} the zip code is [set address] % puts stdout {the zip code is $address} the zip code is $addressIn diesem Beispiel können Sie sehen, das bei der Verwendung geschweifter Klammern keine Befehls- und Variablen-Ersetzung stattfindet; dies geschieht aber, wenn doppelte Anführungszeichen für die Gruppierung benutzt werden.
% unset address % set address can't read "address": no such variable % unset zip_code % set zip_code can't read "zip_code": no such variable
Die Zeichenkette ist eine der drei grundlegenden Tcl-Datenstrukturen. Eine
Zeichenkette ist eine Menge von Zeichen. Eine Zeichenkette kann mit dem set-Befehl erstellt werden.
% set surname Westmoreland Westmoreland % set number 46.625 46.625Beide Variablen, surname und number, sind Zeichenketten. Zeichenketten können mittels des Befehls string manipuliert werden. Die allgemeine Syntax für den string-Befehl ist string operation stringvalue otherargs. Hier folgen einige Beispiele zur Benutzung dieses Befehls:
% string length $surname 12 % set surname [string range $surname 0 3] West % puts stdout $surname West % string tolower $surname westIm Gegensatz zu Java oder Pascal ist Tcl keine stark typisierte Programmiersprache. Die folgenden Beispiele zeigen dies:
% set number [expr $number + 24.5] 70.125 % string range $number 2 5 .125Mit dem Befehl expr wurde der Wert der Variablen number um 24.5 erhöht. Danach wurde die Variable number mit dem string-Befehl als Zeichenkette behandelt und davon die letzten vier Zeichen angezeigt.
Tcl-Listen sind ein Spezialfall von Zeichenketten, bei dem Listenelemente durch Worttrenner getrennt sind und eine spezielle Bedeutung haben.
% set friends_list {Fany John Lisa Jack Michael} Fany John Lisa Jack Michael % set friends_list [string tolower $friends_list] fany john lisa jack michael % set friends_list fany john lisa jack michaelEs gibt einige Tcl-Befehle, die der Listenmanipulation dienen. Wieder einige Beispiele:
% lindex 2 $friends_list lisa % lrange $friends_list 2 4 lisa jack michael % set friends_list [lsort -ascii $friends_list] fany jack john lisa michael % set friends_list fany jack john lisa michael % set friends_list [linsert $friends_list 2 Peter] fany jack Peter john lisa michael % string toupper $friends_list FANY JACK PETER JOHN LISA MICHAELDas letzte Beispiel zeigt, dass Zeichenketten und Listen tatsächlich die gleiche Datenstruktur darstellen.
Ein Feld kann als eine Liste mit einem Index angesehen werden, der auf
Zeichenketten-Werten basiert. Ein Feld kann wie im folgenden Beispiel angelegt werden:
% set phone_numbers(fany) 629 629 % set phone_numbers(michael) 513 513 % set phone_numbers(john) 286 286Feld-Werte können mittels des set-Befehls und Variablenersetzung abgerufen werden; wie im vorhergehenden Beispiel gezeigt wurde, wird der zeichenketten-basierte Index von Klammern begrenzt.
% set $phone_numers(michael) 513Der Befehl array liefert Informationen über eine Feldvariable zurück. Die nächsten Beispiele zeigen, was dieser Befehl leisten kann:
% array size phone_numbers 3 % array names phone_numbers fany john michael
Bevor aus einem Tcl-Skript Abfragen an eine Datenbank gerichtet werden können, muss eine Verbindung zum Datenbankserver aufgebaut werden. In diesem Abschnitt werden wir sehen, wie dies gemacht wird und wie auf Fehler reagiert wird, die beim Aufbau der Datenbankverbindung auftreten können.
Nun folgt ein Beispiel eines Tcl-Skriptes, das eine Verbindung zu einem MySQL-Datenbankserver aufbaut:
0: #!/usr/bin/tclsh8.4 1: 2: package require mysqltcl 3: global mysqlstatus 4: 5: set port {3306} 6: set host {127.0.0.1} 7: set user {john_smith} 8: set password {jsmith_password} 9: 10: set mysql_handler [mysqlconnect -host $host -port $port -user $user -password $password] 11: 12: mysqlclose $mysql_handlerBeachten Sie, dass die Zahlen in der linken Spalte und der Doppelpunkt nicht Teil des Tcl-Skriptes sind; sie dienen nur zur Markierung der Skriptzeilen. Beachten Sie auch, dass Sie in Abhängigkeit von der von Ihnen benutzten Linux-Distribution eventuell Zeile #0 ändern müssen, um den korrekten Pfad zur Tcl-Shell zu setzen.
Im vorhergehenden Abschnitt wurde Zeile #3 des Skriptes nicht erläutert. Das werden wir nun nachholen.
MySQLTcl-Bibliotheksbefehle können mit Fehlern enden. Wenn ein Fehler nicht abgefangen wird, bricht das Skript ab und dies sollte uns interessieren. Wir ändern das Skript aus dem vorigen Abschnitt wie folgt ab:
10: if [catch {mysqlconnect -host $host -port $port -user $user -password $password} mysql_handler] { 11: puts stderr {error, the database connection could not be established} 12: exit 13: } else { 14: mysqlclose mysql_handler 15: }Wenn der Befehl set mysql_handler [mysqlconnect -host $host... auf einen Fehler trifft, wird dieser vom Befehl catch abgefangen. Der Befehl catch gibt 1 zurück, wenn der Befehl innerhalb der geschweiften Klammern bei der Ausführung einen Fehler verursacht, und 0, wenn kein Fehler auftritt. Die Variable mysql_handler speichert die Ausgabe des in geschweiften Klammern stehenden Befehls.
Element | Bedeutung |
code |
Wenn kein Fehler auftritt, entspricht mysqlstatus(code) Null; ansonsten wird mysqlstatus(code) auf den Fehlercode des MySQL-Servers gesetzt. Wenn der Fehler nicht vom MySQL-Server erzeugt wurde, wird mysqlstatus(code) auf -1 gesetzt.
Der Wert von mysqlstatus(code) wird nach jeder Ausführung eines MySQLTcl-Bibliotheksbefehls aktualisiert. |
command |
Der zuletzt ausgeführte MySQLTcl-Bibliotheksbefehl, bei dem ein Fehler auftrat, wird in mysqlstatus(command) gespeichert.
Der Wert von mysqlstatus(command) wird nach jeder nicht erfolgreichen Ausführung eines MySQLTcl-Befehls aktualisiert; daher wird mysqlstatus(command) nach einer erfolgreichen Ausführung eines MySQLTcl-Befehles nicht aktualisiert. |
message | Der Wert von mysqltcl(message) wird nach jeder fehlerhaften Ausführung eines MySQLTcl-Befehles mit einer Zeichenkette aktualisiert, die eine Fehlernachricht enthält. Wie mysqlstatus(command) wird mysqlstatus(message) nicht aktualisiert, wenn ein MySQLTcl-Befehl erfolgreich ausgeführt wurde. |
Element | Bedeutung |
nullvalue | Zeichenkette, die benutzt wird, um bei der Anzeige von SQL-Abfrageergebnissen den Nullwert darzustellen. Als Fehlwert wird eine leere Zeichenkette genutzt; musqlstatus(nullvalue) kann auf eine beliebige Zeichenkette gesetzt werden. |
10: catch {mysqlconnect -host $host -port $port -user $user -password $password} mysql_handler 11: if {$mysqltatus(code) != 0} { 12: puts stderr $mysqlstatus(message) 13: } else { 14: mysqlclose mysql_handler 15: }Offensichtlich kann das globale Feld mysqlstatus für die Behandlung von weit mehr Fehlern genutzt werden als nur für diejenigen, welche beim Aufbau einer Datenbankverbindung auftreten können.
In diesem Abschnitt werden die einfachsten MySQLTcl-Bibliotheksbefehle dargestellt und die Benutzung mit einigen Beispielen gezeigt. Für eine vollständige Referenz verweise ich auf die Handbuchseite zur MySQLTcl-Bibliothek.
Die in diesem Abschnitt behandelten Befehle sind in der folgenden Tabelle dargestellt. Parameter sind unterstrichen. Ein Parameter zwischen zwei Fragezeichen ist optional; das Zeichen | bedeutet "oder".
Befehl | kurze Beschreibung |
mysqlconnect ?option value ...? | verbindet zu einer Datenbank; ein Verbindungs-Handle wird zurückgegeben, welches von anderen MySQLTcl-Befehlen benutzt werden muss |
mysqluse handle dbname | verbindet ein MySQL-Handle mit der angegebenen Datenbank |
mysqsel handle sql_statement ?-list | -flatlist? | schickt einen SQL-Select-Befehl an die Datenbank |
mysqlexec handle sql_statement | schickt einen SQL-Befehl an die Datenbank |
mysqlclose handle | schliesst eine Datenbankverbindung |
Dieser Befehl wurde bereits im Abschnitt "Datenbankverbindung" diskutiert. Er aktzeptiert einen zusätzlichen Parameter -db, der noch nicht gezeigt wurde. Mit dem Parameter -db wird die Datenbank festgelegt, die bei weiteren SQL-Befehlen benutzt wird. Ein Beispiel:
% set mysql_handler [mysqlconnect -h 127.0.0.1 -p 3306 \\ -user john_smith -password jsmith_password -db jsmith_database]Die "Ziel"-Datenbank für weitere MySQLTcl-Befehle, die das mysql_handler-Datenbank-Handle nutzen, ist diejenige mit dem Namen jsmith_database.
Dieser Befehl erlaubt es, die mit dem MySQL-Handle assoziierte Datenbank mit derjenigen zu tauschen, die als erster Parameter an diesen Befehl übergeben wird.
Dieser Befehl sendet eine SQL-select-Anweisung an die mit dem MySQL-Handle assoziierte Datenbank. Wenn der Parameter sql_statement keine SQL-select-Anweisung enthält, gibt es einen Fehler.
Es gibt einen dritten optionalen Parameter, der -list oder -flat_list sein kann. Wir zeigen an einem Beispiel, wie dieser Parameter die Ausgabe des Befehls beeinflusst. Nehmen wir an, dass es in der mit dem MySQL-Handle assoziierten Datenbank eine Tabelle namens people mit folgendem Inhalt gibt:
id | first_name | last_ name | phone |
26 | Karl | Bauer | 8245 |
47 | James | Brooks | 1093 |
61 | Roberto | Castro Portela | 6507 |
% mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} -list {Karl Bauer} {James Brooks} {Roberto {Castro Portela}} % mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} -flatlist Karl Bauer James Brooks Roberto {Castro Portela}Im ersten Beispiel (Parameter -list) gibt der Befehl eine Liste zurück, deren Elemente wiederum Listen sind. Im zweiten Beispiel (Parameter -flatlist) gibt die Anweisung eine einzelne Liste zurück, in der alle Elemente miteinander verkettet wurden.
% mysqlsel $mysql_handler {select first_name, last_name from people order by id asc} 3
Die mysqlexec-Anweisung sendet eine SQL-Anweisung an die mit dem MySQL-Handle assoziierte Datenbank. Wenn der Parameter sql_statement eine SQL-select-Anweisung enthält, gibt es keinen Fehler, es wird aber auch nichts ausgeführt.
Nehmen wir das Beispiel aus dem vorherigen Unterabschnitt:
% mysqlexec $mysql_handler {delete from people where id=26} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 1093} {Roberto {Castro Portela} 6507} % mysqlexec $mysql_handler \\ {insert into people (id, first_name, last_name, phone) values (58, "Carla", "di Bella", 8925)} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 1093} {Carla {di Bella} 8925} {Roberto {Castro Portela} 6507}Natürlich können andere SQL-Anweisungen als delete oder insert mit diesem Befehl an die Datenbank geschickt werden. Z. B. kann eine Zeile aktualisiert werden:
% mysqlexec $mysql_handler {update people set phone=3749 where first_name="James"} 1 % mysqlsel $mysql_handler {select first_name, last_name, phone from people order by id asc} -list {James Brooks 3749} {Carla {di Bella} 8925} {Roberto {Castro Portela} 6507}Die Anweisung mysqlexec gibt bei erfolgreicher Ausführung die Anzahl der von dem SQL-Befehl betroffenen Zeilen zurück.
Wie bereits gesehen, schliesst der Befehl mysqlclose eine Datenbankverbindung. Der Parameter für diese Anweisung ist das MySQL-Handle der Datenbankverbindung, die wir schliessen möchten.
Die MySQLTcl-Bibliothek verfügt über mehr als die in diesem Abschnitt gezeigten fünf Befehle. Diese Anweisungen erlauben den Abruf von Informationen über die Datenbank, die Maskierung von Zeichenketten, um sie für Abfragen aufzubereiten, verschachtelte Abfragen ... Eine gute Referenz ist die MySQLTcl-eigene Handbuchseite, die Teil der Installation der MySQLTcl-Bibliothek ist.
[1] eine etwas skeptische Betrachtung über John K. Ousterhout und Tcl:
http://www.softpanorama.org/People/Ousterhout/index.shtml
[2] ein Tutorial zu regulären Ausdrücken in Tcl:
http://www.mapfree.com/sbf/tcl/book/select/Html/7.html
TclTutor ist eine freie und interaktive Anwendung zum Erlernen von Tcl:
http://www.msen.com/~clif/TclTutor.html
MySQL-Dokumentation in verschiedenen Formaten (HTML, PDF...):
http://www.mysql.com/documentation/index.html