_ldap = $ldap; $this->_resultId = $resultId; $this->_itemCount = @ldap_count_entries($ldap->getResource(), $resultId); if ($this->_itemCount === false) { /** * @see Zend_Ldap_Exception */ require_once 'Zend/Ldap/Exception.php'; throw new Zend_Ldap_Exception($this->_ldap, 'counting entries'); } } public function __destruct() { $this->close(); } /** * Closes the current result set * * @return bool */ public function close() { $isClosed = false; if (is_resource($this->_resultId)) { $isClosed = @ldap_free_result($this->_resultId); $this->_resultId = null; $this->_currentDn = null; $this->_current = null; } return $isClosed; } /** * Gets the current LDAP connection. * * @return Zend_Ldap */ public function getLdap() { return $this->_ldap; } /** * Returns the number of items in current result * Implements Countable * * @return int */ public function count() { return $this->_itemCount; } /** * Return the current result item * Implements Iterator * * @return array * @throws Zend_Ldap_Exception */ public function current() { if (!is_resource($this->_current) || !is_string($this->_currentDn)) return null; $entry = array('dn' => $this->_currentDn); $ber_identifier = null; $name = @ldap_first_attribute($this->_ldap->getResource(), $this->_current, $ber_identifier); while ($name) { $data = @ldap_get_values_len($this->_ldap->getResource(), $this->_current, $name); unset($data['count']); $entry[strtolower($name)] = $data; $name = @ldap_next_attribute($this->_ldap->getResource(), $this->_current, $ber_identifier); } ksort($entry, SORT_LOCALE_STRING); return $entry; } /** * Return the result item key * Implements Iterator * * @return int */ public function key() { return $this->_currentDn; } /** * Move forward to next result item * Implements Iterator * * @throws Zend_Ldap_Exception */ public function next() { if (!is_resource($this->_current)) return; $this->_current = @ldap_next_entry($this->_ldap->getResource(), $this->_current); /** * @see Zend_Ldap_Exception */ require_once 'Zend/Ldap/Exception.php'; if ($this->_current === false) { $msg = $this->_ldap->getLastError($code); if ($code === Zend_Ldap_Exception::LDAP_SIZELIMIT_EXCEEDED) { // we have reached the size limit enforced by the server return; } else if ($code > Zend_Ldap_Exception::LDAP_SUCCESS) { throw new Zend_Ldap_Exception($this->_ldap, 'getting next entry (' . $msg . ')'); } } $this->_storeCurrentDn(); } /** * Rewind the Iterator to the first result item * Implements Iterator * * @throws Zend_Ldap_Exception */ public function rewind() { if (!is_resource($this->_resultId)) return; $this->_current = @ldap_first_entry($this->_ldap->getResource(), $this->_resultId); /** * @see Zend_Ldap_Exception */ require_once 'Zend/Ldap/Exception.php'; if ($this->_current === false && $this->_ldap->getLastErrorCode() > Zend_Ldap_Exception::LDAP_SUCCESS) { throw new Zend_Ldap_Exception($this->_ldap, 'getting first entry'); } $this->_storeCurrentDn(); } /** * Stores the current DN * * @return void * @throws Zend_Ldap_Exception */ protected function _storeCurrentDn() { if (is_resource($this->_current)) { $this->_currentDn = @ldap_get_dn($this->_ldap->getResource(), $this->_current); if ($this->_currentDn === false) { throw new Zend_Ldap_Exception($this->_ldap, 'getting dn'); } } else { $this->_currentDn = null; } } /** * Check if there is a current result item * after calls to rewind() or next() * Implements Iterator * * @return boolean */ public function valid() { return (is_resource($this->_current) && is_string($this->_currentDn)); } }