[CalendarServer-changes] [14456] CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 19 17:47:23 PST 2015


Revision: 14456
          http://trac.calendarserver.org//changeset/14456
Author:   cdaboo at apple.com
Date:     2015-02-19 17:47:23 -0800 (Thu, 19 Feb 2015)
Log Message:
-----------
Use DAL Record for iMIP tokens.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py

Added Paths:
-----------
    CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/inbound.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -260,11 +260,11 @@
             return
 
         txn = self.store.newTransaction(label="MailReceiver.processDSN")
-        result = (yield txn.imipLookupByToken(token))
+        records = (yield txn.imipLookupByToken(token))
         yield txn.commit()
         try:
             # Note the results are returned as utf-8 encoded strings
-            organizer, attendee, _ignore_icaluid = result[0]
+            record = records[0]
         except:
             # This isn't a token we recognize
             log.error(
@@ -272,7 +272,7 @@
                 % (token, msgId))
             returnValue(self.UNKNOWN_TOKEN)
 
-        calendar.removeAllButOneAttendee(attendee)
+        calendar.removeAllButOneAttendee(record.attendee)
         calendar.getOrganizerProperty().setValue(organizer)
         for comp in calendar.subcomponents():
             if comp.name() == "VEVENT":
@@ -288,8 +288,11 @@
         log.warn("Mail gateway processing DSN %s" % (msgId,))
         txn = self.store.newTransaction(label="MailReceiver.processDSN")
         yield txn.enqueue(
-            IMIPReplyWork, organizer=organizer, attendee=attendee,
-            icalendarText=str(calendar))
+            IMIPReplyWork,
+            organizer=record.organizer,
+            attendee=record.attendee,
+            icalendarText=str(calendar)
+        )
         yield txn.commit()
         returnValue(self.INJECTION_SUBMITTED)
 
@@ -313,11 +316,11 @@
             returnValue(self.MALFORMED_TO_ADDRESS)
 
         txn = self.store.newTransaction(label="MailReceiver.processReply")
-        result = (yield txn.imipLookupByToken(token))
+        records = (yield txn.imipLookupByToken(token))
         yield txn.commit()
         try:
             # Note the results are returned as utf-8 encoded strings
-            organizer, attendee, _ignore_icaluid = result[0]
+            record = records[0]
         except:
             # This isn't a token we recognize
             log.error(
@@ -337,11 +340,11 @@
                 "in message %s" % (msg['Message-ID'],))
 
             toAddr = None
-            fromAddr = attendee[7:]
-            if organizer.startswith("mailto:"):
-                toAddr = organizer[7:]
-            elif organizer.startswith("urn:x-uid:"):
-                uid = organizer[10:]
+            fromAddr = record.attendee[7:]
+            if record.organizer.startswith("mailto:"):
+                toAddr = record.organizer[7:]
+            elif record.organizer.startswith("urn:x-uid:"):
+                uid = record.organizer[10:]
                 record = yield self.directory.recordWithUID(uid)
                 try:
                     if record and record.emailAddresses:
@@ -376,23 +379,23 @@
         calendar = Component.fromString(calBody)
         event = calendar.mainComponent()
 
-        calendar.removeAllButOneAttendee(attendee)
+        calendar.removeAllButOneAttendee(record.attendee)
         organizerProperty = calendar.getOrganizerProperty()
         if organizerProperty is None:
             # ORGANIZER is required per rfc2446 section 3.2.3
             log.warn(
                 "Mail gateway didn't find an ORGANIZER in REPLY %s"
                 % (msg['Message-ID'],))
-            event.addProperty(Property("ORGANIZER", organizer))
+            event.addProperty(Property("ORGANIZER", record.organizer))
         else:
