[CalendarServer-changes] [10681] CalendarServer/trunk/twext/who/xml.py

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 11 12:08:51 PST 2013


Revision: 10681
          http://trac.calendarserver.org//changeset/10681
Author:   wsanchez at apple.com
Date:     2013-02-11 12:08:51 -0800 (Mon, 11 Feb 2013)
Log Message:
-----------
Avoid looking up recordTypes repeatedly in a loop within a loop.

Modified Paths:
--------------
    CalendarServer/trunk/twext/who/xml.py

Modified: CalendarServer/trunk/twext/who/xml.py
===================================================================
--- CalendarServer/trunk/twext/who/xml.py	2013-02-11 19:54:14 UTC (rev 10680)
+++ CalendarServer/trunk/twext/who/xml.py	2013-02-11 20:08:51 UTC (rev 10681)
@@ -396,10 +396,33 @@
 
     def updateRecords(self, records, create=False):
         self.flush()
-        etree = self.loadRecords(loadNow=True)
 
+        #
+        # Index the records to update by UID
+        #
         recordsByUID = dict(((record.uid, record) for record in records))
 
+        #
+        # Find the record types and field names that our parser can
+        # map to.
+        #
+        recordTypes = set()
+        for valueName in self.value.iterconstants():
+            recordType = getattr(valueName, "recordType", None)
+            if recordType is not None:
+                recordTypes.add(recordType)
+
+        fieldNames = set()
+        for elementName in self.element.iterconstants():
+            fieldName = getattr(elementName, "fieldName", None)
+            if fieldName is not None:
+                fieldNames.add(fieldName)
+
+        #
+        # Walk through the record nodes in the XML tree
+        #
+        etree = self.loadRecords(loadNow=True)
+
         directoryNode = etree.getroot()
 
         for recordNode in directoryNode.getchildren():
@@ -414,11 +437,8 @@
 
                 for (name, value) in record.fields.items():
                     if name == self.fieldName.recordType:
-                        # FIXME: This lookup of the record type value is a bit much to do in a loop
-                        for valueName in self.value.iterconstants():
-                            if getattr(valueName, "recordType", None) == value:
-                                recordNode.set(self.attribute.recordType.value, valueName.value)
-                                break
+                        if value in recordTypes:
+                            recordNode.set(self.attribute.recordType.value, valueName.value)
                         else:
                             raise AssertionError("Unknown record type: %r" % (value,))
                     else:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130211/43160850/attachment.html>


More information about the calendarserver-changes mailing list