55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\ldap;
 | |
| 
 | |
| use Iterator;
 | |
| use nur\iter;
 | |
| 
 | |
| trait TLdapWalker {
 | |
|   function __construct(?LdapConn $conn=null, ?LdapSearch $search=null) {
 | |
|     parent::__construct(null, null, null, $conn);
 | |
|     if ($search !== null) $this->resetSearch($search);
 | |
|   }
 | |
| 
 | |
|   /** @var LdapSearch */
 | |
|   protected $search;
 | |
| 
 | |
|   function resetSearch(LdapSearch $search): ILdapWalker {
 | |
|     $this->close();
 | |
|     $this->reset(null, null, $search->getAttrs());
 | |
|     $this->search = $search;
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   /** @var Iterator */
 | |
|   protected $it;
 | |
| 
 | |
|   protected function loadNext(): bool {
 | |
|     $it = $this->it;
 | |
|     if (!$it->valid()) {
 | |
|       $this->close();
 | |
|       return false;
 | |
|     }
 | |
|     $this->load($it->key(), $it->current());
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   function next(?bool &$found=null): bool {
 | |
|     if ($this->it === null) {
 | |
|       $this->it = $this->search->getIterator();
 | |
|       $this->it->rewind();
 | |
|       $updateFound = true;
 | |
|     } else {
 | |
|       $this->it->next();
 | |
|       $updateFound = false;
 | |
|     }
 | |
|     $haveNext = $this->loadNext();
 | |
|     if ($updateFound) $found = $haveNext;
 | |
|     return $haveNext;
 | |
|   }
 | |
| 
 | |
|   function close(): void {
 | |
|     iter::close($this->it);
 | |
|     $this->it = null;
 | |
|   }
 | |
| }
 |