_total_rows = ldap_count_entries($result['l'],$result['r']); $this->_current_entry = ldap_first_entry($result['l'],$result['r']); if (! $this->_total_rows) $this->__destruct(); } public function __destruct() { if (is_resource($this->_result['r'])) ldap_free_result($this->_result['r']); } public function as_array($key=NULL,$value=NULL) { $result = array(); if ($key === NULL AND $value === NULL) { // Indexed rows foreach ($this as $dn => $row) $result[$dn] = $row; } elseif ($key === NULL) { throw HTTP_Exception::factory(501,'Not implemented'); // Indexed columns } elseif ($value === NULL) { throw HTTP_Exception::factory(501,'Not implemented'); // Associative rows } else { throw HTTP_Exception::factory(501,'Not implemented'); // Associative columns } return $result; } public function current() { if (! $this->_current_entry) return array(); if ($this->_as_object === TRUE) { // Return an stdClass throw HTTP_Exception::factory(501,'Not implemented'); } elseif (is_string($this->_as_object)) { // Return an object of given class name throw HTTP_Exception::factory(501,'Not implemented'); } else { // Return an array of the row // @todo We could probably cache this for optimisation $attrs = $vals = array(); array_push($attrs,ldap_first_attribute($this->_result['l'],$this->_current_entry)); while ($x = ldap_next_attribute($this->_result['l'],$this->_current_entry)) array_push($attrs,$x); foreach ($attrs as $attr) { $vals[strtolower($attr)] = ldap_get_values($this->_result['l'],$this->_current_entry,$attr); // We dont need the count entry unset($vals[strtolower($attr)]['count']); } return $vals; } } /** * Implements [Iterator::key], returns the dn. * * echo key($result); * * @return integer */ public function key() { return ldap_get_dn($this->_result['l'],$this->_current_entry); } /** * Implements [Iterator::next], moves to the next row. * * next($result); * * @return $this */ public function next() { $this->_current_entry = ldap_next_entry($this->_result['l'],$this->_current_entry); ++$this->_current_row; return $this; } public function offsetExists($offset) { return $this->valid(); } public function prev() { throw new Kohana_Exception('Cant go backwards'); } public function seek($dn) { $this->_current_entry = ldap_first_entry($this->_result['l'],$this->_result['r']); do { if ($dn == $this->key()) return TRUE; // Increment internal row for optimization assuming rows are fetched in order $this->_current_entry = ldap_next_entry($this->_result['l'],$this->_current_entry); } while ($this->_current_entry); // We didnt find it return FALSE; } public function rewind() { if ($this->_total_rows) $this->_current_entry = ldap_first_entry($this->_result['l'],$this->_result['r']); $this->_current_row = 0; } /** * Implements [Iterator::valid], checks if the current row exists. * * [!!] This method is only used internally. * * @return boolean */ public function valid() { return (boolean)$this->_current_entry; } } // End Database_LDAP_Result