[CalendarServer-changes] [13334] CalendarServer/trunk/txdav/caldav/datastore/sql.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 18 14:34:01 PDT 2014


Revision: 13334
          http://trac.calendarserver.org//changeset/13334
Author:   gaya at apple.com
Date:     2014-04-18 14:34:01 -0700 (Fri, 18 Apr 2014)
Log Message:
-----------
optimize CalendarObject.reconcileGroupAttendees() to only call Component.reconcileGroupAttendees() if group has changed

Modified Paths:
--------------
    CalendarServer/trunk/txdav/caldav/datastore/sql.py

Modified: CalendarServer/trunk/txdav/caldav/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-18 21:02:12 UTC (rev 13333)
+++ CalendarServer/trunk/txdav/caldav/datastore/sql.py	2014-04-18 21:34:01 UTC (rev 13334)
@@ -1931,7 +1931,7 @@
 
 
     @inlineCallbacks
-    def reconcileGroupAttendees(self, component):
+    def reconcileGroupAttendees(self, component, inserting=False):
         """
         reconcile group attendees
         """
@@ -1954,23 +1954,33 @@
                     [member.attendeeProperty(params={"MEMBER": groupCUA}) for member in members]
                 )
 
-        # sync group attendees
-        changed = component.reconcileGroupAttendees(groupCUAToAttendeeMemberPropMap)
-
         # save for post processing
         self._groupCUAToAttendeeMemberPropMap = groupCUAToAttendeeMemberPropMap
 
+        # sync group attendee members if inserting or group changed
+        changed = False
+        if inserting or (yield self.updateGROUP_ATTENDEE(groupCUAToAttendeeMemberPropMap)):
+            changed = component.reconcileGroupAttendees(groupCUAToAttendeeMemberPropMap)
+
+        # save for post processing when self._resourceID is non-zero
+        if inserting:
+            self._groupCUAToAttendeeMemberPropMap = groupCUAToAttendeeMemberPropMap
+
         returnValue(changed)
 
 
     @inlineCallbacks
-    def updateGROUP_ATTENDEE(self):
+    def updateGROUP_ATTENDEE(self, groupCUAToAttendeeMemberPropMap=None):
         """
         update schema.GROUP_ATTENDEE
         """
-        if not hasattr(self, "_groupCUAToAttendeeMemberPropMap"):
-            returnValue(None)
+        if groupCUAToAttendeeMemberPropMap is None:
+            if not hasattr(self, "_groupCUAToAttendeeMemberPropMap"):
+                returnValue(False)
+            else:
+                groupCUAToAttendeeMemberPropMap = self._groupCUAToAttendeeMemberPropMap
 
+        changed = False
         ga = schema.GROUP_ATTENDEE
         rows = yield Select(
             [ga.GROUP_ID, ga.MEMBERSHIP_HASH],
@@ -1979,7 +1989,7 @@
         ).on(self._txn)
         oldGAs = dict(rows)
 
-        for groupCUA, memberAttendeeProps in self._groupCUAToAttendeeMemberPropMap.iteritems():
+        for groupCUA, memberAttendeeProps in groupCUAToAttendeeMemberPropMap.iteritems():
             groupRecord = yield self.directoryService().recordWithCalendarUserAddress(groupCUA)
             if groupRecord:
                 members = set([(
@@ -2005,6 +2015,7 @@
                                 ga.GROUP_ID == groupID
                             )
                         ).on(self._txn)
+                        changed = True
                     del oldGAs[groupID]
                 else:
                     yield Insert({
@@ -2013,6 +2024,7 @@
                             ga.MEMBERSHIP_HASH: membershipHash,
                         }
                     ).on(self._txn)
+                    changed = True
 
         for groupID in oldGAs:
             yield Delete(
@@ -2021,8 +2033,11 @@
                     ga.GROUP_ID == groupID
                 )
             ).on(self._txn)
+            changed = True
 
+        returnValue(changed)
 
+
     def validCalendarDataCheck(self, component, inserting):
         """
         Check that the calendar data is valid iCalendar.
@@ -2435,7 +2450,7 @@
 
             # group attendees
             if scheduler.state == "organizer":
-                yield self.reconcileGroupAttendees(component)
+                yield self.reconcileGroupAttendees(component, inserting)
 
             # Set an attribute on this object to indicate that it is valid to check for an event split. We need to do this here so that if a timeout
             # occurs whilst doing implicit processing (most likely because the event is too big) we are able to subsequently detect that it is OK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140418/2949ebbc/attachment.html>


More information about the calendarserver-changes mailing list