public function Server::pagedLdapQuery in Lightweight Directory Access Protocol (LDAP) 8.3
Execute a paged LDAP query and return entries as one aggregated array.
$this->searchPageStart and $this->searchPageEnd should be set before calling if a particular set of pages is desired.
Parameters
resource $queryParameters: Parameters of form: [ 'base_dn' => base_dn, 'filter' => filter, 'attributes' => attributes, 'attrsonly' => attrsonly, 'sizelimit' => sizelimit, 'timelimit' => timelimit, 'deref' => deref, 'scope' => scope, ] This array of parameters is primarily passed on to ldapQuery() method.
Return value
array|bool Array of LDAP entries or FALSE on error.
1 call to Server::pagedLdapQuery()
- Server::search in ldap_servers/
src/ Entity/ Server.php - Perform an LDAP search.
File
- ldap_servers/
src/ Entity/ Server.php, line 822
Class
- Server
- Defines the Server entity.
Namespace
Drupal\ldap_servers\EntityCode
public function pagedLdapQuery($queryParameters) {
if (!$this
->get('search_pagination')) {
$this->logger
->error('Paged LDAP query functionality called but not enabled in LDAP server configuration.');
return FALSE;
}
$pageToken = '';
$page = 0;
$estimatedEntries = 0;
$aggregatedEntries = [];
$aggregatedEntriesCount = 0;
$hasPageResults = FALSE;
do {
ldap_control_paged_result($this->connection, $this
->get('search_page_size'), TRUE, $pageToken);
$result = $this
->ldapQuery($queryParameters['scope'], $queryParameters);
if ($page >= $this->searchPageStart) {
$skippedPage = FALSE;
if ($result && $this
->countEntries($result) !== FALSE) {
$pageEntries = ldap_get_entries($this->connection, $result);
unset($pageEntries['count']);
$hasPageResults = is_array($pageEntries) && count($pageEntries) > 0;
$aggregatedEntries = array_merge($aggregatedEntries, $pageEntries);
$aggregatedEntriesCount = count($aggregatedEntries);
}
elseif ($this
->hasError()) {
$this->logger
->notice('LDAP search error: %error. Base DN: %base_dn | filter: %filter | attributes: %attributes.', [
'%base_dn' => $queryParameters['base_dn'],
'%filter' => $queryParameters['filter'],
'%attributes' => json_encode($queryParameters['attributes']),
'%error' => $this
->formattedError($this
->ldapErrorNumber()),
]);
return FALSE;
}
else {
return FALSE;
}
}
else {
$skippedPage = TRUE;
}
@ldap_control_paged_result_response($this->connection, $result, $pageToken, $estimatedEntries);
if ($queryParameters['sizelimit'] && $this
->ldapErrorNumber() == self::LDAP_SIZELIMIT_EXCEEDED) {
// False positive error thrown. Do not set result limit error when
// $sizelimit specified.
}
elseif ($this
->hasError()) {
$this->logger
->error('Paged query error: %error. Base DN: %base_dn | filter: %filter | attributes: %attributes.', [
'%error' => $this
->formattedError($this
->ldapErrorNumber()),
'%base_dn' => $queryParameters['base_dn'],
'%filter' => $queryParameters['filter'],
'%attributes' => json_encode($queryParameters['attributes']),
'%query' => $queryParameters['query_display'],
]);
}
if (isset($queryParameters['sizelimit']) && $queryParameters['sizelimit'] && $aggregatedEntriesCount >= $queryParameters['sizelimit']) {
$discarded_entries = array_splice($aggregatedEntries, $queryParameters['sizelimit']);
break;
}
elseif ($this->searchPageEnd !== NULL && $page >= $this->searchPageEnd) {
break;
}
elseif ($pageToken === NULL || $pageToken == '') {
break;
}
$page++;
} while ($skippedPage || $hasPageResults);
$aggregatedEntries['count'] = count($aggregatedEntries);
return $aggregatedEntries;
}