[CalendarServer-changes] [9524] CalendarServer/branches/users/gaya/inviteclean

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 3 13:52:43 PDT 2012


Revision: 9524
          http://trac.macosforge.org/projects/calendarserver/changeset/9524
Author:   gaya at apple.com
Date:     2012-08-03 13:52:41 -0700 (Fri, 03 Aug 2012)
Log Message:
-----------
remove SQLLegacyShares and references

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/resource.py
    CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py
    CalendarServer/branches/users/gaya/inviteclean/txdav/caldav/datastore/sql.py
    CalendarServer/branches/users/gaya/inviteclean/txdav/carddav/datastore/sql.py
    CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py
    CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql_legacy.py

Modified: CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/resource.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/resource.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -2121,15 +2121,6 @@
 
         return props
 
-    def sharesDB(self):
-        """
-        Retrieve the new-style shares DB wrapper.
-        """
-        if not hasattr(self, "_sharesDB"):
-            self._sharesDB = self._newStoreHome.retrieveOldShares()
-        return self._sharesDB
-
-
     def url(self):
         return joinURL(self.parent.url(), self.name, "/")
 

Modified: CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -36,7 +36,7 @@
     _BIND_STATUS_INVALID
 from txdav.xml import element
 
-from twisted.internet.defer import succeed, inlineCallbacks, DeferredList,\
+from twisted.internet.defer import succeed, inlineCallbacks, DeferredList, \
     returnValue
 
 from twistedcaldav import customxml, caldavxml
@@ -51,11 +51,13 @@
 import os
 import types
 
-#FIXME: Get rid of this!
-#from txdav.common.datastore.sql import EADDRESSBOOKTYPE
+#FIXME: Get rid of these imports
+from twistedcaldav.directory.util import TRANSACTION_KEY
+# circular import
+#from txdav.common.datastore.sql import ECALENDARTYPE, EADDRESSBOOKTYPE
 ECALENDARTYPE = 0
 EADDRESSBOOKTYPE = 1
-ENOTIFICATIONTYPE = 2
+#ENOTIFICATIONTYPE = 2
 
 
 class SharedCollectionMixin(object):
@@ -272,7 +274,7 @@
         if isVirt:
             rtype = element.ResourceType(
                 *(
-                    tuple([child for child in rtype.children if child.qname() != customxml.SharedOwner.qname()]) +
+                    tuple([child for child in rtype.children if child.qname() != customxml.SharedOwner.qname()]) + 
                     (customxml.Shared(),)
                 )
             )
@@ -468,10 +470,10 @@
         elif self.isAddressBookCollection():
             shareeHome = yield self._newStoreObject._txn.addressbookHomeWithUID(shareeUID, create=True)
 
-        sharedName =  yield self._newStoreObject.shareWith(shareeHome,
+        sharedName = yield self._newStoreObject.shareWith(shareeHome,
                                                     mode=invitationAccessToBindModeMap[access],
                                                     status=_BIND_STATUS_INVITED,
-                                                    message=summary )
+                                                    message=summary)
         
         shareeHomeChild = yield shareeHome.invitedChildWithName(sharedName)
         invitation = Invitation(shareeHomeChild)
@@ -482,7 +484,7 @@
         mode = None if access is None else invitationAccessToBindModeMap[access]
         status = None if state is None else invitationStateToBindStatusMap[state]
 
-        yield self._newStoreObject.updateShare(invitation._shareeHomeChild, mode=mode, status=status, message=summary )
+        yield self._newStoreObject.updateShare(invitation._shareeHomeChild, mode=mode, status=status, message=summary)
         assert not access or access == invitation.access(), "access=%s != invitation.access()=%s" % (access, invitation.access())
         assert not state or state == invitation.state(), "state=%s != invitation.state()=%s" % (state, invitation.state())
         assert not summary or summary == invitation.summary(), "summary=%s != invitation.summary()=%s" % (summary, invitation.summary())
@@ -549,8 +551,8 @@
         if invitation:
             yield self._updateInvitation(invitation, access=invitationAccessMapFromXML[type(ace)], summary=summary)
         else:
