[CalendarServer-changes] [1784] CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav /directory/appleopendirectory.py

source_changes at macosforge.org source_changes at macosforge.org
Sat Aug 11 12:32:37 PDT 2007


Revision: 1784
          http://trac.macosforge.org/projects/calendarserver/changeset/1784
Author:   wsanchez at apple.com
Date:     2007-08-11 12:32:36 -0700 (Sat, 11 Aug 2007)

Log Message:
-----------
Pulled up r1771 r1772 r1773 r1775 r1778 r1782 from trunk.

Modified Paths:
--------------
    CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py

Modified: CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py	2007-08-10 21:20:10 UTC (rev 1783)
+++ CalendarServer/branches/release/CalendarServer-1.0-dev/twistedcaldav/directory/appleopendirectory.py	2007-08-11 19:32:36 UTC (rev 1784)
@@ -353,17 +353,12 @@
             DirectoryService.recordType_resources,
         )
 
-    def recordsForType(self, recordType):
-        """
-        @param recordType: a record type
-        @return: a dictionary containing all records for the given record
-        type.  Keys are short names and values are the cooresponding
-        OpenDirectoryRecord for the given record type.
-        """
+    def _storage(self, recordType):
         try:
             storage = self._records[recordType]
         except KeyError:
             self.reloadCache(recordType)
+            storage = self._records[recordType]
         else:
             if storage["status"] == "stale":
                 storage["status"] = "loading"
@@ -376,8 +371,17 @@
                 d = deferToThread(self.reloadCache, recordType)
                 d.addErrback(onError)
 
-        return self._records[recordType]["records"]
+        return storage
 
+    def recordsForType(self, recordType):
+        """
+        @param recordType: a record type
+        @return: a dictionary containing all records for the given record
+        type.  Keys are short names and values are the cooresponding
+        OpenDirectoryRecord for the given record type.
+        """
+        return self._storage(recordType)["records"]
+
     def listRecords(self, recordType):
         return self.recordsForType(recordType).itervalues()
 
@@ -390,6 +394,15 @@
             self.reloadCache(recordType, shortName)
             return self.recordsForType(recordType).get(shortName, None)
 
+    def recordWithGUID(self, guid):
+        # Override super's implementation with something faster.
+        for recordType in self.recordTypes():
+            record = self._storage(recordType)["guids"].get(guid, None)
+            if record:
+                return record
+        else:
+            return None
+
     def reloadCache(self, recordType, shortName=None):
         log.msg("Reloading %s record cache" % (recordType,))
 
@@ -434,8 +447,6 @@
             else:
                 query = dsquery.expression(dsquery.expression.AND, (subquery, query))
 
-        records = {}
-
         try:
             if query:
                 if isinstance(query, dsquery.match):
@@ -466,6 +477,9 @@
             log.msg("Open Directory (node=%s) error: %s" % (self.realmName, str(ex)))
             raise
 
+        records = {}
+        guids   = {}
+
         for (key, value) in results.iteritems():
             if self.requireComputerRecord:
                 services = value.get(dsattributes.kDSNAttrServicesLocator)
@@ -504,7 +518,7 @@
                     if proxy:
                         proxyGUIDs = (proxy,)
 
-            records[recordShortName] = OpenDirectoryRecord(
+            record = OpenDirectoryRecord(
                 service               = self,
                 recordType            = recordType,
                 guid                  = guid,
@@ -515,6 +529,7 @@
                 autoSchedule          = autoSchedule,
                 proxyGUIDs            = proxyGUIDs,
             )
+            records[recordShortName] = guids[guid] = record
 
             #log.debug("Populated record: %s" % (records[recordShortName],))
 
@@ -523,8 +538,9 @@
             # Replace the entire cache
             #
             storage = {
-                "status": "new",
+                "status" : "new",
                 "records": records,
+                "guids"  : guids,
             }
 
             def rot():
@@ -545,7 +561,9 @@
             # Update one record, if found
             #
             assert len(records) == 1, "shortName = %r, records = %r" % (shortName, len(records))
-            self._records[recordType]["records"][shortName] = records[recordShortName]
+            storage = self._records[recordType]
+            storage["records"][shortName] = record
+            storage["guids"][record.guid] = record
 
 class OpenDirectoryRecord(DirectoryRecord):
     """

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070811/c2e012f0/attachment.html


More information about the calendarserver-changes mailing list