SQLite Zugriff von extern
SQLite ist eine hübsche kleine Datenbank mit vielen Möglichkeiten. Allerdings kennt sie keinen Client/Server Betrieb, so dass man nur lokal direkt auf die Daten zugreifen kann. Ich habe aktuell die Herausforderung, dass ich auf eine SQLite Datenbank über das Netz zugreifen muss, da ich mit den Daten quasi in Echtzeit auf einem anderen Rechner weiterverarbeite.
Konkret geht es um eine SQLite Datenbank auf einer Asterisk Telefonanlage, in der ich die Call Detail Records (CDR) abgreifern kann. Leider ist der Asterisk geschlossen und Module, die es mir leichter machen würden, die Daten gleich in eine externe Datenbank zu schreiben sind nicht vorhanden. Also brauche ich wohl oder übel die Trickkiste.
An welche Möglichkeiten habe ich schon gedacht?
- SQLite Datenbank (ca. 2MB) regelmäßig per rsync kopieren. Ist dann eben nicht in Echtzeit.
- Abfrage der Daten via ssh und sqlite Client auf der Telefonanlage. Ich bekomme dann aber nicht das benötigte Format oder ich bekomme zu viele Daten (Dump der kompletten DB) und es ist nicht in Echtzeit.
- Via sshfs das Verzeichnis auf dem externen Host einmounten und direkt auf die Datenbank zugreifen. Funktioniert sehr gut, bis auf das der Mount gelegentlich verschwindet. Eventuell kann ich das aber noch lösen.
Hat jemand noch weitere Ideen? Ich kann den SQLite auf der Telefonanlage nicht ersetzen und leider auch keine eigenen Module einbringen. Die schönen Module fehlen leider.
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Jochen am :
Auf dem Server startest du einfach einen Gofer-Proxy:
perl -MDBI::Gofer::Transport::stream -e run_stdio_hex
Und auf dem Client setzt du einfach eine Umgebungsvariable und tust im Rest des Perl-Codes einfach so, als waere die Datenbank lokal.
export DBI_AUTOPROXY='dbi:Gofer:transport=stream;url=ssh:user@host'
#!/usr/bin/perl -w
use DBI;
my $dbfile = 'test.sqlite'; -- liegt auf dem Server
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
my $sth = $dbh->prepare("SELECT * FROM t1") || die("could not prepare: $@\n");
$sth->execute || die("could not execute: $@ \n");
while(my $row = $sth->fetch) {
print join("|", @$row), "\n";
}
Marco am :