-            invitation = yield self._createInvitation( 
-                                shareeUID=shareeUID, 
+            invitation = yield self._createInvitation(
+                                shareeUID=shareeUID,
                                 access=invitationAccessMapFromXML[type(ace)],
                                 summary=summary)
         # Send invite notification
@@ -846,7 +848,7 @@
 
     xmlDocHandlers = {
         customxml.InviteShare: _xmlHandleInvite,
-        customxml.InviteReply: _xmlHandleInviteReply,          
+        customxml.InviteReply: _xmlHandleInviteReply,
     }
 
     def POST_handler_content_type(self, request, contentType):
@@ -869,7 +871,7 @@
     "read-only"           : customxml.ReadAccess,
     "read-write"          : customxml.ReadWriteAccess,
 }
-invitationAccessMapFromXML = dict([(v,k) for k,v in invitationAccessMapToXML.iteritems()])
+invitationAccessMapFromXML = dict([(v, k) for k, v in invitationAccessMapToXML.iteritems()])
 
 invitationStatusMapToXML = {
     "NEEDS-ACTION" : customxml.InviteStatusNoResponse,
@@ -878,7 +880,7 @@
     "DELETED"      : customxml.InviteStatusDeleted,
     "INVALID"      : customxml.InviteStatusInvalid,
 }
-invitationStatusMapFromXML = dict([(v,k) for k,v in invitationStatusMapToXML.iteritems()])
+invitationStatusMapFromXML = dict([(v, k) for k, v in invitationStatusMapToXML.iteritems()])
 
 invitationStateToBindStatusMap = {
     "NEEDS-ACTION": _BIND_STATUS_INVITED,
@@ -886,13 +888,13 @@
     "DECLINED": _BIND_STATUS_DECLINED,
     "INVALID": _BIND_STATUS_INVALID,
 }
-invitationStateFromBindStatusMap = dict((v,k) for k, v in invitationStateToBindStatusMap.iteritems())
+invitationStateFromBindStatusMap = dict((v, k) for k, v in invitationStateToBindStatusMap.iteritems())
 invitationAccessToBindModeMap = {
     "own": _BIND_MODE_OWN,
     "read-only": _BIND_MODE_READ,
     "read-write": _BIND_MODE_WRITE,
     }
