![]() |
#1
|
|||
|
|||
![]() Hallo,
ich versuche gerade den SyncML-Server zur Zusammenarbeit mit eGroupWare zu bewegen. eGroupWare hat bereits SyncML eingebaut, unterstützt aber nur v1.1. SyncML-Server unterstützt bereits v1.2. Die Synchronisierung der "Kontakte" funktioniert bereits. Folgendes Problem: die Kontakt-Tabelle der eGroupWare-DB hat ein Feld namens n_fn vom Typ varchar(128) in welchem Folgendes abgespeichert wird: n_fn = TITLE+" "+N_PREFIX+" "+N_FIRST+" "+N_LAST Wie kann ich im xml-File solch ein zusammengesetztes Feld definieren (beforewritescript, updatedatasql oder map)? Folgende mappings werden verwendet: <map name="n_prefix" references="N_PREFIX" type="string" mode="rw" size="64"/> <map name="n_family" references="N_LAST" type="string" mode="rw" size="64"/> <map name="n_given" references="N_FIRST" type="string" mode="rw" size="64"/> <map name="contact_title" references="TITLE" type="string" mode="rw" size="64"/> Vielen Dank Hanspeter |
#2
|
||||
|
||||
![]() Ich würde das im <beforewritescript> machen, so etwa:
Code:
<beforewritescript><[CDATA[ string fn; fn = TITLE+" "+N_PREFIX+" "+N_FIRST+" "+N_LAST; ]]></beforewritescript> Code:
<map name="n_fn" references="fn" type="string" mode="w" size="64"/>
__________________
Lukas Zeller, plan44.ch |
#3
|
|||
|
|||
![]() Hallo luz,
erstmal Danke. SyncML-Server schreibt jetzt das Feld korrekt in die DB. Leider ist die Modifikation des xml-Files doch komplizierter als es scheint. Ich schaffe nun, dass beim Sync die Daten des Handys in die DB geschrieben werden, aber die Daten der DB nicht ins Handy. Ein Update eines Kontakts im Handy wird auch in die DB übertragen aber ein Update eines Kontakts in der DB löscht den Kontakt im Handy. Ich denke mir, dass das damit zusammenhängt, dass "modified" in der eGroupWare-DB als UNIX_TIMESTAMP (in sec) und im SyncML-Server als ISO-Timestamp (2007-11-23 ...) behandelt wird. Ich habe nun zwei Möglichkeiten: 1. ich erzeuge eine neue Tabelle mit contact_id => INT NOT NULL und contact_modified_time => datetime sowie einen Trigger für INSERT, UPDATE und DELETE, der bei jeder Änderung in der Kontakt-Tabelle der DB automatisch die Änderungszeit (als ISO) in die neue Tabelle schreibt. Dann <selectidandmodifiedsql>SELECT contact_id, from_unixtime(contact_modified) FROM egw_addressbook WHERE contact_owner=%u %AF</selectidandmodifiedsql> und ändere <selectdatasql> so ab, dass dabei die Daten von der Kontakt-Tabelle und gleichzeitig die Änderungszeit von dieser zusätzlichen Tabelle eingelesen werden. -- oder -- 2. das xml-Skript liest über <map name="contact_modified" references="REV" type="timestamp" mode="r" size="0"/> die Änderungszeit als UNIX_TIMESTAMP ein und ein <afterreadscript> ändert den Wert in ISO um. Gibt es im Skript Funktionen, die diese Umwandlung unterstützen? Welche Lösung wäre sinnvoller (und einfacher zu implementieren)? Vielen Dank im Voraus Hans Peter |
#4
|
||||
|
||||
![]() Quote:
![]() ![]() Quote:
Eine über Änderungen hinaus persistente ID ist Voraussetzung für das Tracking von Modifikationen. Zum Problem mit dem Timestamp-Format: Die nächste Version (3.1 beta, 3.2) des Servers wird die diversen Unix-Timestamp-Formate auch für den "last modified" Zeitstempel anbieten (für Datenfelder existieren bereits entsprechende Feldtypen, s. bei der Beschreibung von <map>). Wenn die Datenbank offenbar eine Funktion from_unixtime() kennt (ich nehme an es handelt sich um MySQL), sehe ich aber auch ohne dieses Feature kein Problem. Dann reicht doch die Anpassung von <selectidandmodifiedsql> so wie Du es vorgeschlagen hast. Weshalb braucht es eine Zwischentabelle? Das REV-Feld im vCard (obwohl es sich auch auf das Änderungsdatum bezieht) ist für die Detektion von Änderungen gänzlich irrelevant. Das entsprechende <map> könnte man auch weglassen. REV wird nur gemappt, damit ein (menschlicher!) Empfänger sehen könnte, wann das vCard letztmals geändert wurde. Für den SyncML-Vorgang ist das ein Feld wie jedes andere und dessen Inhalt ist egal. Um dieses aber dennoch zu mappen, wenn der Timestamp ein Unix-Timestamp ist, reicht einfach: Code:
<map name="contact_modified" references="REV" type="unixtime_s" mode="r" size="0"/>
__________________
Lukas Zeller, plan44.ch |
#5
|
|||
|
|||
![]() Hallo Lukas,
es funktioniert! Mein Fehler lag darin, dass eGroupWare kein SYNCLVL-Feld vorsieht, bzw. dass das xml-Script dieses Feld benötigte. Deshalb wurden bei der 1 Sync alle Kontakte vom Handy in die DB übertragen, aber bei einer Änderung in der DB der Kontakt auf dem Handy gelöscht. Vielen Dank für die prompte Anwort. Ich werde mich jetzt an die Kalender/Aufgaben wagen. Hans Peter |
![]() |
Thread Tools | |
Display Modes | |
|
|