Synthesis AG - SyncML Discussion Forum  

Go Back   Synthesis AG - SyncML Discussion Forum > Synthesis SyncML-Produkte (deutsch) > SyncML-Server (Linux, Windows, MacOS X)

Reply
 
Thread Tools Display Modes
  #1  
Old 2007-11-18, 17:02
hp_taferner hp_taferner is offline
Junior Member
 
Join Date: 2007-11
Posts: 3
Default Concatenated field with separator

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
Reply With Quote
  #2  
Old 2007-11-19, 15:34
luz's Avatar
luz luz is offline
plan44.ch
 
Join Date: 2006-06
Posts: 348
Default Re: Concatenated field with separator

Ich würde das im <beforewritescript> machen, so etwa:

Code:
<beforewritescript><[CDATA[
  string fn;
  fn = TITLE+" "+N_PREFIX+" "+N_FIRST+" "+N_LAST;
]]></beforewritescript>
...und dann die Scriptvariable fn auf das entsprechende Datenbankfeld als write-only (die Information ist ja redundant) mappen:

Code:
<map name="n_fn" references="fn" type="string" mode="w" size="64"/>
__________________
Lukas Zeller, plan44.ch
Reply With Quote
  #3  
Old 2007-11-23, 19:10
hp_taferner hp_taferner is offline
Junior Member
 
Join Date: 2007-11
Posts: 3
Default Re: Concatenated field with separator

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
Reply With Quote
  #4  
Old 2007-11-24, 00:43
luz's Avatar
luz luz is offline
plan44.ch
 
Join Date: 2006-06
Posts: 348
Exclamation Re: Concatenated field with separator

Quote:
Leider ist die Modifikation des xml-Files doch komplizierter als es scheint.
Bei welchem Softwareproblem ist das nicht der Fall?

Quote:
...aber ein Update eines Kontakts in der DB löscht den Kontakt im Handy.
Das kann nicht mit dem Modified-Datum zu tun haben. Gelöscht wird nur dann, wenn eine ID verschwindet. Wenn eGroupware beim Ändern eines Kontakts die ID verändert, wird daraus beim Sync ein Löschen und ein Neuanlegen auf dem Endgerät.
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
Reply With Quote
  #5  
Old 2007-11-24, 18:48
hp_taferner hp_taferner is offline
Junior Member
 
Join Date: 2007-11
Posts: 3
Default Re: Concatenated field with separator

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
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 22:48.


Powered by vBulletin® Version 3.7.0
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.