DMT php2hsql
Ein Beispiel, wie mit der Programmiersprache PHP der Zugriff auf eine HSQL-Datenbank gelingt.
HSQL- oder auch HyperSQL-Datenbanken werden z.B. eingesetzt bei Open Office bzw. Libre Office.
Das Problem
Eine Webrecherche führt zu vielen Treffern mit der Aussage, dass das nicht möglich ist.
ODBC
ODBC steht für: Open Database Connectivity.
DSN steht für: Data Source Name.
Manche Beiträge berichten davon, dass das mit Hilfe einer ODBC-Verbindung erreicht werden kann.
Leider habe ich kein einziges Beispiel gefunden für ODBC-DSN-Angaben, die für mich gültig sind.
Oder für einen Linux-ODBC-Treiber für die Anbindung einer HSQL-Datenbank.
Dann nützt dann leider auch das php-odbc-Modul nichts.
JDBC
JDBC steht für: Java Database Connectivity.
Und genau damit werden die HSQL-Datenbank betrieben.
Deshalb erfordert die Verwendung einer Datenbank bei Open Office / Libre Office die Installation von JAVA.
Auch hier argumentieren Beiträge, dass eine php-Anbindung nicht gelingt, weil php sich nicht auf JDBC versteht.
Die Lösung: PHP-JDBC Bridge
"PHP-JDBC Bridge" ermöglicht als Open-Source-Projekt die Verbindung von PHP zu einer HSQL-Datenbank.
Angeboten wird es z.B. als zip-Download auf GitHub: JCotton1123 php-jdbc-bridge.
Leider wollte ein Verbindungsaufbau trotz diverser online-Hinweise bei mir nicht gelingen.
Deswegen habe ich eine Lösung erarbeitet, die auf Linux-Systemen (wie z.B. Ubuntu) laufen sollte.
Installation
Nach dem Download von "PHP-JDBC Bridge" werden die Inhalte in einem geeigneten Verzeichnis ausgepackt.
Für das Kompilieren der Quelltexte werden die JAVA-Befehle javac
und jar
benötigt.
Evtl. muss dazu ein fehlendes Paket wie z.B. default-jdk
installiert werden.
Im Unterverzeichnis lib
befinden sich die beiden Dateien pjbridge.jar
und commons-daemon-1.2.2.jar
.
Für den Betrieb von "PHP-JDBC Bridge" benötigt werden diese beiden Dateien sowie PJBridge.php
aus dem php-Verzeichnis.
Diese drei Dateien kopiere ich an einen geeigneten Ort.
Anwendung
Was jetzt noch fehlt, sind gültige Angaben für den
- Start des JAVA-Dienstes
- und den PHP-Verbindungsaufbau zur HSQL-Datenbank.
Start des JAVA-Dienstes
Der JAVA-Dienst (im Beispiel "commons-daemon-1.2.2.jar") erlaubt den Aufbau einer PHP-Socketverbindung.
Der Start gelingt nach dem Schema:
java -cp 'BRIDGE.JAR:DAEMON.JAR:JDBC_ENGINE.JAR' Server [JDBC driver entry point] [PORT]
- BRIDGE.JAR: Pfad und Name zur "pjbridge.jar"-Bibliothek
- DAEMON.JAR: Pfad und Name zum "commons-daemon-1.2.2.jar"-Dienst
- JDBC_ENGINE.JAR: Pfad und Name zur Datenbank-Engine-jar-Datei, mit der die HSQL-Office-Datenbank betrieben wird
- JDBC driver entry point: eine gültige Angabe für einen sog. "entry point", bei mir: "org.hsqldb.jdbcDriver"
- PORT: Portnummer, unter der der Dienst erreichbar sein soll
Die Dateien habe ich nach meinem persönlichen Geschmack umbenannt.
Das größte Problem war der "JDBC driver entry point", den ich anhand ungültiger Beispiele letztlich geraten habe.
Wenn alle Dateien in einem Verzeichnis liegen, kann das in der Praxis so aussehen:
java -cp 'php-jdbc-bridge.jar:php-jdbc-daemon-1.2.2.jar:~/Dokumente/daten/database/hsqldb.jar' Server org.hsqldb.jdbcDriver 4444
Beim funktionierenden Start des JAVA-Dienstes sollte etwas in der Art ausgegeben werden:
notice: listening on 4444 notice: loaded org.hsqldb.jdbcDriver
PHP-Verbindungsaufbau zur HSQL-Datenbank
In der eigenen PHP-Datei muß "php-jdbc-bridge.php" eingebunden werden.
Diese Datei ist ein Datenbank-Wrapper, der diverse Befehle bereit stellt.
Für den PHP-Verbindungsaufbau wird ein gültiger "connection string" benötigt.
DSN-less Connection
Von einer "DSN-less Connection" ist die Rede, wenn beim Verbindungsaufbau nicht der Name einer "Data Source Name"-Datei angegeben wird,
sondern wenn alle benötigten Informationen in der Verbindungszeichenfolge stehen.
Benötigt werden hierzu Pfad und Name der Datenbank (ohne Dateiendung).
Der "connection string" sieht bei mir in PHP so aus: jdbc:hsqldb:file:~/Dokumente/daten/database/dmt
.
Als Benutzername wird "SA" und als Passwort "" angegeben, im Beispiel:
define ('DB_USER', 'SA'); define ('DB_PASS', ''); define ('CONNECTION_STRING', 'jdbc:hsqldb:file:~/Dokumente/daten/database/dmt'); require "php-jdbc-bridge.php"; $result = $gDB->connect(CONNECTION_STRING, DB_USER, DB_PASS)
Beispiel-Anwendung
Ich verwalte meine Termine in einer selbst geschriebenen Libre Office - Anwendung auf Basis einer HSQL-Datenbank.
Meine Termine möchte ich zusätzlich in zwei anderen Anwendungen sehen:
- dem GNOME-Kalender (mit vollständigen Daten)
- einem Erinnerungstool, das mir beim Login eine Liste fällig werdender Termine anzeigt
Performance
Zuerst wurden diese Daten über StarBasic-Routinen innerhalb der Office-Anwendung exportiert.
Da BASIC-Strings nur begrenzte Datenmengen aufnehmen, musste jeder Eintrag einzeln in die Zieldatei geschrieben werden.
PHP glänzt hier mit quasi unbegrenzten String-Variablen, deren Inhalte erst am Schluss auf den Datenträger geschrieben werden.
Auf meinem Core2Duo-Rechner gelingt der Export von 10.000 Termin-Datensätzen in
- StarBasic: 20 Sekunden
- PHP: 1 Sekunde
Download
- exportiere-termine.sh: ein Bash-Shellskript als Wrapper
- exportiere-termine.php: php-Skript zum Abruf und Export der HSQL-Datenbank-Inhalte
- check-running-gui.sh: ein Bash-Shellskript zur Erkennung der Umgebung (GUI/Terminal)
Das Beispiel-Shellskript erkennt die Umgebung (GUI/Terminal) und gibt dies an die php-Anwendung weiter.
Entsprechend erfolgen Rückmeldungen des Shellskripts oder der php-Routinen:
- sparsam in einem grafischen Popup
- oder ausführlicher auf Shell-Ebene.
Im Beispiel wird der JAVA-Dienst nach Erledigung der Aufgabe beendet.
Evtl. helfen die Angaben und die Datei-Beispiele, anderen Menschen Zeit und Nerven zu sparen :)
Info für Administratoren
PHP wird im Umfeld dieser Beispiel-Anwendung lokal eingesetzt.
Erstaunlicher Weise ist EDV-Administratoren selbst in großen Konzernen oft nicht bekannt, dass man PHP lokal betreiben kann.
Egal, ob auf Windows, Mac oder Linux: Es ist eine Bereicherung der vorhandenen Skript-Sprachen.