New content_history approach for calendar synchronization; fix various Sync issues

This commit is contained in:
Jörg Lehrke 2010-09-12 20:14:46 +00:00
parent 6fde93d15b
commit bb9190a669
3 changed files with 35 additions and 20 deletions

View File

@ -927,12 +927,12 @@ class calendar_boupdate extends calendar_bo
$event['alarm'][$id]['time'] = $this->date2ts($alarm['time'],true);
}
}
if (!isset($event['modified']))
if (!isset($event['modified']) || $event['modified'] > $this->now)
{
$event['modified'] = $this->now;
$event['modifier'] = $this->user;
}
if (empty($event['id']) && !isset($event['created']))
if (empty($event['id']) && (!isset($event['created']) || $event['created'] > $this->now))
{
$event['created'] = $this->now;
$event['creator'] = $this->user;
@ -1150,8 +1150,8 @@ class calendar_boupdate extends calendar_bo
{
if ($updateTS)
{
$GLOBALS['egw']->content ->updateTimeStamp('calendar', $cal_id, 'modify', $this->now);
$this->so->updateModified($cal_id, $this->now, $this->user);
$GLOBALS['egw']->contenthistory->updateTimeStamp('calendar', $cal_id, 'modify', $this->now);
//$this->so->updateModified($cal_id, $this->now, $this->user);
}
static $status2msg = array(
@ -1461,7 +1461,7 @@ class calendar_boupdate extends calendar_bo
$alarm['time'] = $this->date2ts($alarm['time'],true); // user to server-time
$GLOBALS['egw']->contenthistory->updateTimeStamp('calendar', $cal_id, 'modify', $this->now);
$this->so->updateModified($cal_id, $this->now, $this->user);
//$this->so->updateModified($cal_id, $this->now, $this->user);
return $this->so->save_alarm($cal_id,$alarm, $this->now);
}
@ -1482,7 +1482,7 @@ class calendar_boupdate extends calendar_bo
}
$GLOBALS['egw']->contenthistory->updateTimeStamp('calendar', $cal_id, 'modify', $this->now);
$this->so->updateModified($cal_id, $this->now, $this->user);
//$this->so->updateModified($cal_id, $this->now, $this->user);
return $this->so->delete_alarm($id, $this->now);
}
@ -1599,12 +1599,18 @@ class calendar_boupdate extends calendar_bo
$query[] = 'recur_type!='. MCAL_RECUR_NONE;
$query['cal_recurrence'] = 0;
}
else
elseif ($filter == 'exact')
{
$query[] = 'recur_type='.$event['recur_type'];
if ($event['recur_type'] != MCAL_RECUR_NONE)
{
$query[] = 'recur_type='.$event['recur_type'];
}
else
{
$query[] = 'recur_type IS NULL';
}
$query['cal_recurrence'] = $event['recurrence'];
}
if ($event['id'])
{
@ -1973,8 +1979,15 @@ class calendar_boupdate extends calendar_bo
unset($egwEvent['participants'][$attendee]);
}
}
// ORGANIZER is maybe missing
// ORGANIZER and Groups may be missing
unset($egwEvent['participants'][$egwEvent['owner']]);
foreach ($egwEvent['participants'] as $attendee => $status)
{
if (is_numeric($attendee) && $attendee < 0)
{
unset($egwEvent['participants'][$attendee]);
}
}
if (!empty($egwEvent['participants']))
{
if ($this->log)
@ -2026,7 +2039,7 @@ class calendar_boupdate extends calendar_bo
{
error_log(__FILE__.'['.__LINE__.'] '.__METHOD__.
'() missing event[recur_exception]: ' .
array2string($event['recur_exception']));
array2string($event['recur_exception'])."\n",3,$this->logfile);
}
continue;
}
@ -2050,12 +2063,10 @@ class calendar_boupdate extends calendar_bo
}
$matchingEvents[] = $egwEvent['id']; // exact match
}
if (!empty($event['uid']) &&
count($matchingEvents) > 1 || $filter != 'master' &&
$egwEvent['recur_type'] != MCAL_RECUR_NONE &&
empty($event['recur_type']))
if ($filter == 'exact' && !empty($event['uid']) && count($matchingEvents) > 1
|| $filter != 'master' && !empty($egwEvent['recur_type']) && empty($event['recur_type']))
{
// Unknown exception for existing series
if ($this->log)
{

View File

@ -133,7 +133,6 @@ class contenthistory
'sync_contentid' => $_id,
);
$ts = false;
if (($ts = $this->db->select(self::TABLE,$col,$where,__LINE__,__FILE__)->fetchColumn()))
{
$ts = $this->db->from_timestamp($ts);

View File

@ -89,12 +89,13 @@ class EGW_SyncML_State extends Horde_SyncML_State
$userItems = array();
foreach($readableItems as $guid)
{
if (preg_match('/'.$_appName.'-(\d+)$/', $guid, $matches))
if (preg_match('/'.$_appName.'-(\d+)(:(\d+))?/', $guid, $matches))
{
// We use only the real items' ids
$userItems[] = $matches[1];
}
}
$userItems = array_unique($userItems);
}
$idList = $GLOBALS['egw']->contenthistory->getHistory($_appName, $_action, $_ts, $userItems);
foreach ($idList as $idItem)
@ -603,14 +604,18 @@ class EGW_SyncML_State extends Horde_SyncML_State
$GLOBALS['egw']->db->delete('egw_contentmap', $where,
__LINE__, __FILE__, 'syncml');
// delete all EGw id's
// expire old EGw id's
$where = array(
'map_id' => $mapID,
'map_guid' => $guid,
);
$GLOBALS['egw']->db->delete('egw_contentmap', $where,
__LINE__, __FILE__, 'syncml');
/*
$data = array ('map_expired' => true);
$GLOBALS['egw']->db->update('egw_contentmap', $data, $where,
__LINE__, __FILE__, 'syncml');
*/
$data = $where + array(
'map_locuid' => $locid,
'map_timestamp' => $ts,