White-space cleaning
This commit is contained in:
107
Demo/paged_search_ext_s.py
Normal file
107
Demo/paged_search_ext_s.py
Normal file
@@ -0,0 +1,107 @@
|
||||
url = "ldap://localhost:1390/"
|
||||
base = "dc=stroeder,dc=de"
|
||||
search_flt = r'(objectClass=*)'
|
||||
|
||||
searchreq_attrlist=['cn','entryDN','entryUUID','mail','objectClass']
|
||||
|
||||
from ldap.ldapobject import ReconnectLDAPObject
|
||||
|
||||
import ldap,pprint
|
||||
from ldap.controls import SimplePagedResultsControl
|
||||
|
||||
|
||||
class PagedResultsSearchObject:
|
||||
page_size = 50
|
||||
|
||||
def paged_search_ext_s(self,base,scope,filterstr='(objectClass=*)',attrlist=None,attrsonly=0,serverctrls=None,clientctrls=None,timeout=-1,sizelimit=0):
|
||||
"""
|
||||
Behaves exactly like LDAPObject.search_ext_s() but internally uses the
|
||||
simple paged results control to retrieve search results in chunks.
|
||||
|
||||
This is non-sense for really large results sets which you would like
|
||||
to process one-by-one
|
||||
"""
|
||||
|
||||
while True: # loop for reconnecting if necessary
|
||||
|
||||
req_ctrl = SimplePagedResultsControl(True,size=self.page_size,cookie='')
|
||||
|
||||
try:
|
||||
|
||||
# Send first search request
|
||||
msgid = self.search_ext(
|
||||
base,
|
||||
scope,
|
||||
filterstr=filterstr,
|
||||
attrlist=attrlist,
|
||||
attrsonly=attrsonly,
|
||||
serverctrls=(serverctrls or [])+[req_ctrl],
|
||||
clientctrls=clientctrls,
|
||||
timeout=timeout,
|
||||
sizelimit=sizelimit
|
||||
)
|
||||
|
||||
result_pages = 0
|
||||
all_results = []
|
||||
|
||||
while True:
|
||||
rtype, rdata, rmsgid, rctrls = self.result3(msgid)
|
||||
all_results.extend(rdata)
|
||||
result_pages += 1
|
||||
# Extract the simple paged results response control
|
||||
pctrls = [
|
||||
c
|
||||
for c in rctrls
|
||||
if c.controlType == SimplePagedResultsControl.controlType
|
||||
]
|
||||
if pctrls:
|
||||
if pctrls[0].cookie:
|
||||
# Copy cookie from response control to request control
|
||||
req_ctrl.cookie = pctrls[0].cookie
|
||||
msgid = self.search_ext(
|
||||
base,
|
||||
scope,
|
||||
filterstr=filterstr,
|
||||
attrlist=attrlist,
|
||||
attrsonly=attrsonly,
|
||||
serverctrls=(serverctrls or [])+[req_ctrl],
|
||||
clientctrls=clientctrls,
|
||||
timeout=timeout,
|
||||
sizelimit=sizelimit
|
||||
)
|
||||
else:
|
||||
break # no more pages available
|
||||
|
||||
except ldap.SERVER_DOWN,e:
|
||||
try:
|
||||
self.reconnect(self._uri)
|
||||
except AttributeError:
|
||||
raise e
|
||||
|
||||
else:
|
||||
return result_pages,all_results
|
||||
|
||||
|
||||
class MyLDAPObject(ReconnectLDAPObject,PagedResultsSearchObject):
|
||||
pass
|
||||
|
||||
|
||||
#ldap.set_option(ldap.OPT_DEBUG_LEVEL,255)
|
||||
ldap.set_option(ldap.OPT_REFERRALS, 0)
|
||||
l = MyLDAPObject(url,trace_level=2,retry_max=100,retry_delay=2)
|
||||
l.protocol_version = 3
|
||||
l.simple_bind_s("", "")
|
||||
l.page_size=10
|
||||
|
||||
# Send search request
|
||||
result_pages,all_results = l.paged_search_ext_s(
|
||||
base,
|
||||
ldap.SCOPE_SUBTREE,
|
||||
search_flt,
|
||||
attrlist=searchreq_attrlist,
|
||||
serverctrls=None
|
||||
)
|
||||
|
||||
l.unbind_s()
|
||||
|
||||
print 'Received %d results in %d pages.' % (len(all_results),result_pages)
|
||||
Reference in New Issue
Block a user