-invitationAccessFromBindModeMap = dict((v,k) for k, v in invitationAccessToBindModeMap.iteritems())
+invitationAccessFromBindModeMap = dict((v, k) for k, v in invitationAccessToBindModeMap.iteritems())
 
 class Invitation(object):
     """
@@ -1102,7 +1104,6 @@
                     # FIXEME:  Fake up a request that can be used to get the sharer home resource
                     class FakeRequest(object):pass
                     fakeRequest = FakeRequest()
-                    from twistedcaldav.directory.util import TRANSACTION_KEY
                     setattr(fakeRequest, TRANSACTION_KEY, self._newStoreHome._txn)
                     
                     if self._newStoreHome._homeType == ECALENDARTYPE:
@@ -1110,13 +1111,14 @@
                     elif self._newStoreHome._homeType == EADDRESSBOOKTYPE:
                         sharerHomeCollection = yield principal.addressBookHome(fakeRequest)
                     
-                    url =  joinURL(sharerHomeCollection.url(), sharerHomeChild.name())
+                    url = joinURL(sharerHomeCollection.url(), sharerHomeChild.name())
                     
                     
                     share = Share(shareeHomeChild=shareeHomeChild, sharerHomeChild=sharerHomeChild, url=url)
                     shares.append(share)
 
             # DEBUG ONLY
+            '''
             shares.sort(key=lambda share:share.uid())
             
             allRecords = yield self.sharesDB().allRecords()
@@ -1138,8 +1140,8 @@
                 print("MISMATCH old: %s" % oTestStrings)
                 print("MISMATCH new: %s" % testStrings)
                 assert False
+            '''
 
-
             self._allShares = dict([(share.name(), share) for share in shares])
             
         returnValue(self._allShares)
@@ -1192,17 +1194,20 @@
             share = oldShare
         else:
             if direct:
-                sharedName =  yield sharedCollection._newStoreObject.shareWith(shareeHome=self._newStoreHome,
+                sharedName = yield sharedCollection._newStoreObject.shareWith(shareeHome=self._newStoreHome,
                                                         mode=_BIND_MODE_DIRECT,
                                                         status=_BIND_STATUS_ACCEPTED,
-                                                        message=displayname )
+                                                        message=displayname)
                 
             else:
-                # nothing to do here.  Invite is accepted is already accepted
-                # legacy code always renamed share here:
-                # sharedName = yield sharedCollection._newStoreObject.updateShare(invitation._shareeHomeChild, name=str(uuid4()) )
+                # FIXME:  clean the logic up here. Add or update the share in caller acceptInviteShare() or (acceptDirectShare() or directShare())
+                # Nothing to do here.  Invite is accepted, sync token inited
+                # legacy code always renamed share here with side effect of calling shareeHomeChild._initSyncToken().
+                #    sharedName = yield sharedCollection._newStoreObject.updateShare(invitation._shareeHomeChild, name=str(uuid4()) )
                 # without rename, share name is the same as inviteUID
-                # share name is the same as inviteUID
+                #
+                # NOTE: if bind.RESOURCE_NAME is not changed to be != invite.inviteUID the entire INVITE table is not needed
+                #
                 sharedName = shareUID
             
             # this is similar to legacy code
@@ -1238,8 +1243,8 @@
 
         # Return the URL of the shared collection
         returnValue(XMLResponse(
-            code = responsecode.OK,
-            element = customxml.SharedAs(
+            code=responsecode.OK,
+            element=customxml.SharedAs(
                 element.HRef.fromString(joinURL(self.url(), share.name()))
             )
         ))
@@ -1281,7 +1286,7 @@
         if share.direct():
             yield share._sharerHomeChild.unshareWith(share._shareeHomeChild._home)
         else:
-            yield share._sharerHomeChild.updateShare(share._shareeHomeChild, status=_BIND_STATUS_DECLINED )
+            yield share._sharerHomeChild.updateShare(share._shareeHomeChild, status=_BIND_STATUS_DECLINED)
 
 
     @inlineCallbacks

Modified: CalendarServer/branches/users/gaya/inviteclean/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/txdav/caldav/datastore/sql.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/txdav/caldav/datastore/sql.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -53,7 +53,7 @@
 from txdav.common.datastore.sql import CommonHome, CommonHomeChild,\
     CommonObjectResource, ECALENDARTYPE
 from txdav.common.datastore.sql_legacy import PostgresLegacyIndexEmulator,\
-    SQLLegacyCalendarShares, PostgresLegacyInboxIndexEmulator
+    PostgresLegacyInboxIndexEmulator
 from txdav.common.datastore.sql_tables import CALENDAR_TABLE,\
     CALENDAR_BIND_TABLE, CALENDAR_OBJECT_REVISIONS_TABLE, CALENDAR_OBJECT_TABLE,\
     _ATTACHMENTS_MODE_NONE, _ATTACHMENTS_MODE_READ, _ATTACHMENTS_MODE_WRITE,\
@@ -114,7 +114,6 @@
 
         self._childClass = Calendar
         super(CalendarHome, self).__init__(transaction, ownerUID, notifiers)
-        self._shares = SQLLegacyCalendarShares(self)
 
 
     createCalendarWithName = CommonHome.createChildWithName

Modified: CalendarServer/branches/users/gaya/inviteclean/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/txdav/carddav/datastore/sql.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/txdav/carddav/datastore/sql.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -38,8 +38,7 @@
 from twistedcaldav.memcacher import Memcacher
 from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
 
-from txdav.common.datastore.sql_legacy import \
-    PostgresLegacyABIndexEmulator, SQLLegacyAddressBookShares
+from txdav.common.datastore.sql_legacy import PostgresLegacyABIndexEmulator
 
 from txdav.carddav.datastore.util import validateAddressBookComponent
 from txdav.carddav.iaddressbookstore import IAddressBookHome, IAddressBook,\
@@ -90,7 +89,6 @@
 
         self._childClass = AddressBook
         super(AddressBookHome, self).__init__(transaction, ownerUID, notifiers)
-        self._shares = SQLLegacyAddressBookShares(self)
 
 
     addressbooks = CommonHome.children

Modified: CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -898,7 +898,6 @@
         self._txn = transaction
         self._ownerUID = ownerUID
         self._resourceID = None
-        self._shares = None
         self._childrenLoaded = False
         self._children = {}
         self._notifiers = notifiers
@@ -1073,10 +1072,6 @@
         return self._txn
 
 
-    def retrieveOldShares(self):
-        return self._shares
-
-
     def name(self):
         """
         Implement L{IDataStoreObject.name} to return the uid.
@@ -2060,7 +2055,7 @@
         @type shareeHome: L{CommonHome}
 
         @param mode: The sharing mode; L{_BIND_MODE_READ} or
-            L{_BIND_MODE_WRITE}.
+            L{_BIND_MODE_WRITE} or L{_BIND_MODE_DIRECT}
         @type mode: L{str}
 
         @param status: The sharing mode; L{_BIND_STATUS_INVITED} or
