ldap.asyncsearch Stream-processing of large search results

With newer Python versions one might want to consider using ldap.resiter instead.

Changed in version 3.0: In Python 3.7 async is a reserved keyword. The module ldap.async has been renamed to ldap.asyncsearch. The old name ldap.async is still available for backwards compatibility.

Deprecated since version 3.0: The old name ldap.async is deprecated, but will not be removed until Python 3.6 reaches end-of-life.

Classes

class ldap.asyncsearch.AsyncSearchHandler(l: SimpleLDAPObject)

Class for stream-processing LDAP search results

Arguments:

l

LDAPObject instance

afterFirstResult() → Any

Do anything you want right after successfully receiving but before processing first result

postProcessing() → Any

Do anything you want after receiving and processing all results

preProcessing() → Any

Do anything you want after starting search but before receiving and processing results

processResults(ignoreResultsNumber: int = 0, processResultsCount: int = 0, timeout: int = -1) → int
ignoreResultsNumber

Don’t process the first ignoreResultsNumber results.

processResultsCount

If non-zero this parameters indicates the number of results processed is limited to processResultsCount.

timeout

See parameter timeout of ldap.LDAPObject.result()

startSearch(searchRoot: str, searchScope: int, filterStr: str, attrList: list[str] | None = None, attrsOnly: int = 0, timeout: int = -1, sizelimit: int = 0, serverctrls: list[RequestControl] | None = None, clientctrls: list[RequestControl] | None = None) → None
searchRoot

See parameter base of method LDAPObject.search()

searchScope

See parameter scope of method LDAPObject.search()

filterStr

See parameter filter of method LDAPObject.search()

attrList=None

See parameter attrlist of method LDAPObject.search()

attrsOnly

See parameter attrsonly of method LDAPObject.search()

timeout

Maximum time the server shall use for search operation

sizelimit

Maximum number of entries a server should return (request client-side limit)

serverctrls

list of server-side LDAP controls

clientctrls

list of client-side LDAP controls

class ldap.asyncsearch.List(l: SimpleLDAPObject)

Class for collecting all search results.

This does not seem to make sense in the first place but think of retrieving exactly a certain portion of the available search results.

class ldap.asyncsearch.Dict(l: SimpleLDAPObject)

Class for collecting all search results into a dictionary {dn:entry}

class ldap.asyncsearch.IndexedDict(l: SimpleLDAPObject, indexed_attrs: Sequence[str] | None = None)

Class for collecting all search results into a dictionary {dn:entry} and maintain case-sensitive equality indexes to entries

class ldap.asyncsearch.LDIFWriter(l: SimpleLDAPObject, writer_obj: TextIO | LDIFWriter, headerStr: str = '', footerStr: str = '')

Class for writing a stream LDAP search results to a LDIF file

Arguments:

l

LDAPObject instance

writer_obj

Either a file-like object or a ldif.LDIFWriter instance used for output

Examples

Using ldap.asyncsearch.List

This example demonstrates how to use class ldap.asyncsearch.List for retrieving partial search results even though the exception ldap.SIZELIMIT_EXCEEDED was raised because a server side limit was hit.

import sys,ldap,ldap.asyncsearch

s = ldap.asyncsearch.List(
  ldap.initialize('ldap://localhost'),
)

s.startSearch(
  'dc=stroeder,dc=com',
  ldap.SCOPE_SUBTREE,
  '(objectClass=*)',
)

try:
  partial = s.processResults()
except ldap.SIZELIMIT_EXCEEDED:
  sys.stderr.write('Warning: Server-side size limit exceeded.\n')
else:
  if partial:
    sys.stderr.write('Warning: Only partial results received.\n')

sys.stdout.write(
  '%d results received.\n' % (
    len(s.allResults)
  )
)

Using ldap.asyncsearch.LDIFWriter

This example demonstrates how to use class ldap.asyncsearch.LDIFWriter for writing search results as LDIF to stdout.

import sys,ldap,ldap.asyncsearch

s = ldap.asyncsearch.LDIFWriter(
  ldap.initialize('ldap://localhost:1390'),
  sys.stdout
)

s.startSearch(
  'dc=stroeder,dc=com',
  ldap.SCOPE_SUBTREE,
  '(objectClass=*)',
)

try:
  partial = s.processResults()
except ldap.SIZELIMIT_EXCEEDED:
  sys.stderr.write('Warning: Server-side size limit exceeded.\n')
else:
  if partial:
    sys.stderr.write('Warning: Only partial results received.\n')

sys.stderr.write(
  '%d results received.\n' % (
    s.endResultBreak-s.beginResultsDropped
  )
)