-            organizerProperty.setValue(organizer)
+            organizerProperty.setValue(record.organizer)
 
         if not calendar.getAttendees():
             # The attendee we're expecting isn't there, so add it back
             # with a SCHEDULE-STATUS of SERVICE_UNAVAILABLE.
             # The organizer will then see that the reply was not successful.
             attendeeProp = Property(
-                "ATTENDEE", attendee,
+                "ATTENDEE", record.attendee,
                 params={
                     "SCHEDULE-STATUS": iTIPRequestStatus.SERVICE_UNAVAILABLE,
                 }
@@ -406,8 +409,11 @@
 
         txn = self.store.newTransaction(label="MailReceiver.processReply")
         yield txn.enqueue(
-            IMIPReplyWork, organizer=organizer, attendee=attendee,
-            icalendarText=str(calendar))
+            IMIPReplyWork,
+            organizer=record.organizer,
+            attendee=record.attendee,
+            icalendarText=str(calendar)
+        )
         yield txn.commit()
         returnValue(self.INJECTION_SUBMITTED)
 

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/outbound.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -364,28 +364,29 @@
 
             # Reuse or generate a token based on originator, toAddr, and
             # event uid
-            token = (yield txn.imipGetToken(originator, toAddr.lower(), icaluid))
-            if token is None:
+            record = (yield txn.imipGetToken(originator, toAddr.lower(), icaluid))
+            if record is None:
 
                 # Because in the past the originator was sometimes in mailto:
                 # form, lookup an existing token by mailto: as well
                 organizerProperty = calendar.getOrganizerProperty()
                 organizerEmailAddress = organizerProperty.parameterValue("EMAIL", None)
                 if organizerEmailAddress is not None:
-                    token = (yield txn.imipGetToken("mailto:%s" % (organizerEmailAddress.lower(),), toAddr.lower(), icaluid))
+                    record = (yield txn.imipGetToken("mailto:%s" % (organizerEmailAddress.lower(),), toAddr.lower(), icaluid))
 
-            if token is None:
-                token = (yield txn.imipCreateToken(originator, toAddr.lower(), icaluid))
+            if record is None:
+                record = (yield txn.imipCreateToken(originator, toAddr.lower(), icaluid))
                 self.log.debug("Mail gateway created token %s for %s "
                                "(originator), %s (recipient) and %s (icaluid)"
-                               % (token, originator, toAddr, icaluid))
+                               % (record.token, originator, toAddr, icaluid))
                 inviteState = "new"
 
             else:
                 self.log.debug("Mail gateway reusing token %s for %s "
                                "(originator), %s (recipient) and %s (icaluid)"
-                               % (token, originator, toAddr, icaluid))
+                               % (record.token, originator, toAddr, icaluid))
                 inviteState = "update"
+            token = record.token
 
             fullServerAddress = self.address
             _ignore_name, serverAddress = email.utils.parseaddr(fullServerAddress)

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -175,13 +175,13 @@
 
         # Make sure a known token *is* processed
         txn = self.store.newTransaction()
