Revision: 6480 http://trac.macosforge.org/projects/calendarserver/changeset/6480 Author: cdaboo@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