@@ -2088,11 +2083,12 @@
                 seenByOwner=True, seenBySharee=True,
                 bindStatus=status, message=message
             )
-            yield self._inviteInsertQuery.on(
-                subt, uid=newName, name="unused",
-                homeID=shareeHome._resourceID, resourceID=self._resourceID,
-                recipient="unused"
-            )
+            if mode != _BIND_MODE_DIRECT:
+                yield self._inviteInsertQuery.on(
+                    subt, uid=newName, name="unused",
+                    homeID=shareeHome._resourceID, resourceID=self._resourceID,
+                    recipient="unused"
+                )
             returnValue(newName)
         try:
             sharedName = yield self._txn.subtransaction(doInsert)

Modified: CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql_legacy.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql_legacy.py	2012-08-03 17:38:10 UTC (rev 9523)
+++ CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql_legacy.py	2012-08-03 20:52:41 UTC (rev 9524)
@@ -34,18 +34,13 @@
     calendarqueryfilter, calendarquery, addressbookquery, expression, \
     addressbookqueryfilter
 from twistedcaldav.query.sqlgenerator import sqlgenerator
-from twistedcaldav.sharing import SharedCollectionRecord
 
 from txdav.caldav.icalendarstore import TimeRangeLowerLimit, TimeRangeUpperLimit
 from txdav.common.icommondatastore import IndexedSearchException, \
     ReservationError, NoSuchObjectResourceError
 
-from txdav.common.datastore.sql_tables import (
-    _BIND_MODE_OWN, _BIND_MODE_DIRECT,_BIND_STATUS_ACCEPTED,
-    _BIND_STATUS_DECLINED,CALENDAR_BIND_TABLE, CALENDAR_HOME_TABLE,
-    ADDRESSBOOK_HOME_TABLE, ADDRESSBOOK_BIND_TABLE, schema)
-from twext.enterprise.dal.syntax import Delete, Insert, Parameter, \
-    SavepointAction, Select, Update 
+from txdav.common.datastore.sql_tables import schema
+from twext.enterprise.dal.syntax import Parameter, Select 
 from twext.python.clsprop import classproperty
 from twext.python.log import Logger, LoggingMixIn
 
@@ -102,301 +97,6 @@
         return self._collection.removeNotificationObjectWithName(name)
 
 
