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

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 17 11:35:18 PDT 2012


Revision: 9727
          http://trac.macosforge.org/projects/calendarserver/changeset/9727
Author:   gaya at apple.com
Date:     2012-08-17 11:35:17 -0700 (Fri, 17 Aug 2012)
Log Message:
-----------
Init CommonHomeChild with owner home so that CommonHomeChild.ownerHome() works. Use CommonHomeChild.ownerHome() when loading property stores and sync tokens. Use query cacher when not CommonHomeChild.owned()

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

Modified: CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py	2012-08-17 18:01:51 UTC (rev 9726)
+++ CalendarServer/branches/users/gaya/inviteclean/twistedcaldav/sharing.py	2012-08-17 18:35:17 UTC (rev 9727)
@@ -592,7 +592,7 @@
                 yield self.sendInviteNotification(invitation, request, notificationState="DELETED")
         
         # Direct shares for  with valid sharee principal will already be deleted
-        yield self._newStoreObject.unshareWith(invitation._shareeHomeChild._home)
+        yield self._newStoreObject.unshareWith(invitation._shareeHomeChild.viewerHome())
     
         returnValue(True)            
 
@@ -902,7 +902,7 @@
         return self._shareeHomeChild.shareUID()
     
     def shareeUID(self):
-        return self._shareeHomeChild._home.uid()
+        return self._shareeHomeChild.viewerHome().uid()
    
     def access(self):
         return invitationAccessFromBindModeMap.get(self._shareeHomeChild.shareMode())
@@ -1072,13 +1072,10 @@
         if not child or child.owned():
             returnValue(None)
         
-        sharerHomeID = yield child.sharerHomeID()
-        sharerHome = yield self._newStoreHome._txn.homeWithResourceID(self._newStoreHome._homeType, sharerHomeID)
-        #FIXME: sharerHome = child.ownerHome() when it works
-        sharerHomeChild = yield sharerHome.childWithID(child._resourceID)
+        sharerHomeChild = yield child.ownerHome().childWithID(child._resourceID)
         
         # get the shared object's URL
-        sharer = self.principalForUID(sharerHomeChild._home.uid())
+        sharer = self.principalForUID(sharerHomeChild.viewerHome().uid())
         
         if not request:
             # FIXEME:  Fake up a request that can be used to get the sharer home resource
@@ -1238,7 +1235,7 @@
 
         
         if share.direct():
-            yield share._sharerHomeChild.unshareWith(share._shareeHomeChild._home)
+            yield share._sharerHomeChild.unshareWith(share._shareeHomeChild.viewerHome())
         else:
             yield share._sharerHomeChild.updateShare(share._shareeHomeChild, status=_BIND_STATUS_DECLINED)
 
@@ -1374,7 +1371,7 @@
     def uid(self):
         # Move to CommonHomeChild shareUID?
         if self._shareeHomeChild.shareMode() == _BIND_MODE_DIRECT:
-            return self.directUID(shareeHome=self._shareeHomeChild._home, sharerHomeChild=self._sharerHomeChild,)
+            return self.directUID(shareeHome=self._shareeHomeChild.viewerHome(), sharerHomeChild=self._sharerHomeChild,)
         else:
             return self._shareeHomeChild.shareUID()
     
@@ -1391,7 +1388,7 @@
         return self._shareeHomeChild.shareMessage()
 
     def shareeUID(self):
-        return self._shareeHomeChild._home.uid()
+        return self._shareeHomeChild.viewerHome().uid()
 
 class SharedCollectionsDatabase(AbstractSQLDatabase, LoggingMixIn):
     

Modified: CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py	2012-08-17 18:01:51 UTC (rev 9726)
+++ CalendarServer/branches/users/gaya/inviteclean/txdav/common/datastore/sql.py	2012-08-17 18:35:17 UTC (rev 9727)
@@ -1006,7 +1006,7 @@
                       From=home, Where=home.OWNER_UID == Parameter("ownerUID"))
 
     @classproperty
-    def _ownerFromFromResourceID(cls): #@NoSelf
+    def _ownerFromResourceID(cls): #@NoSelf
         home = cls._homeSchema
         return Select([home.OWNER_UID],
                       From=home,
@@ -1117,7 +1117,7 @@
     @classmethod
     @inlineCallbacks
     def homeUIDWithResourceID(cls, txn, rid):
-        rows = (yield cls._ownerFromFromResourceID.on(txn, resourceID=rid))
+        rows = (yield cls._ownerFromResourceID.on(txn, resourceID=rid))
         if rows:
             returnValue(rows[0][0])
         else:
@@ -1917,12 +1917,9 @@
                         self._txn, resourceID=self._resourceID, name=name)
                 )[0][0]
             else:
