[CalendarServer-changes] [6989] CalendarServer/branches/users/glyph/dalify/txdav

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 16 06:36:57 PST 2011


Revision: 6989
          http://trac.macosforge.org/projects/calendarserver/changeset/6989
Author:   glyph at apple.com
Date:     2011-02-16 06:36:56 -0800 (Wed, 16 Feb 2011)
Log Message:
-----------
dalify ICalendar.resourceNamesSinceToken

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/dalify/txdav/caldav/datastore/test/common.py
    CalendarServer/branches/users/glyph/dalify/txdav/caldav/icalendarstore.py
    CalendarServer/branches/users/glyph/dalify/txdav/common/datastore/sql.py

Modified: CalendarServer/branches/users/glyph/dalify/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/branches/users/glyph/dalify/txdav/caldav/datastore/test/common.py	2011-02-16 14:36:45 UTC (rev 6988)
+++ CalendarServer/branches/users/glyph/dalify/txdav/caldav/datastore/test/common.py	2011-02-16 14:36:56 UTC (rev 6989)
@@ -1246,12 +1246,26 @@
         self.assertEquals((yield obj.dropboxID()), "some-dropbox-id")
 
 
+    def token2revision(self, token):
+        """
+        FIXME: the API names for L{syncToken}() and L{resourceNamesSinceToken}()
+        are slightly inaccurate; one doesn't produce input for the other.
+        Actually it should be resource names since I{revision} and you need to
+        understand the structure of the tokens to extract the revision.  Right
+        now that logic lives in the protocol layer, so this testing method
+        replicates it.
+        """
+        uuid, rev = token.split("#", 1)
+        rev = int(rev)
+        return rev
+
+
     @inlineCallbacks
     def test_simpleHomeSyncToken(self):
         """
         L{ICalendarHome.resourceNamesSinceToken} will return the names of
-        calenars created since L{ICalendarHome.syncToken} last returned a
-        particular value.
+        calendar objects created since L{ICalendarHome.syncToken} last returned
+        a particular value.
         """
         home = yield self.homeUnderTest()
         cal = yield self.calendarUnderTest()
@@ -1262,34 +1276,51 @@
         )
 
         yield cal.removeCalendarObjectWithName("2.ics")
+        yield home.createCalendarWithName("other-calendar")
         st2 = yield home.syncToken()
         self.failIfEquals(st, st2)
 
-        def token2revision(token):
-            # FIXME: the API name is a misnomer; there's syncToken() and
-            # resourceNamesSinceToken(), but actually it is resource names since
-            # *revision* and you need to understand the structure of the tokens
-            # to extract the revision.
-            uuid, rev = token.split("#", 1)
-            rev = int(rev)
-            return rev
-
         home = yield self.homeUnderTest()
 
         changed, deleted = yield home.resourceNamesSinceToken(
-            token2revision(st), "depth_is_ignored")
+            self.token2revision(st), "depth_is_ignored")
 
         self.assertEquals(set(changed), set(["calendar_1/new.ics",
-                                             "calendar_1/2.ics"]))
+                                             "calendar_1/2.ics",
+                                             "other-calendar/"]))
         self.assertEquals(set(deleted), set(["calendar_1/2.ics"]))
 
         changed, deleted = yield home.resourceNamesSinceToken(
-            token2revision(st2), "depth_is_ignored")
+            self.token2revision(st2), "depth_is_ignored")
         self.assertEquals(changed, [])
         self.assertEquals(deleted, [])
 
 
     @inlineCallbacks
+    def test_collectionSyncToken(self):
+        """
+        L{ICalendar.resourceNamesSinceToken} will return the names of calendar
+        objects changed or deleted since 
+        """
+        cal = yield self.calendarUnderTest()
+        st = yield cal.syncToken()
+        rev = self.token2revision(st)
+        yield cal.createCalendarObjectWithName("new.ics", VComponent.fromString(
+                self.eventWithDropbox
+            )
+        )
+        yield cal.removeCalendarObjectWithName("2.ics")
+        st2 = yield cal.syncToken()
+        rev2 = self.token2revision(st2)
+        changed, deleted = yield cal.resourceNamesSinceToken(rev)
+        self.assertEquals(set(changed), set(["new.ics"]))
+        self.assertEquals(set(deleted), set(["2.ics"]))
+        changed, deleted = yield cal.resourceNamesSinceToken(rev2)
+        self.assertEquals(set(changed), set([]))
+        self.assertEquals(set(deleted), set([]))
+
+
+    @inlineCallbacks
     def test_dropboxIDs(self):
         """
         L{ICalendarObject.getAllDropboxIDs} returns a L{Deferred} that fires

Modified: CalendarServer/branches/users/glyph/dalify/txdav/caldav/icalendarstore.py
===================================================================
--- CalendarServer/branches/users/glyph/dalify/txdav/caldav/icalendarstore.py	2011-02-16 14:36:45 UTC (rev 6988)
+++ CalendarServer/branches/users/glyph/dalify/txdav/caldav/icalendarstore.py	2011-02-16 14:36:56 UTC (rev 6989)
@@ -306,6 +306,13 @@
         """
 
 
+    def resourceNamesSinceToken(revision):
+        """
+        Low-level query to gather names for calendarObjectsSinceToken.
+        """
+
+
+
 class ICalendarObject(IDataStoreResource):
     """
     Calendar object

Modified: CalendarServer/branches/users/glyph/dalify/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/glyph/dalify/txdav/common/datastore/sql.py	2011-02-16 14:36:45 UTC (rev 6988)
+++ CalendarServer/branches/users/glyph/dalify/txdav/common/datastore/sql.py	2011-02-16 14:36:56 UTC (rev 6989)
@@ -1631,17 +1631,25 @@
         raise NotImplementedError()
 
 
+    @classproperty
+    def _objectNamesSinceRevisionQuery(cls):
+        """
+        DAL query for (resource, deleted-flag)
+        """
+        rev = cls._revisionsSchema
+        return Select([rev.RESOURCE_NAME, rev.DELETED],
+                      From=rev,
+                      Where=(rev.REVISION > Parameter("revision")).And(
+                          rev.RESOURCE_ID == Parameter("resourceID")))
+
+
     @inlineCallbacks
     def resourceNamesSinceToken(self, token):
         results = [
             (name if name else "", deleted)
             for name, deleted in
-            (yield self._txn.execSQL("""
-                select %(column_RESOURCE_NAME)s, %(column_DELETED)s from %(name)s
-                where %(column_REVISION)s > %%s and %(column_RESOURCE_ID)s = %%s
-                """ % self._revisionsTable,
-                [token, self._resourceID],
-            ))
+            (yield self._objectNamesSinceRevisionQuery.on(
+                self._txn, revision=token, resourceID=self._resourceID))
         ]
         results.sort(key=lambda x:x[1])
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110216/eba0701d/attachment-0001.html>


More information about the calendarserver-changes mailing list