From 3b030fc7ccb37115875de24d366fa12579d76760 Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Sat, 3 Apr 2010 23:43:52 -0400 Subject: [PATCH] Add support for a exceptionoriginaldate field. This field tracks the start date of the instance of the recurring event that an exception is for. This is needed for sync clients to be able to know if a specific recurring event instance has been deleted. Since if the exception starts on a different date (and not just a different time), it's impossible to match up the events representing exceptions with the list of exceptions in the Kronolith_Event object. Now that we have this information, we can get the list of events that represent exceptions (i.e. event_baseid == the uid of the original recurring event) and match them up with the list of exceptions in the $event->exceptions. Any left over dates in $event->exceptions represent instances of the recurring event that have been deleted. --- kronolith/edit.php | 1 + kronolith/lib/Driver/Sql.php | 13 +++++++------ kronolith/lib/Event/Sql.php | 6 ++++++ kronolith/scripts/sql/kronolith.mssql.sql | 1 + kronolith/scripts/sql/kronolith.mysql.sql | 1 + kronolith/scripts/sql/kronolith.oci8.sql | 1 + kronolith/scripts/sql/kronolith.pgsql.sql | 1 + kronolith/scripts/sql/kronolith.sql | 1 + kronolith/scripts/sql/kronolith.xml | 6 ++++++ .../upgrades/2010-04-03_add_exceptionoriginaldate.oci8.sql | 1 + .../upgrades/2010-04-03_add_exceptionoriginaldate.pgsql.sql | 1 + .../upgrades/2010-04-03_add_exceptionoriginaldate.sql | 1 + 12 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.oci8.sql create mode 100644 kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.pgsql.sql create mode 100644 kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.sql diff --git a/kronolith/edit.php b/kronolith/edit.php index ec6e192e1..bb4b1ab52 100644 --- a/kronolith/edit.php +++ b/kronolith/edit.php @@ -95,6 +95,7 @@ if ($exception = Horde_Util::getFormData('del_exception')) { $event->readForm(); $event->recurrence->setRecurType(Horde_Date_Recurrence::RECUR_NONE); $event->baseid = $uid; + $event->exceptionoriginaldate = $exception; break; diff --git a/kronolith/lib/Driver/Sql.php b/kronolith/lib/Driver/Sql.php index 6ad387fe5..9e1889635 100644 --- a/kronolith/lib/Driver/Sql.php +++ b/kronolith/lib/Driver/Sql.php @@ -330,8 +330,8 @@ class Kronolith_Driver_Sql extends Kronolith_Driver ' event_recurtype, event_recurenddate, event_recurinterval,' . ' event_recurdays, event_start, event_end, event_allday,' . ' event_alarm, event_alarm_methods, event_modified,' . - ' event_exceptions, event_creator_id, event_resources, event_baseid' . - ' FROM ' . $this->_params['table'] . + ' event_exceptions, event_creator_id, event_resources, event_baseid,' . + ' event_exceptionoriginaldate FROM ' . $this->_params['table'] . ' WHERE calendar_id = ?'; $values = array($this->calendar); @@ -445,8 +445,8 @@ class Kronolith_Driver_Sql extends Kronolith_Driver ' event_recurdays, event_start, event_end, event_allday,' . ' event_alarm, event_alarm_methods, event_modified,' . ' event_exceptions, event_creator_id, event_resources,' . - ' event_baseid FROM ' . $this->_params['table'] . - ' WHERE event_id = ? AND calendar_id = ?'; + ' event_baseid, event_exceptionoriginaldate FROM ' . + $this->_params['table'] . ' WHERE event_id = ? AND calendar_id = ?'; $values = array($eventId, $this->calendar); /* Log the query at a DEBUG log level. */ @@ -484,8 +484,9 @@ class Kronolith_Driver_Sql extends Kronolith_Driver ' event_recurtype, event_recurenddate, event_recurinterval,' . ' event_recurdays, event_start, event_end, event_allday,' . ' event_alarm, event_alarm_methods, event_modified,' . - ' event_exceptions, event_creator_id, event_resources' . - ' FROM ' . $this->_params['table'] . ' WHERE event_uid = ?'; + ' event_exceptions, event_creator_id, event_resources, event_baseid,' . + ' event_exceptionoriginaldate FROM ' . $this->_params['table'] . + ' WHERE event_uid = ?'; $values = array($uid); /* Optionally filter by calendar */ diff --git a/kronolith/lib/Event/Sql.php b/kronolith/lib/Event/Sql.php index c8b339b42..57c898836 100644 --- a/kronolith/lib/Event/Sql.php +++ b/kronolith/lib/Event/Sql.php @@ -140,6 +140,9 @@ class Kronolith_Event_Sql extends Kronolith_Event if (isset($SQLEvent['event_baseid'])) { $this->baseid = $SQLEvent['event_baseid']; } + if (isset($SQLEvent['event_exceptionoriginaldate'])) { + $this->exceptionoriginaldate = new Horde_Date($SQLEvent['event_exceptionoriginaldate']); + } $this->initialized = true; $this->stored = true; @@ -215,9 +218,12 @@ class Kronolith_Event_Sql extends Kronolith_Event $this->_properties['event_exceptions'] = implode(',', $this->recurrence->getExceptions()); } + /* Exception information */ if (!empty($this->baseid)) { $this->_properties['event_baseid'] = $this->baseid; + $this->_properties['event_exceptionoriginaldate'] = $this->exceptionoriginaldate; } + } public function getProperties() diff --git a/kronolith/scripts/sql/kronolith.mssql.sql b/kronolith/scripts/sql/kronolith.mssql.sql index 06b59bd93..5b77ea022 100644 --- a/kronolith/scripts/sql/kronolith.mssql.sql +++ b/kronolith/scripts/sql/kronolith.mssql.sql @@ -24,6 +24,7 @@ CREATE TABLE kronolith_events ( event_modified INT NOT NULL, event_private INT DEFAULT 0 NOT NULL, event_baseid VARCHAR(255) DEFAULT '', + event_exceptionoriginaldate DATETIME, PRIMARY KEY (event_id) ); diff --git a/kronolith/scripts/sql/kronolith.mysql.sql b/kronolith/scripts/sql/kronolith.mysql.sql index 70ca897cf..5c3858747 100644 --- a/kronolith/scripts/sql/kronolith.mysql.sql +++ b/kronolith/scripts/sql/kronolith.mysql.sql @@ -24,6 +24,7 @@ CREATE TABLE kronolith_events ( event_modified INT NOT NULL, event_private TINYINT DEFAULT 0 NOT NULL, event_baseid VARCHAR(255) DEFAULT '', + event_exceptionoriginaldate DATETIME, PRIMARY KEY (event_id) ); diff --git a/kronolith/scripts/sql/kronolith.oci8.sql b/kronolith/scripts/sql/kronolith.oci8.sql index c904ba9ea..584809400 100644 --- a/kronolith/scripts/sql/kronolith.oci8.sql +++ b/kronolith/scripts/sql/kronolith.oci8.sql @@ -24,6 +24,7 @@ CREATE TABLE kronolith_events ( event_modified NUMBER(16) NOT NULL, event_private NUMBER(1) DEFAULT 0 NOT NULL, event_baseid VARCHAR2(255) DEFAULT '', + event_exceptionoriginaldate DATE, -- PRIMARY KEY (event_id) diff --git a/kronolith/scripts/sql/kronolith.pgsql.sql b/kronolith/scripts/sql/kronolith.pgsql.sql index 2daa72ac0..c9edefb7b 100644 --- a/kronolith/scripts/sql/kronolith.pgsql.sql +++ b/kronolith/scripts/sql/kronolith.pgsql.sql @@ -24,6 +24,7 @@ CREATE TABLE kronolith_events ( event_modified INT NOT NULL, event_private INT DEFAULT 0 NOT NULL, event_baseid VARCHAR(255) DEFAULT '', + event_exceptionoriginaldate TIMESTAMP, PRIMARY KEY (event_id) ); diff --git a/kronolith/scripts/sql/kronolith.sql b/kronolith/scripts/sql/kronolith.sql index d76c10fc4..15f634525 100644 --- a/kronolith/scripts/sql/kronolith.sql +++ b/kronolith/scripts/sql/kronolith.sql @@ -24,6 +24,7 @@ CREATE TABLE kronolith_events ( event_modified INT NOT NULL, event_private INT DEFAULT 0 NOT NULL, event_baseid VARCHAR(255) DEFAULT '', + event_exceptionoriginaldate DATETIME, PRIMARY KEY (event_id) ); diff --git a/kronolith/scripts/sql/kronolith.xml b/kronolith/scripts/sql/kronolith.xml index f402a9f02..1680f5834 100644 --- a/kronolith/scripts/sql/kronolith.xml +++ b/kronolith/scripts/sql/kronolith.xml @@ -158,6 +158,12 @@ 255 + + event_exceptionoriginaldate + timestamp + + + kronolith_primary true diff --git a/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.oci8.sql b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.oci8.sql new file mode 100644 index 000000000..9f2234457 --- /dev/null +++ b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.oci8.sql @@ -0,0 +1 @@ +ALTER TABLE kronolith_events ADD event_exceptionoriginaldate DATE; diff --git a/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.pgsql.sql b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.pgsql.sql new file mode 100644 index 000000000..99a27b264 --- /dev/null +++ b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.pgsql.sql @@ -0,0 +1 @@ +ALTER TABLE kronolith_events ADD event_exceptionoriginaldate TIMESTAMP; diff --git a/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.sql b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.sql new file mode 100644 index 000000000..e0658b06c --- /dev/null +++ b/kronolith/scripts/upgrades/2010-04-03_add_exceptionoriginaldate.sql @@ -0,0 +1 @@ +ALTER TABLE kronolith_events ADD event_exceptionoriginaldate DATETIME; -- 2.11.0