-        token = (yield txn.imipCreateToken(
+        record = (yield txn.imipCreateToken(
             "urn:x-uid:5A985493-EE2C-4665-94CF-4DFEA3A89500",
             "mailto:user02 at example.com",
             "1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C"
         ))
         yield txn.commit()
-        calBody = template % token
+        calBody = template % record.token
         result = (yield self.receiver.processDSN(calBody, "xyzzy"))
         self.assertEquals(result, MailReceiver.INJECTION_SUBMITTED)
 

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_mailgateway.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -44,9 +44,8 @@
             "icaluid1", token="token1")
         yield migrateTokensToStore(self.path, self.store)
         txn = self.store.newTransaction()
-        results = yield (txn.imipLookupByToken("token1"))
-        organizer, attendee, icaluid = results[0]
+        records = yield (txn.imipLookupByToken("token1"))
         yield txn.commit()
-        self.assertEquals(organizer, "urn:uuid:user01")
-        self.assertEquals(attendee, "mailto:attendee at example.com")
-        self.assertEquals(icaluid, "icaluid1")
+        self.assertEquals(records[0].organizer, "urn:uuid:user01")
+        self.assertEquals(records[0].attendee, "mailto:attendee at example.com")
+        self.assertEquals(records[0].icaluid, "icaluid1")

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/caldav/datastore/scheduling/imip/test/test_outbound.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -316,17 +316,17 @@
         yield JobItem.waitEmpty(self.store.newTransaction, reactor, 60)
 
         txn = self.store.newTransaction()
-        token = (yield txn.imipGetToken(
+        record = (yield txn.imipGetToken(
             ORGANIZER,
             ATTENDEE,
             ICALUID
         ))
-        self.assertTrue(token)
-        organizer, attendee, icaluid = (yield txn.imipLookupByToken(token))[0]
+        self.assertTrue(record is not None)
+        record = (yield txn.imipLookupByToken(record.token))[0]
         yield txn.commit()
-        self.assertEquals(organizer, ORGANIZER)
-        self.assertEquals(attendee, ATTENDEE)
-        self.assertEquals(icaluid, ICALUID)
+        self.assertEquals(record.organizer, ORGANIZER)
+        self.assertEquals(record.attendee, ATTENDEE)
+        self.assertEquals(record.icaluid, ICALUID)
 
 
     @inlineCallbacks
@@ -492,12 +492,12 @@
             if UID: # The organizer is local, and server is sending to remote
                     # attendee
                 txn = self.store.newTransaction()
-                token = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
+                record = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
                 yield txn.commit()
-                self.assertNotEquals(token, None)
+                self.assertNotEquals(record, None)
                 self.assertEquals(
                     msg["Reply-To"],
-                    "server+%s at example.com" % (token,))
+                    "server+%s at example.com" % (record.token,))
 
                 # Make sure attendee property for organizer exists and matches
                 # the CUA of the organizer property
@@ -529,31 +529,31 @@
     @inlineCallbacks
     def test_tokens(self):
         txn = self.store.newTransaction()
-        token = (yield txn.imipLookupByToken("xyzzy"))
+        self.assertEquals((yield txn.imipLookupByToken("xyzzy")), [])
         yield txn.commit()
-        self.assertEquals(token, [])
 
         txn = self.store.newTransaction()
-        token1 = (yield txn.imipCreateToken("organizer", "attendee", "icaluid"))
+        record1 = (yield txn.imipCreateToken("organizer", "attendee", "icaluid"))
         yield txn.commit()
 
         txn = self.store.newTransaction()
-        token2 = (yield txn.imipGetToken("organizer", "attendee", "icaluid"))
+        record2 = (yield txn.imipGetToken("organizer", "attendee", "icaluid"))
         yield txn.commit()
-        self.assertEquals(token1, token2)
+        self.assertEquals(record1.token, record2.token)
 
         txn = self.store.newTransaction()
+        record = (yield txn.imipLookupByToken(record1.token))[0]
         self.assertEquals(
-            (yield txn.imipLookupByToken(token1)),
-            [["organizer", "attendee", "icaluid"]])
+            [record.organizer, record.attendee, record.icaluid],
+            ["organizer", "attendee", "icaluid"])
         yield txn.commit()
 
         txn = self.store.newTransaction()
-        yield txn.imipRemoveToken(token1)
+        yield txn.imipRemoveToken(record1.token)
         yield txn.commit()
 
         txn = self.store.newTransaction()
-        self.assertEquals((yield txn.imipLookupByToken(token1)), [])
+        self.assertEquals((yield txn.imipLookupByToken(record1.token)), [])
         yield txn.commit()
 
 
@@ -568,7 +568,7 @@
         # Explictly store a token with mailto: CUA for organizer
         # (something that doesn't happen any more, but did in the past)
         txn = self.store.newTransaction()
-        origToken = (yield txn.imipCreateToken(
+        origRecord = (yield txn.imipCreateToken(
             organizerEmail,
             "mailto:attendee at example.com",
             "CFDD5E46-4F74-478A-9311-B3FF905449C3"
@@ -588,15 +588,15 @@
 
         # Verify we didn't create a new token...
         txn = self.store.newTransaction()
-        token = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
+        record = (yield txn.imipGetToken(inputOriginator, inputRecipient, UID))
         yield txn.commit()
-        self.assertEquals(token, None)
+        self.assertEquals(record, None)
 
         # But instead kept the old one...
         txn = self.store.newTransaction()
-        token = (yield txn.imipGetToken(organizerEmail, inputRecipient, UID))
+        record = (yield txn.imipGetToken(organizerEmail, inputRecipient, UID))
         yield txn.commit()
-        self.assertEquals(token, origToken)
+        self.assertEquals(record.token, origRecord.token)
 
 
     def generateSampleEmail(self, caltext=initialInviteText):

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -14,6 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
+from txdav.common.datastore.sql_imip import imipAPIMixin
 
 """
 SQL data store.
@@ -75,8 +76,7 @@
     HomeChildNameAlreadyExistsError, NoSuchHomeChildError, \
     ObjectResourceNameNotAllowedError, ObjectResourceNameAlreadyExistsError, \
     NoSuchObjectResourceError, AllRetriesFailed, InvalidSubscriptionValues, \
-    InvalidIMIPTokenValues, TooManyObjectResourcesError, \
-    SyncTokenValidException
+    TooManyObjectResourcesError, SyncTokenValidException
 from txdav.common.idirectoryservice import IStoreDirectoryService, \
     DirectoryRecordNotFoundError
 from txdav.common.inotifications import INotificationCollection, \
@@ -565,7 +565,10 @@
 
 
 
-class CommonStoreTransaction(GroupsAPIMixin, GroupCacherAPIMixin, DelegatesAPIMixin):
+class CommonStoreTransaction(
+    GroupsAPIMixin, GroupCacherAPIMixin, DelegatesAPIMixin,
+    imipAPIMixin,
+):
     """
     Transaction implementation for SQL database.
     """
@@ -921,121 +924,6 @@
         return self._apnSubscriptionsBySubscriberQuery.on(self, subscriberGUID=guid)
 
 
-    # Create IMIP token
-
-    @classproperty
-    def _insertIMIPTokenQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Insert({
-            imip.TOKEN: Parameter("token"),
-            imip.ORGANIZER: Parameter("organizer"),
-            imip.ATTENDEE: Parameter("attendee"),
-            imip.ICALUID: Parameter("icaluid"),
-        })
-
-
-    @inlineCallbacks
-    def imipCreateToken(self, organizer, attendee, icaluid, token=None):
-        if not (organizer and attendee and icaluid):
-            raise InvalidIMIPTokenValues()
-
-        if token is None:
-            token = str(uuid4())
-
-        try:
-            yield self._insertIMIPTokenQuery.on(
-                self,
-                token=token, organizer=organizer, attendee=attendee,
-                icaluid=icaluid)
-        except Exception:
-            # TODO: is it okay if someone else created the same row just now?
-            pass
-        returnValue(token)
-
-    # Lookup IMIP organizer+attendee+icaluid for token
-
-
-    @classproperty
-    def _selectIMIPTokenByTokenQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Select([imip.ORGANIZER, imip.ATTENDEE, imip.ICALUID], From=imip,
-                      Where=(imip.TOKEN == Parameter("token")))
-
-
-    def imipLookupByToken(self, token):
-        return self._selectIMIPTokenByTokenQuery.on(self, token=token)
-
-    # Lookup IMIP token for organizer+attendee+icaluid
-
-
-    @classproperty
-    def _selectIMIPTokenQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Select(
-            [imip.TOKEN],
-            From=imip,
-            Where=(imip.ORGANIZER == Parameter("organizer")).And(
-                imip.ATTENDEE == Parameter("attendee")).And(
-                imip.ICALUID == Parameter("icaluid"))
-        )
-
-
-    @classproperty
-    def _updateIMIPTokenQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Update(
-            {imip.ACCESSED: utcNowSQL, },
-            Where=(imip.ORGANIZER == Parameter("organizer")).And(
-                imip.ATTENDEE == Parameter("attendee")).And(
-                    imip.ICALUID == Parameter("icaluid"))
-        )
-
-
-    @inlineCallbacks
-    def imipGetToken(self, organizer, attendee, icaluid):
-        row = (yield self._selectIMIPTokenQuery.on(
-            self, organizer=organizer,
-            attendee=attendee, icaluid=icaluid))
-        if row:
-            token = row[0][0]
-            # update the timestamp
-            yield self._updateIMIPTokenQuery.on(
-                self, organizer=organizer,
-                attendee=attendee, icaluid=icaluid)
-        else:
-            token = None
-        returnValue(token)
-
-
-    # Remove IMIP token
-    @classproperty
-    def _removeIMIPTokenQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Delete(From=imip,
-                      Where=(imip.TOKEN == Parameter("token")))
-
-
-    def imipRemoveToken(self, token):
-        return self._removeIMIPTokenQuery.on(self, token=token)
-
-
-    # Purge old IMIP tokens
-    @classproperty
-    def _purgeOldIMIPTokensQuery(cls):
-        imip = schema.IMIP_TOKENS
-        return Delete(From=imip,
-                      Where=(imip.ACCESSED < Parameter("olderThan")))
-
-
-    def purgeOldIMIPTokens(self, olderThan):
-        """
-        @type olderThan: datetime
-        """
-        return self._purgeOldIMIPTokensQuery.on(self, olderThan=olderThan)
-
-    # End of IMIP
-
-
     def preCommit(self, operation):
         """
         Run things before C{commit}.  (Note: only provided by SQL

Added: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py	                        (rev 0)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/datastore/sql_imip.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -0,0 +1,102 @@
+# -*- test-case-name: twext.enterprise.dal.test.test_record -*-
+##
+# Copyright (c) 2015 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+from twext.enterprise.dal.record import SerializableRecord, fromTable
+from twext.enterprise.dal.syntax import utcNowSQL
+from twext.python.log import Logger
+from twisted.internet.defer import inlineCallbacks, returnValue
+from txdav.common.datastore.sql_tables import schema
+from txdav.common.icommondatastore import InvalidIMIPTokenValues
+from uuid import uuid4
+
+log = Logger()
+
+"""
+Classes and methods that relate to iMIP objects in the SQL store.
+"""
+
+class iMIPTokensRecord(SerializableRecord, fromTable(schema.IMIP_TOKENS)):
+    """
+    @DynamicAttrs
+    L{Record} for L{schema.IMIP_TOKENS}.
+    """
+    pass
+
+
+
+class imipAPIMixin(object):
+    """
+    A mixin for L{CommonStoreTransaction} that covers the iMIP API.
+    """
+
+    # Create IMIP token
+    @inlineCallbacks
+    def imipCreateToken(self, organizer, attendee, icaluid, token=None):
+        if not (organizer and attendee and icaluid):
+            raise InvalidIMIPTokenValues()
+
+        if token is None:
+            token = str(uuid4())
+
+        try:
+            record = yield iMIPTokensRecord.create(
+                self,
+                token=token,
+                organizer=organizer,
+                attendee=attendee,
+                icaluid=icaluid
+            )
+        except Exception:
+            # TODO: is it okay if someone else created the same row just now?
+            record = yield self.imipGetToken(organizer, attendee, icaluid)
+        returnValue(record)
+
+
+    # Lookup IMIP organizer+attendee+icaluid for token
+    def imipLookupByToken(self, token):
+        return iMIPTokensRecord.querysimple(self, token=token)
+
+
+    # Lookup IMIP token for organizer+attendee+icaluid
+    @inlineCallbacks
+    def imipGetToken(self, organizer, attendee, icaluid):
+        records = yield iMIPTokensRecord.querysimple(
+            self,
+            organizer=organizer,
+            attendee=attendee,
+            icaluid=icaluid,
+        )
+        if records:
+            # update the timestamp
+            record = records[0]
+            yield record.update(accessed=utcNowSQL)
+        else:
+            record = None
+        returnValue(record)
+
+
+    # Remove IMIP token
+    def imipRemoveToken(self, token):
+        return iMIPTokensRecord.deletesimple(self, token=token)
+
+
+    # Purge old IMIP tokens
+    def purgeOldIMIPTokens(self, olderThan):
+        """
+        @type olderThan: datetime
+        """
+        return iMIPTokensRecord.delete(self, iMIPTokensRecord.accessed < olderThan)

Modified: CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py
===================================================================
--- CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py	2015-02-20 00:00:46 UTC (rev 14455)
+++ CalendarServer/branches/users/cdaboo/pod2pod-migration/txdav/common/icommondatastore.py	2015-02-20 01:47:23 UTC (rev 14456)
@@ -389,8 +389,8 @@
         """
         Returns the organizer, attendee, and icaluid corresponding to the token
 
-        @param token: the token to look up
-        @type token: C{str}
+        @param token: the token record
+        @type token: L{Record}
         """
 
     def imipGetToken(organizer, attendee, icaluid): #@NoSelf
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20150219/7cbc1d4e/attachment-0001.html>


More information about the calendarserver-changes mailing list