[CalendarServer-changes] [6480] CalendarServer/trunk/txdav/common/datastore

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 28 13:21:30 PDT 2010


Revision: 6480
          http://trac.macosforge.org/projects/calendarserver/changeset/6480
Author:   cdaboo at apple.com
Date:     2010-10-28 13:21:28 -0700 (Thu, 28 Oct 2010)
Log Message:
-----------
Do more efficient tracking of valid child resources so we can minimize repeated SQL queries.

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

Modified: CalendarServer/trunk/txdav/common/datastore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql.py	2010-10-28 14:27:52 UTC (rev 6479)
+++ CalendarServer/trunk/txdav/common/datastore/sql.py	2010-10-28 20:21:28 UTC (rev 6480)
@@ -956,16 +956,13 @@
         returnValue(sorted([row[0] for row in rows]))
 
 
-    @memoized('name', '_objects')
     def objectResourceWithName(self, name):
         return self._makeObjectResource(name, None)
 
 
-    @memoized('uid', '_objects')
     def objectResourceWithUID(self, uid):
         return self._makeObjectResource(None, uid)
 
-
     @inlineCallbacks
     def _makeObjectResource(self, name, uid):
         """
@@ -973,25 +970,79 @@
         """
         objectResource = self._objectResourceClass(self, name, uid)
         objectResource = (yield objectResource.initFromStore())
+        if objectResource:
+            self._objects[objectResource.name()] = objectResource
+            self._objects[objectResource.uid()] = objectResource
+        else:
+            self._objects[name if name else uid] = None
         returnValue(objectResource)
 
 
     @inlineCallbacks
-    def createObjectResourceWithName(self, name, component):
-        if name.startswith("."):
-            raise ObjectResourceNameNotAllowedError(name)
+    def resourceNameForUID(self, uid):
+        try:
+            resource = self._objects[uid]
+            returnValue(resource.name() if resource else None)
+        except KeyError:
+            pass
 
-        rows = yield self._txn.execSQL(
-            "select %(column_RESOURCE_ID)s from %(name)s "
-            "where %(column_RESOURCE_NAME)s = %%s "
-            "and %(column_PARENT_RESOURCE_ID)s = %%s" % self._objectTable,
+        rows = yield self._txn.execSQL("""
+            select %(column_RESOURCE_NAME)s
+            from %(name)s
+            where %(column_UID)s = %%s and %(column_PARENT_RESOURCE_ID)s = %%s
+            """ % self._objectTable,
+            [uid, self._resourceID]
+        )
+        if rows:
+            returnValue(rows[0][0])
+        else:
+            self._objects[uid] = None
+            returnValue(None)
+
+    @inlineCallbacks
+    def resourceUIDForName(self, name):
+        try:
+            resource = self._objects[name]
+            returnValue(resource.uid() if resource else None)
+        except KeyError:
+            pass
+
+        rows = yield self._txn.execSQL("""
+            select %(column_UID)s
+            from %(name)s
+            where %(column_RESOURCE_NAME)s = %%s and %(column_PARENT_RESOURCE_ID)s = %%s
+            """ % self._objectTable,
             [name, self._resourceID]
         )
         if rows:
-            raise ObjectResourceNameAlreadyExistsError()
+            returnValue(rows[0][0])
+        else:
+            self._objects[name] = None
+            returnValue(None)
 
+
+    @inlineCallbacks
+    def createObjectResourceWithName(self, name, component):
+        if name.startswith("."):
+            raise ObjectResourceNameNotAllowedError(name)
+
+        if name in self._objects:
+            if self._objects[name]:
+                raise ObjectResourceNameAlreadyExistsError()
+        else:
+            rows = yield self._txn.execSQL(
+                "select %(column_RESOURCE_ID)s from %(name)s "
+                "where %(column_RESOURCE_NAME)s = %%s "
+                "and %(column_PARENT_RESOURCE_ID)s = %%s" % self._objectTable,
+                [name, self._resourceID]
+            )
+            if rows:
+                raise ObjectResourceNameAlreadyExistsError()
+
         objectResource = self._objectResourceClass(self, name, None)
         yield objectResource.setComponent(component, inserting=True)
+        self._objects[objectResource.name()] = objectResource
+        self._objects[objectResource.uid()] = objectResource
 
         # Note: setComponent triggers a notification, so we don't need to
         # call notify( ) here like we do for object removal.

Modified: CalendarServer/trunk/txdav/common/datastore/sql_legacy.py
===================================================================
--- CalendarServer/trunk/txdav/common/datastore/sql_legacy.py	2010-10-28 14:27:52 UTC (rev 6479)
+++ CalendarServer/trunk/txdav/common/datastore/sql_legacy.py	2010-10-28 20:21:28 UTC (rev 6480)
@@ -929,18 +929,14 @@
 
     @inlineCallbacks
     def resourceUIDForName(self, name):
-        obj = yield self.calendar.calendarObjectWithName(name)
-        if obj is None:
-            returnValue(None)
-        returnValue(obj.uid())
+        uid = yield self.calendar.resourceUIDForName(name)
+        returnValue(uid)
 
 
     @inlineCallbacks
     def resourceNameForUID(self, uid):
-        obj = yield self.calendar.calendarObjectWithUID(uid)
-        if obj is None:
-            returnValue(None)
-        returnValue(obj.name())
+        name = yield self.calendar.resourceNameForUID(uid)
+        returnValue(name)
 
 
     @inlineCallbacks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20101028/52a0e398/attachment.html>


More information about the calendarserver-changes mailing list