Vor kurzem habe ich bei der Baikal CalDAV Installation auf einem meiner Raspberry PIs einen Fehler festgestellt. Ein selten benutzter Kalender nahm zwar von allen Geräten (MacBook, iPad, iPhone) neue Termine klaglos an, aber die Synchronisation zwischen den Geräten funktionierte scheinbar überhaupt nicht. Alle anderen auf dem gleichen Account laufenden Kalender synchronisierten sich jedoch klaglos.
Der Übeltäter war wohl ein nicht ganz korrekt durchgelaufenes Update auf die neues Baikal Version. In der zum besagten Kalender gehörenden Zeile in der SQLite Tabelle Calendars war kein Wert für „synctoken“ eingetragen.
Eigentlich ist der Token für die Synchronisation eine einfache Zahl (Integer). Bei einer Änderung der Daten im Kalender wird der synctoken um eins erhöht. Jeder Client braucht dann nur seinen lokalen Token mit dem des Servers zu vergleichen und sieht sofort, ob es eine Änderung gegeben hat (ohne dafür jedes Mal alle Einträge des Kalenders vergleichen zu müssen). Wenn es also keinen eingetragenen Synctoken gibt, kann es auch mit der Synchronisation nicht klappen. Daher musste für die Fehlerbehebung einfach nur eine „1“ als Wert für synctoken eingetragen werden.
- Auf dem Baikal Server „sqlite3“ als Admin starten:
sudo sqlite3
- Die Datenbank von Baikal laden (ggf. den Pfad anpassen!) (Befehl mit Enter absenden):
.open /usr/share/nginx/www/baikal/Specific/db/db.sqlite
- Datenbankinhalt der Tabelle „calendars“ ausgeben lassen (Befehl mit Enter absenden):
SELECT * FROM calendars;
- Der Anfang der Ausgabe für jeden Kalender sieht so ähnlich aus:
ID|principals/BENUTZERNAME|KALENDERNAME|KALENDERID|SYNCTOKEN|KALENDERBESCHREIBUNG|2|#FARBCODE|BEGIN:VCALENDAR
Wenn an der Stelle SYNCTOKEN keine Zahl steht, sondern einfach zwei Striche (Pipe-Symbole) mit oder ohne Leerzeichen nacheinander kommen, dann ist der synctoken für diesen Kalender nicht gesetzt. Die ID (ganz vorne in der Zeile) für diesen Kalender merken.
- Synctoken manuell setzen (Befehl mit Ender absenden):
UPDATE calendars SET synctoken = 1 WHERE id = ID;
Bei diesem Befehl bitte das groß geschriebene ID am Ende durch die in Schritt 4 gemerkte Zahl (ID) ersetzen.
- sqlite3 beenden (Befehl mit Ender absenden):
.exit
Jetzt sollte auch dieser Kalender korrekt zwischen allen Geräten synchronisiert werden.
Vielen Dank!
Hat bei mir ein Sync Problem gelöst – und ich hatte schon meine Clients im Verdacht :D
Bei meiner sqlite3 Version (3.6.20) gabs allerdings den „.open“ Befehl nicht. Stattdessen habe ich „attach „db.sqlite“ as db1;“ verwendet und auf die calendars Tabelle mit „db1.calendars“ zugegriffen.