[CalendarServer-changes] [8960] CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav /directory
source_changes at macosforge.org
source_changes at macosforge.org
Mon Apr 2 14:36:47 PDT 2012
Revision: 8960
http://trac.macosforge.org/projects/calendarserver/changeset/8960
Author: gaya at apple.com
Date: 2012-04-02 14:36:47 -0700 (Mon, 02 Apr 2012)
Log Message:
-----------
change "record" to "result" when referring to ABDirectoryQueryResult
Modified Paths:
--------------
CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py
CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py
CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/xmldirectorybacker.py
Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py 2012-04-02 21:15:14 UTC (rev 8959)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/ldapdirectorybacker.py 2012-04-02 21:36:47 UTC (rev 8960)
@@ -75,7 +75,7 @@
},
"appleInternalServer":False, # does magic in ABDirectoryQueryResult
- "maxQueryRecords":0, # max records returned
+ "maxQueryResults":0, # max records returned
"fakeETag":True, # eTag is fake, otherwise it is md5(all attributes)
"generateSimpleUIDs":False, # if UID is faked, use simple method for generating
}
@@ -97,8 +97,8 @@
del params["directoryBackedAddressBook"]
appleInternalServer=params["appleInternalServer"]
del params["appleInternalServer"]
- maxQueryRecords=params["maxQueryRecords"]
- del params["maxQueryRecords"]
+ maxQueryResults=params["maxQueryResults"]
+ del params["maxQueryResults"]
fakeETag=params["fakeETag"]
del params["fakeETag"]
generateSimpleUIDs=params["generateSimpleUIDs"]
@@ -133,7 +133,7 @@
assert directoryBackedAddressBook is not None
self.directoryBackedAddressBook = directoryBackedAddressBook
- self.maxQueryRecords = maxQueryRecords
+ self.maxQueryResults = maxQueryResults
self.realmName = None # needed for super
@@ -197,13 +197,13 @@
Get vCards for a given addressBookFilter and addressBookQuery
"""
- queryRecords = []
+ queryResults = []
limited = False
- #calc maxRecords from passed in maxResults allowing extra for second stage filtering in caller
- maxRecords = int(maxResults * 1.2)
- if self.maxQueryRecords and maxRecords > self.maxQueryRecords:
- maxRecords = self.maxQueryRecords
+ #calc maxResults from passed in maxResults allowing extra for second stage filtering in caller
+ maxResults = int(maxResults * 1.2)
+ if self.maxQueryResults and maxResults > self.maxQueryResults:
+ maxResults = self.maxQueryResults
for queryMap in self.rdnSchema["queries"]:
@@ -242,18 +242,18 @@
elif dsFilter:
filterstr = dsFilter.generate()
- # can't resist also using a timeout, 1 sec per requested record for now
- timeout = maxRecords
+ # can't resist also using a timeout, 1 sec per request result for now
+ timeout = maxResults
- self.log_debug("doAddressBookQuery:LDAP query base=%s and filter=%s and attributes=%s timeout=%s resultLimit=%s" % (ldap.dn.dn2str(base), filterstr, attributes, timeout, maxRecords))
+ self.log_debug("doAddressBookQuery:LDAP query base=%s and filter=%s and attributes=%s timeout=%s resultLimit=%s" % (ldap.dn.dn2str(base), filterstr, attributes, timeout, maxResults))
- ldapSearchResult = (yield self.timedSearch(ldap.dn.dn2str(base), ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=attributes, timeoutSeconds=timeout, resultLimit=maxRecords))
+ ldapSearchResult = (yield self.timedSearch(ldap.dn.dn2str(base), ldap.SCOPE_SUBTREE, filterstr=filterstr, attrlist=attributes, timeoutSeconds=timeout, resultLimit=maxResults))
self.log_debug("doAddressBookQuery: ldapSearchResult=%s" % (ldapSearchResult,))
for dn, ldapAttributes in ldapSearchResult:
#dn = normalizeDNstr(dn)
- dsRecord = None
+ result = None
try:
# make a dsRecordAttributes dict from the ldap attributes
dsRecordAttributes = {}
@@ -285,22 +285,21 @@
self.log_debug("doAddressBookQuery: dsRecordAttributes[%s] = %s" % (dsAttributeName, dsRecordAttributes[dsAttributeName],))
# get a record for dsRecordAttributes
- dsRecord = ABDirectoryQueryResult(self.directoryBackedAddressBook, dsRecordAttributes, defaultNodeName=None, generateSimpleUIDs=self.generateSimpleUIDs, appleInternalServer=self.appleInternalServer)
- vCardText = dsRecord.vCardText()
+ result = ABDirectoryQueryResult(self.directoryBackedAddressBook, dsRecordAttributes, defaultNodeName=None, generateSimpleUIDs=self.generateSimpleUIDs, appleInternalServer=self.appleInternalServer)
except:
traceback.print_exc()
- self.log_info("Could not get vcard for ds record %s" % (dsRecord,))
+ self.log_info("Could not get vcard for %s" % (dn,))
else:
- self.log_debug("doAddressBookQuery: VCard text =\n%s" % (vCardText, ))
- queryRecords.append(dsRecord)
+ self.log_debug("doAddressBookQuery: VCard text =\n%s" % (result.vCardText(),))
+ queryResults.append(result)
# only get requested number of record results
- maxRecords -= len(ldapSearchResult)
- if maxRecords <= 0:
+ maxResults -= len(ldapSearchResult)
+ if maxResults <= 0:
limited = True
break
- self.log_info("limited %s len(queryRecords) %s" % (limited,len(queryRecords),))
- returnValue((queryRecords, limited,))
+ self.log_info("limited %s len(queryResults) %s" % (limited,len(queryResults),))
+ returnValue((queryResults, limited,))
Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py 2012-04-02 21:15:14 UTC (rev 8959)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/opendirectorybacker.py 2012-04-02 21:36:47 UTC (rev 8960)
@@ -206,11 +206,11 @@
def createCache(self):
succeed(None)
- def _getDSLocalRecords(self):
+ def _getAllDSLocalResults(self):
- def generateDSLocalRecords():
+ def generateDSLocalResults():
- records = {}
+ resultsDictionary = {}
recordTypes = [dsattributes.kDSStdRecordTypePeople, dsattributes.kDSStdRecordTypeUsers, ]
try:
@@ -220,7 +220,7 @@
recordTypes,
self.returnedAttributes,
))
- results = list(self.odModule.listAllRecordsWithAttributes_list(
+ records = list(self.odModule.listAllRecordsWithAttributes_list(
localNodeDirectory,
recordTypes,
self.returnedAttributes,
@@ -230,39 +230,39 @@
raise
self._dsLocalRecords = []
- for (recordShortName, value) in results: #@UnusedVariable
+ for (recordShortName, value) in records: #@UnusedVariable
try:
- record = ABDirectoryQueryResult(self.directoryBackedAddressBook, value, "/Local/Default")
+ result = ABDirectoryQueryResult(self.directoryBackedAddressBook, value, defaultNodeName="/Local/Default")
except:
traceback.print_exc()
- self.log_info("Could not get vcard for record %s" % (record,))
+ self.log_info("Could not get vcard for record %s" % (recordShortName,))
else:
- uid = record.vCard().getProperty("UID").value()
+ uid = result.vCard().getProperty("UID").value()
if self.ignoreSystemRecords:
# remove system users and people
if uid.startswith("FFFFEEEE-DDDD-CCCC-BBBB-AAAA"):
- self.log_info("Ignoring vcard for system record %s" % (record,))
+ self.log_info("Ignoring vcard for system record %s" % (recordShortName,))
continue
- if uid in records:
- self.log_info("Record skipped due to duplicate UID: %s" % (record,))
+ if uid in resultsDictionary:
+ self.log_info("Record skipped due to duplicate UID: %s" % (recordShortName,))
continue
- self.log_debug("VCard text =\n%s" % (record.vCardText(), ))
- records[uid] = record
+ self.log_debug("VCard text =\n%s" % (result.vCardText(), ))
+ resultsDictionary[uid] = result
- return records
+ return resultsDictionary
if not self.queryDSLocal:
return {}
if time.time() > self._nextDSLocalQueryTime:
- self._dsLocalRecords = generateDSLocalRecords()
+ self._dsLocalRecords = generateDSLocalResults()
# Add jitter/fuzz factor
self._nextDSLocalQueryTime = time.time() + self.dsLocalCacheTimeout * (random() + 0.5) * 60
@@ -270,26 +270,26 @@
@inlineCallbacks
- def _getDirectoryRecords(self, query=None, attributes=None, maxRecords=0 ):
+ def _getDirectoryQueryResults(self, query=None, attributes=None, maxRecords=0 ):
"""
Get a list of filtered ABDirectoryQueryResult for the given query with the given attributes.
query == None gets all records. attribute == None gets ABDirectoryQueryResult.allDSQueryAttributes
"""
limited = False
- queryResults = (yield self._queryDirectory(query, attributes, maxRecords ))
- if maxRecords and len(queryResults) >= maxRecords:
+ records = (yield self._queryDirectory(query, attributes, maxRecords ))
+ if maxRecords and len(records) >= maxRecords:
limited = True
self.log_debug("Directory address book record limit (= %d) reached." % (maxRecords, ))
- self.log_debug("Query done. Inspecting %s results" % len(queryResults))
+ self.log_debug("Query done. Inspecting %s records" % len(records))
- records = self._getDSLocalRecords().copy()
- self.log_debug("Adding %s DSLocal results" % len(records.keys()))
+ resultsDictionary = self._getAllDSLocalResults().copy()
+ self.log_debug("Adding %s DSLocal results" % len(resultsDictionary.keys()))
- for (recordShortName, value) in queryResults: #@UnusedVariable
+ for (recordShortName, value) in records: #@UnusedVariable
try:
- record = ABDirectoryQueryResult(self.directoryBackedAddressBook, value,
+ result = ABDirectoryQueryResult(self.directoryBackedAddressBook, value,
defaultNodeName=self.defaultNodeName,
generateSimpleUIDs=self.generateSimpleUIDs,
addDSAttrXProperties=self.addDSAttrXProperties,
@@ -297,26 +297,26 @@
)
except:
traceback.print_exc()
- self.log_info("Could not get vcard for record %s" % (record,))
+ self.log_info("Could not get vcard for record %s" % (recordShortName,))
else:
- uid = record.vCard().getProperty("UID").value()
+ uid = result.vCard().getProperty("UID").value()
if self.ignoreSystemRecords:
# remove system users and people
if uid.startswith("FFFFEEEE-DDDD-CCCC-BBBB-AAAA"):
- self.log_info("Ignoring vcard for system record %s" % (record,))
+ self.log_info("Ignoring vcard for system record %s" % (recordShortName,))
continue
- if uid in records:
- self.log_info("Record skipped due to duplicate UID: %s" % (record,))
+ if uid in resultsDictionary:
+ self.log_info("Record skipped due to duplicate UID: %s" % (recordShortName,))
continue
- self.log_debug("VCard text =\n%s" % (record.vCardText(), ))
- records[uid] = record
+ self.log_debug("VCard text =\n%s" % (result.vCardText(), ))
+ resultsDictionary[uid] = result
- self.log_debug("After filtering, %s records (limited=%s)." % (len(records), limited))
- returnValue((records, limited, ))
+ self.log_debug("After filtering, %s results (limited=%s)." % (len(resultsDictionary), limited))
+ returnValue((resultsDictionary.values(), limited, ))
def _queryDirectory(self, query=None, attributes=None, maxRecords=0 ):
@@ -452,10 +452,24 @@
dsFilter = None # None expression == all Records
clear = not allRecords and not dsFilter
- queryRecords = []
+ results = []
limited = False
if not clear:
+
+ # add filter to ignore system records rather than post filtering
+ # but this appears to be broken in open directory
+ '''
+ if self.ignoreSystemRecords:
+ ignoreExpression = dsquery.expression( dsquery.expression.NOT,
+ dsquery.match(dsattributes.kDS1AttrGeneratedUID, "FFFFEEEE-DDDD-CCCC-BBBB-AAAA", dsattributes.eDSStartsWith)
+ )
+ filterAttributes = list(set(filterAttributes).union(dsattributes.kDS1AttrGeneratedUID))
+
+ dsFilter = dsquery.expression( dsquery.expression.AND, (dsFilter, ignoreExpression,) ) if dsFilter else ignoreExpression
+ #dsFilter = ignoreExpression
+ '''
+
queryAttributes = self._attributesForAddressBookQuery( addressBookQuery )
attributes = filterAttributes + queryAttributes
@@ -464,12 +478,9 @@
if self.maxDSQueryRecords and maxRecords > self.maxDSQueryRecords:
maxRecords = self.maxDSQueryRecords
- records, limited = (yield self._getDirectoryRecords(dsFilter, attributes, maxRecords))
-
- for record in records.values():
- queryRecords.append(record)
+ results, limited = (yield self._getDirectoryQueryResults(dsFilter, attributes, maxRecords))
- returnValue((queryRecords, limited,))
+ returnValue((results, limited,))
#utility
@@ -520,6 +531,7 @@
else:
matchList = list(set([dsquery.match(attrName, "", dsattributes.eDSStartsWith) for attrName in allAttrStrings]))
if defined:
+ # TODO: Investigate what happens when andOrExpresion() does not return an expression
return andOrExpression(allOf, queryAttributes, matchList)
else:
if len(matchList) > 1:
Modified: CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/xmldirectorybacker.py
===================================================================
--- CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/xmldirectorybacker.py 2012-04-02 21:15:14 UTC (rev 8959)
+++ CalendarServer/branches/users/gaya/ldapdirectorybacker/twistedcaldav/directory/xmldirectorybacker.py 2012-04-02 21:36:47 UTC (rev 8960)
@@ -272,18 +272,16 @@
pass
return dsRecordAttributes
- dsRecord = None
+ result = None
dsRecordAttributes = dsRecordAttributesFromDirectoryRecord( xmlDirectoryRecord )
try:
- dsRecord = ABDirectoryQueryResult(self.directoryBackedAddressBook, dsRecordAttributes,)
- vCardText = dsRecord.vCardText()
-
+ result = ABDirectoryQueryResult(self.directoryBackedAddressBook, dsRecordAttributes,)
except:
traceback.print_exc()
- self.log_info("Could not get vcard for ds record %s" % (dsRecord,))
+ self.log_info("Could not get vcard for %s" % (xmlDirectoryRecord,))
else:
- self.log_debug("doAddressBookQuery: VCard text =\n%s" % (vCardText, ))
- queryResults.append(dsRecord)
+ self.log_debug("doAddressBookQuery: VCard text =\n%s" % (result.vCardText(),))
+ queryResults.append(result)
# only get requested number of record results
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120402/47893847/attachment-0001.html>
More information about the calendarserver-changes
mailing list