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

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]

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:

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


Download

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:

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.