#!/usr/bin/ruby -w
#
# $Id: pr_ctl,v 1.4 2006/02/12 20:00:21 ianmacd Exp $
#
# Program to demonstrate the use of the LDAPv3 PagedResults control. This
# control is interesting, because it requires the passing of controls in
# both directions between the client and the server.
#
# See RFC 2696 for more information.
require 'ldap'
require 'ldap/control'
# Find a PagedResults control in an Array of LDAP controls.
#
def paged_results_ctl( ctls )
ctls.each do |ctl|
return ctl if ctl.oid == LDAP::LDAP_CONTROL_PAGEDRESULTS
end
nil
end
unless ARGV[0]
$stderr.puts "Please give a page size."
exit
end
page_size = ARGV[0].to_i
cookie = ''
critical = true
conn = LDAP::Conn.new( 'localhost', 389 )
conn.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )
conn.bind( '', '' )
search = 0
total = 0
loop do
ber_string = LDAP::Control.encode( page_size, cookie )
control = LDAP::Control.new( LDAP::LDAP_CONTROL_PAGEDRESULTS,
ber_string,
critical )
conn.set_option( LDAP::LDAP_OPT_SERVER_CONTROLS, [control] )
this_page = conn.search2( 'dc=google, dc=com',
LDAP::LDAP_SCOPE_SUBTREE,
'(objectclass=*)', ['cn'] )
printf( "Page %d has %d entries.\n", search += 1, this_page.size )
printf( "That's %d entries in total.\n", total += this_page.size )
# Get the PagedResults control from the list of controls set by the
# last search operation.
control = paged_results_ctl( conn.controls )
# How many entries does the server estimate are left?
# Also, get the cookie returned by the last search.
returned_size, cookie = control.decode
puts "Returned size = #{returned_size.to_i}" if $DEBUG
# According to RFC 2696, the server may not be able to estimate the number
# of results outstanding. In that case, it will return zero, so we should
# only use the new size if it is non-zero.
page_size = returned_size.to_i if returned_size.to_i > 0
puts "Returned cookie = #{cookie.inspect}" if $DEBUG
break if cookie.empty?
puts
end
syntax highlighted by Code2HTML, v. 0.9.1