• Wie ich lese beschäftigen sich hier einige Entwickler ja auch mit sqlite.
    Ich kämpfe gerade mit einem Problem welches hier sicher auch auftauchen wird.


    Folgendes Szenario:


    Ein Programm (oder beim VDR ein Plugin) macht eine sqlite DB mit sqlite3_open auf und bekommt einen Connection Handle "*sqlite3"
    Mit diesem Handle wird dann eigentlich alles gemacht.


    Nun kommt ein externes Programm und arbeitet auf der selben sqlite DB und macht dann natürlich auch ein sqlite3_open und bekommt ein eigenes Handle auf den ich alles weiter mache.
    Soweit so gut.


    Ich will nun aber das das erste Programm über Änderungen an der DB informiert wird.
    Dazu gibt es


    Code
    void *sqlite3_update_hook(
      sqlite3*, 
      void(*)(void *,int ,char const *,char const *,sqlite3_int64),
      void*
    );


    Der Callback wird auch aufgerufen jedoch nur wenn der sqlite3* Handle der selbe ist. Das ist natürlich nicht der selbe wenn man es aus zwei Programmen auf macht.
    Abgesehen von inotify_event auf dem File, wobei ich dann nur weiß das sich was geändert hat, finde ich keine Möglichkeit mich über Änderungen in der DB informieren zu lassen.
    Das kann doch nicht sein oder?


    Das ist doch ein generelles Problem oder?
    Jemand eine Idee?

  • Datenbanken ersetzen keine Kommunikation.
    Entweder mit Krücken, sleep und einen Änderungszähler hochzählen.
    Oder zusätzliches Socket wo man die Anweisung arbeiten bekommt.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Abgesehen von inotify_event auf dem File, wobei ich dann nur weiß das sich was geändert hat, finde ich keine Möglichkeit mich über Änderungen in der DB informieren zu lassen.
    Das kann doch nicht sein oder?


    Naja, eigentlich schon. Weil, warum sollte ein anderes Programm über Änderungen informiert werden? Ne Datenbank verwaltet ja nur Daten, zwei verschiedene Programme Synchronisieren gehört eigentlich nicht zu den Aufgaben.


    Was hast du denn genau vor?


    cu

  • Du könntest den Callback verwenden um die Änderungen rauszuschreiben und im zwiten Prozess einzulesen. Aber so richtig schön klingt das nicht. Oder du markierst die aktualisierten Records auf geeignete Art und Synchronisierst sie dann. Richtig schön wird beides nicht. Wenn es ums vdr EPG geht, dann wäre der richtige Weg ein anderer - aber die ersten beiden sollten erstmal als Workaround funktionieren. Dritte Möglichkeit wäre ein Serverprozess, der dann alle verbundenen Clients informiert.

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • naja ich dachte es gibt einen allgemeingültigen weg wie ich mitbekomme wenn z.B. das sqlite eigenen cli die DB verändert.


    Ich dachte ich kann mich mit einer Art Inform an die DB hängen und bekomme dann info wenn sich was ändert. Idealerweise auch wenn das Programm das die DB ändert nicht von mir ist.



    Ich dachte es gibt vielleicht über den shared_cache mode eine Möglichkeit. So wie es aussieht, muss ich wohl weiter meinen externen trigger verwenden.

  • Moin!


    Der Hauptanwendungsbereich von sqlite ist nicht der gleichzeitige Zugriff von mehreren Prozessen auf eine Datenbank. Es ist eher dafür gedacht, dass ein Prozess etwas komfortabler seine Daten verwalten kann.
    Da bist du mit einem "richtigen" SQL-Server besser bedient, das gibt auch weniger Probleme bei den Locks. Gleichzeitiger (schreibender) Zugriff auf eine sqlite-DB funktioniert nur, wenn das zugrunde liegende Filesystem vernünftig File-Locks unterstützt. Sollte man bedenken.


    Zur Kommunikation kann ich ansonsten auch DBus empfehlen, damit schickst du einfach ein Signal raus, wieviele Empfänger es gibt (und ob überhaupt welche), spielt da keine Rolle. Ist genau für sowas gedacht.


    Lars.

  • Bin doch etwas enttäuscht von sqlite. :(
    Hätte gerade gedacht das so etwas geht.


    Auf einem Router z.B. hätte ich gedacht das ich die DB dafür verwenden kann.
    In der DB steht die globale Config. Wenn das Webinterface z.B. die DHCP Einstellungen verändert, dann wird der Callback im DHCP Server aufgerufen.
    Auf den embedded Geräten gibt es kein DBus.
    Klar haben die alle auch mehr oder weniger ein complexes message system aber so etwas wäre meiner Meinung nach auch etwas was man von einer sqlite erwarten könnte.
    Aber dafür ist es wohl wirklich nicht gemacht.
    Problem bei mir ist das ich keinen Zugriff auf die eine Applikation habe die in die DB schreibt. Bleibt also nur eine Krücke.

  • Bin doch etwas enttäuscht von sqlite. :(
    Hätte gerade gedacht das so etwas geht.


    Das könnte an deiner Erwartungshaltung liegen, auch ausgewachsene SQL-Datenbanken mit richtigen Datenbank-Servern informieren andere Prozesse nicht über Änderungen in den Daten. Das ist nicht deren Aufgabe.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • In der DB steht die globale Config. Wenn das Webinterface z.B. die DHCP Einstellungen verändert, dann wird der Callback im DHCP Server aufgerufen.


    Stand yaVDR nicht vor genau der selben Aufgabenstellung!? Da könnte man ja mal spicken um sich Anregungen zu holen ;) [ob nun ClearSilver oder sqlite ist ja vollkommen egal]


    Problem bei mir ist das ich keinen Zugriff auf die eine Applikation habe die in die DB schreibt.


    Dann kannst du eine vernünftige Lösung eh vergessen.


    cu

  • Stand yaVDR nicht vor genau der selben Aufgabenstellung!? Da könnte man ja mal spicken um sich Anregungen zu holen [ob nun ClearSilver oder sqlite ist ja vollkommen egal]


    Stimmt, denn es ist vollständig davon getrennt. Das Webfrontend schreibt etwas in eine Datenbank, und löst dann eine Signal aus.


    Theoretisches Beispiel, ein Username wird geändert und das Signal changeUser wird ausgeführt. Das Webfrontend hat nicht den blassesten Schimmer wer sich für das Signal interessiert. Deswegen hängt sich jedes betroffene Subsystem bei dem Signal ein.
    Allerdings denke ich nicht, dass das hier helfen wird. Da kommen mir neben DBUS eher Dinge wie RPCs, xmlRPCs, jsonRPCs, soap, ... in den Sinn.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Shared Databases sind IMMER!!! eine schlechte Schnittstelle. Es gibt faktisch keine sinnvolle Implementierung, die nicht ohne Verrenkung sicherstellen kann, dass konkurrierende Zugriffe nicht zu Anomalien führen. Transaktionen sind zwar eine Variante, aber es müssen eben alle Teilnehmer Transaktionen durchführen, wo wiederum die Problematik der Steuerung ist: wie bekomme ich eine unbekannte Anwendung dazu, genau nach meinen Regeln arbeiten zu lassen.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!