[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