-class SQLLegacyShares(object):
-
-    _homeTable = None
-    _bindTable = None
-    _urlTopSegment = None
-
-    _homeSchema = None
-    _bindSchema = None
-
-    def __init__(self, home):
-        self._home = home
-
-
-    @property
-    def _txn(self):
-        return self._home._txn
-
-
-    def _getHomeWithUID(self, uid):
-        raise NotImplementedError()
-
-
-    def create(self):
-        pass
-
-
-    def remove(self):
-        pass
-
-
-    @classproperty
-    def _allSharedToQuery(cls): #@NoSelf
-        bind = cls._bindSchema
-        return Select(
-            [bind.RESOURCE_ID, bind.RESOURCE_NAME,
-             bind.BIND_MODE, bind.MESSAGE],
-            From=bind,
-            Where=(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-            .And(bind.BIND_MODE != _BIND_MODE_OWN)
-            .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
-        )
-
-
-    @classproperty
-    def _inviteUIDByResourceIDsQuery(cls): #@NoSelf
-        inv = schema.INVITE
-        return Select(
-            [inv.INVITE_UID], From=inv, Where=
-            (inv.RESOURCE_ID == Parameter("resourceID"))
-            .And(inv.HOME_RESOURCE_ID == Parameter("homeID"))
-        )
-
-
-    @classproperty
-    def _ownerHomeIDAndName(cls): #@NoSelf
-        bind = cls._bindSchema
-        return Select(
-            [bind.HOME_RESOURCE_ID, bind.RESOURCE_NAME], From=bind, Where=
-            (bind.RESOURCE_ID == Parameter("resourceID"))
-            .And(bind.BIND_MODE == _BIND_MODE_OWN)
-        )
-
-
-    @classproperty
-    def _ownerUIDFromHomeID(cls): #@NoSelf
-        home = cls._homeSchema
-        return Select(
-            [home.OWNER_UID], From=home,
-            Where=home.RESOURCE_ID == Parameter("homeID")
-        )
-
-
-
-
-    @inlineCallbacks
-    def allRecords(self):
-        # This should have been a smart join that got all these columns at
-        # once, but let's not bother to fix it, since the actual query we
-        # _want_ to do (just look for binds in a particular homes) is
-        # much simpler anyway; we should just do that.
-        all = []
-        shareRows = yield self._allSharedToQuery.on(
-            self._txn, homeID=self._home._resourceID)
-        for resourceID, resourceName, bindMode, summary in shareRows:
-            [[ownerHomeID, ownerResourceName]] = yield (
-                self._ownerHomeIDAndName.on(self._txn,
-                                            resourceID=resourceID))
-            [[ownerUID]] = yield self._ownerUIDFromHomeID.on(
-                self._txn, homeID=ownerHomeID)
-            hosturl = '/%s/__uids__/%s/%s' % (
-                self._urlTopSegment, ownerUID, ownerResourceName
-            )
-            localname = resourceName
-            if bindMode != _BIND_MODE_DIRECT:
-                sharetype = 'I'
-                [[shareuid]] = yield self._inviteUIDByResourceIDsQuery.on(
-                    self._txn, resourceID=resourceID,
-                    homeID=self._home._resourceID
-                )
-            else:
-                sharetype = 'D'
-                shareuid = "Direct-%s-%s" % (self._home._resourceID, resourceID,)
-            record = SharedCollectionRecord(
-                shareuid, sharetype, hosturl, localname, summary
-            )
-            all.append(record)
-        returnValue(all)
-
-    def directShareID(self, shareeHome, sharerCollection):
-        return "Direct-%s-%s" % (shareeHome._newStoreHome._resourceID, sharerCollection._newStoreObject._resourceID,)
-
-    @inlineCallbacks
-    def _search(self, **kw):
-        [[key, value]] = kw.items()
-        for record in (yield self.allRecords()):
-            if getattr(record, key) == value:
-                returnValue((record))
-
-
-    def recordForShareUID(self, shareUID):
-        return self._search(shareuid=shareUID)
-
-
-    @classproperty
-    def _updateBindName(cls): #@NoSelf
-        bind = cls._bindSchema
-        return Update({bind.RESOURCE_NAME: Parameter("localname")},
-                      Where=(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-                      .And(bind.RESOURCE_ID == Parameter('resourceID')))
-
-
-    @classproperty
-    def _acceptDirectShareQuery(cls): #@NoSelf
-        bind = cls._bindSchema
-        return Insert({
-            bind.HOME_RESOURCE_ID: Parameter("homeID"),
-            bind.RESOURCE_ID: Parameter("resourceID"), 
-            bind.RESOURCE_NAME: Parameter("name"),
-            bind.MESSAGE: Parameter("message"),
-            bind.BIND_MODE: _BIND_MODE_DIRECT,
-            bind.BIND_STATUS: _BIND_STATUS_ACCEPTED,
-            bind.SEEN_BY_OWNER: True,
-            bind.SEEN_BY_SHAREE: True,
-        })
-
-
-    @inlineCallbacks
-    def addOrUpdateRecord(self, record):
-        # record.hosturl -> /.../__uids__/<uid>/<name>
-        splithost = record.hosturl.split('/')
-
-        # Double-check the path
-        if splithost[2] != "__uids__":
-            raise ValueError(
-                "Sharing URL must be a __uids__ path: %s" % (record.hosturl,))
-
-        ownerUID = splithost[3]
-        ownerCollectionName = splithost[4]
-        ownerHome = yield self._getHomeWithUID(ownerUID)
-        ownerCollection = yield ownerHome.childWithName(ownerCollectionName)
-        collectionResourceID = ownerCollection._resourceID
-
-        if record.sharetype == 'I':
-            # There needs to be a bind already, one that corresponds to the
-            # invitation.  The invitation's UID is the same as the share UID.  I
-            # just need to update its 'localname', i.e.
-            # XXX_BIND.XXX_RESOURCE_NAME.
-
-            yield self._updateBindName.on(
-                self._txn, localname=record.localname,
-                homeID=self._home._resourceID, resourceID=collectionResourceID
-            )
-        elif record.sharetype == 'D':
-            # There is no bind entry already so add one - but be aware of possible race to create
-
-            # Use savepoint so we can do a partial rollback if there is a race condition
-            # where this row has already been inserted
-            savepoint = SavepointAction("addOrUpdateRecord")
-            yield savepoint.acquire(self._txn)
-
-            try:
-                yield self._acceptDirectShareQuery.on(
-                    self._txn, homeID=self._home._resourceID,
-                    resourceID=collectionResourceID, name=record.localname,
-                    message=record.summary
-                )
-            except Exception: # FIXME: Really want to trap the pg.DatabaseError but in a non-DB specific manner
-                yield savepoint.rollback(self._txn)
-
-                # For now we will assume that the insert already done is the winner - so nothing more to do here
-            else:
-                yield savepoint.release(self._txn)
-
-        shareeCollection = yield self._home.childWithName(record.localname)
-        yield shareeCollection._initSyncToken()
-
-
-    @classproperty
-    def _unbindShareQuery(cls): #@NoSelf
-        bind = cls._bindSchema
-        return Update({
-            bind.BIND_STATUS: _BIND_STATUS_DECLINED
-        }, Where=(bind.RESOURCE_NAME == Parameter("name"))
-        .And(bind.HOME_RESOURCE_ID == Parameter("homeID")))
-
-
-    @inlineCallbacks
-    def removeRecordForLocalName(self, localname):
-        record = yield self.recordForLocalName(localname)
-        shareeCollection = yield self._home.childWithName(record.localname)
-        yield shareeCollection._deletedSyncToken(sharedRemoval=True)
-
-        result = yield self._unbindShareQuery.on(self._txn, name=localname,
-                                                 homeID=self._home._resourceID)
-        returnValue(result)
-
-
-    @classproperty
-    def _removeInviteShareQuery(cls): #@NoSelf
-        """
-        DAL query to remove a non-direct share by invite UID.
-        """
-        bind = cls._bindSchema
-        inv = schema.INVITE
-        return Update(
-            {bind.BIND_STATUS: _BIND_STATUS_DECLINED},
-            Where=(bind.HOME_RESOURCE_ID, bind.RESOURCE_ID) ==
-            Select([inv.HOME_RESOURCE_ID, inv.RESOURCE_ID],
-                   From=inv, Where=inv.INVITE_UID == Parameter("uid")))
-
-
-    @classproperty
-    def _removeDirectShareQuery(cls): #@NoSelf
-        """
-        DAL query to remove a direct share by its homeID and resourceID.
-        """
-        bind = cls._bindSchema
-        return Delete(From=bind,
-                      Where=(bind.HOME_RESOURCE_ID == Parameter("homeID"))
-                      .And(bind.RESOURCE_ID == Parameter("resourceID")))
-
-
-    @inlineCallbacks
-    def removeRecordForShareUID(self, shareUID):
-
-        record = yield self.recordForShareUID(shareUID)
-        shareeCollection = yield self._home.childWithName(record.localname)
-        yield shareeCollection._deletedSyncToken(sharedRemoval=True)
-
-        if not shareUID.startswith("Direct"):
-            yield self._removeInviteShareQuery.on(self._txn, uid=shareUID)
-        else:
-            # Extract pieces from synthesised UID
-            homeID, resourceID = shareUID[len("Direct-"):].split("-")
-            # Now remove the binding for the direct share
-            yield self._removeDirectShareQuery.on(
-                self._txn, homeID=homeID, resourceID=resourceID)
-
-
-class SQLLegacyCalendarShares(SQLLegacyShares):
-    """
-    Emulator for the implicit interface specified by
-    L{twistedcaldav.sharing.InvitesDatabase}.
-    """
-
-    _homeTable = CALENDAR_HOME_TABLE
-    _bindTable = CALENDAR_BIND_TABLE
-    _homeSchema = schema.CALENDAR_HOME
-    _bindSchema = schema.CALENDAR_BIND
-    _urlTopSegment = "calendars"
-
-
-    def _getHomeWithUID(self, uid):
-        return self._txn.calendarHomeWithUID(uid, create=True)
-
-
-
-class SQLLegacyAddressBookShares(SQLLegacyShares):
-    """
-    Emulator for the implicit interface specified by
-    L{twistedcaldav.sharing.InvitesDatabase}.
-    """
-
-    _homeTable = ADDRESSBOOK_HOME_TABLE
-    _bindTable = ADDRESSBOOK_BIND_TABLE
-    _homeSchema = schema.ADDRESSBOOK_HOME
-    _bindSchema = schema.ADDRESSBOOK_BIND
-    _urlTopSegment = "addressbooks"
-
-
-    def _getHomeWithUID(self, uid):
-        return self._txn.addressbookHomeWithUID(uid, create=True)
-
-
-
 class MemcachedUIDReserver(CachePoolUserMixIn, LoggingMixIn):
     def __init__(self, index, cachePool=None):
         self.index = index
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120803/09d7dfba/attachment-0001.html>


More information about the calendarserver-changes mailing list