[CalendarServer-changes] [1439]
CalendarServer/branches/users/cdaboo/fast-multiget-1425/
twistedcaldav/method/report_calquery.py
source_changes at macosforge.org
source_changes at macosforge.org
Fri Mar 30 13:38:32 PDT 2007
Revision: 1439
http://trac.macosforge.org/projects/calendarserver/changeset/1439
Author: cdaboo at apple.com
Date: 2007-03-30 13:38:32 -0700 (Fri, 30 Mar 2007)
Log Message:
-----------
Various optimizations to improve performance: fast acls, by pass full calendar search if we can, don't read the calendar
data if its not needed.
Modified Paths:
--------------
CalendarServer/branches/users/cdaboo/fast-multiget-1425/twistedcaldav/method/report_calquery.py
Modified: CalendarServer/branches/users/cdaboo/fast-multiget-1425/twistedcaldav/method/report_calquery.py
===================================================================
--- CalendarServer/branches/users/cdaboo/fast-multiget-1425/twistedcaldav/method/report_calquery.py 2007-03-30 20:37:28 UTC (rev 1438)
+++ CalendarServer/branches/users/cdaboo/fast-multiget-1425/twistedcaldav/method/report_calquery.py 2007-03-30 20:38:32 UTC (rev 1439)
@@ -71,15 +71,17 @@
if query.qname() == ("DAV:", "allprop"):
propertiesForResource = report_common.allPropertiesForResource
+ generate_calendar_data = False
elif query.qname() == ("DAV:", "propname"):
propertiesForResource = report_common.propertyNamesForResource
+ generate_calendar_data = False
elif query.qname() == ("DAV:", "prop"):
propertiesForResource = report_common.propertyListForResource
# Verify that any calendar-data element matches what we can handle
- result, message = report_common.validPropertyListCalendarDataTypeVersion(query)
+ result, message, generate_calendar_data = report_common.validPropertyListCalendarDataTypeVersion(query)
if not result:
log.err(message)
raise HTTPError(ErrorResponse(responsecode.FORBIDDEN, (caldav_namespace, "supported-calendar-data")))
@@ -101,7 +103,7 @@
@param uri: the uri for the calendar collecton resource.
"""
- def queryCalendarObjectResource(resource, uri, name, calendar):
+ def queryCalendarObjectResource(resource, uri, name, calendar, query_ok = False):
"""
Run a query on the specified calendar.
@param resource: the L{CalDAVFile} for the calendar.
@@ -110,7 +112,7 @@
@param calendar: the L{Component} calendar read from the resource.
"""
- if filter.match(calendar):
+ if query_ok or filter.match(calendar):
# Check size of results is within limit
matchcount[0] += 1
if matchcount[0] > max_number_of_matches:
@@ -146,23 +148,37 @@
# Check for disabled access
if filteredaces is not None:
- for name, uid, type in calresource.index().search(filter): #@UnusedVariable
- # Check privileges - must have at least DAV:read
- child = waitForDeferred(request.locateChildResource(calresource, name))
- yield child
- child = child.getResult()
-
- try:
- d = waitForDeferred(child.checkPrivileges(request, (davxml.Read(),), inherited_aces=filteredaces))
- yield d
- d.getResult()
- except:
- continue
-
- calendar = calresource.iCalendar(name)
- assert calendar is not None, "Calendar %s is missing from calendar collection %r" % (name, self)
+ # See whether the filter is valid for an index only query
+ index_query_ok = calresource.index().searchValid(filter)
+
+ # Get list of children that match the search and have read access
+ names = [name for name, ignore_uid, ignore_type in calresource.index().search(filter)]
+
+ # Now determine which valid resources are readable and which are not
+ ok_resources = []
+ d = self.findChildrenFaster(
+ "1",
+ request,
+ lambda x, y: ok_resources.append((x, y)),
+ None,
+ names,
+ (davxml.Read(),),
+ inherited_aces=filteredaces
+ )
+ x = waitForDeferred(d)
+ yield x
+ x.getResult()
+
+ for child, child_uri in ok_resources:
+ child_name = child_uri[child_uri.rfind("/") + 1:]
- d = waitForDeferred(queryCalendarObjectResource(child, uri, name, calendar))
+ if generate_calendar_data or not index_query_ok:
+ calendar = calresource.iCalendar(child_name)
+ assert calendar is not None, "Calendar %s is missing from calendar collection %r" % (child_name, self)
+ else:
+ calendar = None
+
+ d = waitForDeferred(queryCalendarObjectResource(child, child_uri, child_name, calendar, query_ok = index_query_ok))
yield d
d.getResult()
else:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070330/10e698dd/attachment.html
More information about the calendarserver-changes
mailing list