-                #FIXME: homeID=CommonHomeChild.ownerHome()._resourceID when it works
-                homeID = self.viewerHome()._resourceID if self.owned() else (yield self.sharerHomeID())
-
                 self._syncTokenRevision = (
                     yield self._completelyNewRevisionQuery.on(
-                        self._txn, homeID=homeID,
+                        self._txn, homeID=self.ownerHome()._resourceID,
                         resourceID=self._resourceID, name=name)
                 )[0][0]
         self._maybeNotify()
@@ -1963,7 +1960,7 @@
     _objectTable = None
 
 
-    def __init__(self, home, name, resourceID, mode, status=None, message=None):
+    def __init__(self, home, name, resourceID, mode, status, message=None, ownerHome=None):
 
         if home._notifiers:
             childID = "%s/%s" % (home.uid(), name)
@@ -1978,6 +1975,7 @@
         self._bindMode = mode
         self._bindStatus = status
         self._bindMessage = message
+        self._ownerHome = home if ownerHome is None else ownerHome
         self._created = None
         self._modified = None
         self._objects = {}
@@ -2211,7 +2209,6 @@
                 
             if status:
                 shareeView._bindStatus = columnMap[bind.BIND_STATUS]
-                #TODO: Is is OK to always call _initSyncToken ?
                 if shareeView._bindStatus == _BIND_STATUS_ACCEPTED:
                     yield shareeView._initSyncToken()
                 elif shareeView._bindStatus == _BIND_STATUS_DECLINED:
@@ -2220,6 +2217,11 @@
             if message:
                 shareeView._bindMessage = columnMap[bind.MESSAGE]
             
+            queryCacher = self._txn._queryCacher
+            if queryCacher:
+                cacheKey = queryCacher.keyForObjectWithName(shareeView._home._resourceID, shareeView._name)
+                queryCacher.invalidateAfterCommit(self._txn, cacheKey)
+            
             shareeView._name = sharedname[0][0]
 
             # Must send notification to ensure cache invalidation occurs
@@ -2249,6 +2251,12 @@
         for shareeChild in shareeChildren:
             if not shareeChild.owned() and shareeChild._resourceID == self._resourceID:
                 shareeChild._deletedSyncToken(sharedRemoval=True);
+ 
+                queryCacher = self._txn._queryCacher
+                if queryCacher:
+                    cacheKey = queryCacher.keyForObjectWithName(shareeHome._resourceID, shareeChild._name)
+                    queryCacher.invalidateAfterCommit(self._txn, cacheKey)
+
                 break;
 
         bind = self._bindSchema
@@ -2336,10 +2344,9 @@
         )
 
     @classproperty
-    def _sharedBindForResourceIDAndNotHomeID(cls): #@NoSelf
+    def _sharedBindForResourceID(cls): #@NoSelf
         bind = cls._bindSchema
         return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
-                            .And(bind.HOME_RESOURCE_ID != Parameter("homeID"))
                             .And(bind.BIND_STATUS == _BIND_STATUS_ACCEPTED)
                             .And(bind.BIND_MODE != _BIND_MODE_OWN)
                             )
@@ -2358,23 +2365,25 @@
             L{CommonHomeChild} as a child of different L{CommonHome}s
         @rtype: a L{Deferred} which fires with a L{list} of L{ICalendar}s.
         """
+        if not self.owned():
+            returnValue([])
+
         # get all accepted binds
-        acceptedRows = yield self._sharedBindForResourceIDAndNotHomeID.on(
+        acceptedRows = yield self._sharedBindForResourceID.on(
             self._txn, resourceID=self._resourceID, homeID=self._home._resourceID
         )
 
         cls = self.__class__ # for ease of grepping...
         result = []
-        for bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage in acceptedRows: #@UnusedVariable
+        for bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage in acceptedRows: #@UnusedVariable
             assert bindStatus == _BIND_STATUS_ACCEPTED
             # TODO: this could all be issued in parallel; no need to serialize
             # the loop.
             new = cls(
-                home=(yield self._txn.homeWithResourceID(self._home._homeType,
-                                                    homeResourceID)),
+                home=(yield self._txn.homeWithResourceID(self._home._homeType, homeID)),
                 name=resourceName, resourceID=self._resourceID,
                 mode=bindMode, status=bindStatus,
-                message=bindMessage,
+                message=bindMessage, ownerHome=self._home
             )
             yield new.initFromStore()
             result.append(new)
@@ -2382,10 +2391,9 @@
 
 
     @classproperty
-    def _invitedBindForResourceIDAndNotHomeID(cls): #@NoSelf
+    def _invitedBindForResourceID(cls): #@NoSelf
         bind = cls._bindSchema
         return cls._bindFor((bind.RESOURCE_ID == Parameter("resourceID"))
-                            .And(bind.HOME_RESOURCE_ID != Parameter("homeID"))
                             .And(bind.BIND_STATUS != _BIND_STATUS_ACCEPTED)
                             )
 
@@ -2401,21 +2409,23 @@
             L{CommonHomeChild} as a child of different L{CommonHome}s
         @rtype: a L{Deferred} which fires with a L{list} of L{ICalendar}s.
         """
-        rows = yield self._invitedBindForResourceIDAndNotHomeID.on(
+        if not self.owned():
+            returnValue([])
+        
+        rows = yield self._invitedBindForResourceID.on(
             self._txn, resourceID=self._resourceID, homeID=self._home._resourceID,
         )
         cls = self.__class__ # for ease of grepping...
 
         result = []
-        for bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage in rows: #@UnusedVariable
+        for bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage in rows: #@UnusedVariable
             # TODO: this could all be issued in parallel; no need to serialize
             # the loop.
             new = cls(
-                home=(yield self._txn.homeWithResourceID(self._home._homeType,
-                                                    homeResourceID)),
+                home=(yield self._txn.homeWithResourceID(self._home._homeType, homeID)),
                 name=resourceName, resourceID=self._resourceID,
                 mode=bindMode, status=bindStatus,
-                message=bindMessage,
+                message=bindMessage, ownerHome=self._home
             )
             yield new.initFromStore()
 
@@ -2460,13 +2470,22 @@
 
         # Create the actual objects merging in properties
         for items in dataRows:
-            bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage = items[:6] #@UnusedVariable
+            bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = items[:6] #@UnusedVariable
             metadata=items[7:]
+            
+            if bindStatus == _BIND_MODE_OWN:
+                ownerHome = home
+            else:
+                #TODO: get all ownerHomeIDs at once
+                ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
+                                home._txn, resourceID=resourceID))[0][0]
+                ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+
             child = cls(
                 home=home,
                 name=resourceName, resourceID=resourceID,
                 mode=bindMode, status=bindStatus,
-                message=bindMessage,
+                message=bindMessage, ownerHome=ownerHome
             )
             for attr, value in zip(cls.metadataAttributes(), metadata):
                 setattr(child, attr, value)
@@ -2507,12 +2526,18 @@
         if not rows:
             returnValue(None)
 
-        bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+        
+        #TODO:  combine with _invitedBindForNameAndHomeID and sort results
+        ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
+                        home._txn, resourceID=resourceID))[0][0]
+        ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+
         child = cls(
             home=home,
             name=resourceName, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage
+            message=bindMessage, ownerHome=ownerHome,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -2544,25 +2569,26 @@
         rows = None
         queryCacher = home._txn._queryCacher
         
-        # FIXME: Only caching non-shared objects so that we don't need to invalidate in sql_legacy
-        # NOTE: Currently, r-9500, if shared caching is enabled, 
-        #       Six failures when the following CardDAVTester files are run together
-        #               CardDAVTester/scripts/tests/CalDAV/sharing-freebusy.xml
-        #               CardDAVTester/scripts/tests/CalDAV/sharing-notification-sync.xml
-        #
         if queryCacher:
             # Retrieve data from cache
             cacheKey = queryCacher.keyForObjectWithName(home._resourceID, name)
             rows = yield queryCacher.get(cacheKey)
             
-            #make sure we only cached non-shared
-            assert not rows or rows[0][0] == _BIND_MODE_OWN
-
         if rows is None:
             # No cached copy
             rows = yield cls._childForNameAndHomeID.on(home._txn, name=name, homeID=home._resourceID)
                     
-            if rows and queryCacher and rows[0][0] == _BIND_MODE_OWN:
+            if rows:
+                bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+                # get ownerHomeID                
+                if bindMode == _BIND_MODE_OWN:
+                    ownerHomeID = homeID
+                else:
+                    ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
+                                    home._txn, resourceID=resourceID))[0][0]
+                rows[0].append(ownerHomeID)
+            
+            if rows and queryCacher:
                 # Cache the result
                 queryCacher.setAfterCommit(home._txn, cacheKey, rows)
         
@@ -2570,12 +2596,18 @@
             returnValue(None)
 
         
-        bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage, ownerHomeID = rows[0] #@UnusedVariable
+        
+        if bindMode == _BIND_MODE_OWN:
+            ownerHome = home
+        else:
+            ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
+            
         child = cls(
             home=home,
             name=name, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage
+            message=bindMessage, ownerHome=ownerHome,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -2609,12 +2641,19 @@
         if not rows:
             returnValue(None)
                 
-        bindMode, homeResourceID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+        bindMode, homeID, resourceID, resourceName, bindStatus, bindMessage = rows[0] #@UnusedVariable
+        
+        if bindMode == _BIND_MODE_OWN:
+            ownerHome = home
+        else:
+            ownerHomeID = (yield cls._ownerHomeWithResourceID.on(
+                            home._txn, resourceID=resourceID))[0][0]
+            ownerHome = yield home._txn.homeWithResourceID(home._homeType, ownerHomeID)
         child = cls(
             home=home,
             name=resourceName, resourceID=resourceID,
             mode=bindMode, status=bindStatus,
-            message=bindMessage,
+            message=bindMessage,  ownerHome=ownerHome,
         )
         yield child.initFromStore()
         returnValue(child)
@@ -2644,7 +2683,7 @@
     def _bindInsertQuery(cls, **kw): #@NoSelf
         """
         DAL statement to create a bind entry that connects a collection to its
-        owner's home.
+        home.
         """
         bind = cls._bindSchema
         return Insert({
@@ -2690,7 +2729,7 @@
         )
 
         # Initialize other state
-        child = cls(home, name, resourceID, _BIND_MODE_OWN)
+        child = cls(home, name, resourceID, _BIND_MODE_OWN, _BIND_STATUS_ACCEPTED)
         child._created = _created
         child._modified = _modified
         yield child._loadPropertyStore()
@@ -2851,9 +2890,10 @@
 
     def ownerHome(self):
         """
-        (Don't use this method.  See interface documentation as to why.)
+        @see: L{ICalendar.ownerCalendarHome}
+        @see: L{IAddressbook.ownerAddessbookHome}
         """
-        return self._home
+        return self._ownerHome
 
 
     def viewerHome(self):
@@ -2865,7 +2905,7 @@
 
 
     @classproperty
-    def _ownerHomeFromResourceQuery(cls): #@NoSelf
+    def _ownerHomeWithResourceID(cls): #@NoSelf
         """
         DAL query to retrieve the home resource ID of the owner from the bound
         home-child ID.
@@ -2891,7 +2931,7 @@
             # we already know who the owner is.
             returnValue(self._home._resourceID)
         else:
-            rid = (yield self._ownerHomeFromResourceQuery.on(
+            rid = (yield self._ownerHomeWithResourceID.on(
                 self._txn, resourceID=self._resourceID))[0][0]
             returnValue(rid)
 
@@ -3160,18 +3200,9 @@
 
     @inlineCallbacks
     def _loadPropertyStore(self, props=None):
-        if self.owned():
-            defaultUser = self.ownerHome().uid()
-        else:
-            #FIXME: use defaultUser=CommonHomeChild.ownerHome() when it works
-            sharerHomeID = yield self.sharerHomeID()
-            sharerHome = yield self._txn.homeWithResourceID(self.viewerHome()._homeType,
-                                                            sharerHomeID)
-            defaultUser = sharerHome.uid()
-            
         if props is None:
             props = yield PropertyStore.load(
-                defaultUser,
+                self.ownerHome().uid(),
                 self.viewerHome().uid(),
                 self._txn,
                 self._resourceID,
@@ -3573,8 +3604,8 @@
         if props is None:
             if self._parentCollection.objectResourcesHaveProperties():
                 props = yield PropertyStore.load(
+                    self._parentCollection.viewerHome().uid(),
                     self._parentCollection.ownerHome().uid(),
-                    None,
                     self._txn,
                     self._resourceID,
                     created=created
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120817/8a0be8c2/attachment-0001.html>


More information about the calendarserver-changes mailing list