/phpldapadmin-1.2.2/lib/Query.php
PHP | 283 lines | 182 code | 58 blank | 43 comment | 50 complexity | 444c271b6ed67a35395e3557c20b380b MD5 | raw file
Possible License(s): GPL-2.0
- <?php
- /**
- * Classes and functions for the query engine.
- *
- * @author The phpLDAPadmin development team
- * @package phpLDAPadmin
- */
- /**
- * Query Class
- *
- * @package phpLDAPadmin
- * @subpackage Queries
- */
- class Query extends xmlTemplate {
- protected $description = '';
- public $results = array();
- /**
- * Main processing to store the template.
- *
- * @param xmldata Parsed xmldata from xml2array object
- */
- protected function storeTemplate($xmldata) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
- $server = $this->getServer();
- foreach ($xmldata['query'] as $xml_key => $xml_value) {
- if (DEBUG_ENABLED)
- debug_log('Foreach loop Key [%s] Value [%s]',4,0,__FILE__,__LINE__,__METHOD__,$xml_key,is_array($xml_value));
- switch ($xml_key) {
- # Build our attribute list from the DN and Template.
- case ('attributes'):
- if (DEBUG_ENABLED)
- debug_log('Case [%s]',4,0,__FILE__,__LINE__,__METHOD__,$xml_key);
- if (is_array($xmldata['query'][$xml_key])) {
- foreach ($xmldata['query'][$xml_key] as $tattrs) {
- foreach ($tattrs as $index => $details) {
- if (DEBUG_ENABLED)
- debug_log('Foreach tattrs Key [%s] Value [%s]',4,0,__FILE__,__LINE__,__METHOD__,
- $index,$details);
- # If there is no schema definition for the attribute, it will be ignored.
- if ($sattr = $server->getSchemaAttribute($index)) {
- if (is_null($attribute = $this->getAttribute($sattr->getName())))
- $attribute = $this->addAttribute($sattr->getName(false),array('values'=>array()));
- $attribute->show();
- $attribute->setXML($details);
- }
- }
- }
- }
- break;
- # Build our bases list from the DN and Template.
- case ('bases'):
- if (isset($xmldata['query'][$xml_key]['base']))
- if (is_array($xmldata['query'][$xml_key]['base']))
- $this->base = $xmldata['query'][$xml_key]['base'];
- else
- $this->base = array($xmldata['query'][$xml_key]['base']);
- else
- error(sprintf(_('In the XML file (%s), [%s] contains an unknown key.'),
- $this->filename,$xml_key),'error','index.php');
- $this->base = array_unique($this->base);
- break;
- default:
- if (DEBUG_ENABLED)
- debug_log('Case [%s]',4,0,__FILE__,__LINE__,__METHOD__,$xml_key);
- # Some key definitions need to be an array, some must not be:
- $allowed_arrays = array('');
- $storelower = array('');
- $storearray = array('');
- # Items that must be stored lowercase
- if (in_array($xml_key,$storelower))
- if (is_array($xml_value))
- foreach ($xml_value as $index => $value)
- $xml_value[$index] = strtolower($value);
- else
- $xml_value = strtolower($xml_value);
- # Items that must be stored as arrays
- if (in_array($xml_key,$storearray) && ! is_array($xml_value))
- $xml_value = array($xml_value);
- # Items that should not be an array
- if (! in_array($xml_key,$allowed_arrays) && is_array($xml_value)) {
- debug_dump(array(__METHOD__,'key'=>$xml_key,'value'=>$xml_value));
- error(sprintf(_('In the XML file (%s), [%s] is an array, it must be a string.'),
- $this->filename,$xml_key),'error');
- }
- $this->$xml_key = $xml_value;
- }
- }
- # Check we have some manditory items.
- foreach (array() as $key) {
- if (! isset($this->$key)
- || (! is_array($this->$key) && ! trim($this->$key))) {
- $this->setInvalid(sprintf(_('Missing %s in the XML file.'),$key));
- break;
- }
- }
- }
- /**
- * Accept will run the query and store the results in results()
- */
- public function accept() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
- $server = $this->getServer();
- $query = array();
- $query['size_limit'] = get_request('size_limit','REQUEST',false,$_SESSION[APPCONFIG]->getValue('search','size_limit'));
- $query['format'] = get_request('format','REQUEST',false,$_SESSION[APPCONFIG]->getValue('search','display'));
- $query['orderby'] = get_request('orderby','REQUEST',false,'dn');
- # If this is a custom search, we need to populate are paramters
- if ($this->getID() == 'none') {
- $bases = get_request('base','REQUEST',false,null);
- $query['filter'] = get_request('filter','REQUEST',false,'objectClass=*');
- $query['scope'] = get_request('scope','REQUEST',false,'sub');
- $attrs = get_request('display_attrs','REQUEST');
- $attrs = preg_replace('/\s+/','',$attrs);
- if ($attrs)
- $query['attrs'] = explode(',',$attrs);
- else
- $query['attrs'] = array('*');
- } else {
- $bases = $this->base;
- $query['filter'] = $this->filter;
- $query['scope'] = $this->scope;
- $query['attrs'] = $this->getAttributeNames();
- }
- if (! $bases)
- $bases = $server->getBaseDN();
- elseif (! is_array($bases))
- $bases = explode('|',$bases);
- foreach ($bases as $base) {
- $query['base'] = $base;
- $time_start = utime();
- $this->results[$base] = $server->query($query,null);
- $time_end = utime();
- $this->resultsdata[$base]['time'] = round($time_end-$time_start,2);
- $this->resultsdata[$base]['scope'] = $query['scope'];
- $this->resultsdata[$base]['filter'] = $query['filter'];
- $this->resultsdata[$base]['attrs'] = $query['attrs'];
- if ($this->getAttrSortOrder() == 'dn')
- usort($this->results[$base],'pla_compare_dns');
- elseif ($this->getAttrSortOrder())
- masort($this->results[$base],$this->getAttrSortOrder());
- }
- }
- /**
- * This is temporary to get around objects that use a DN for rendering, for example jpegPhoto
- */
- public function setDN($dn) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs);
- $this->dn = $dn;
- }
- /**
- * This is temporary to get around objects that use a DN for rendering, for example jpegPhoto
- */
- public function getDN() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->dn);
- return $this->dn;
- }
- public function getDNEncode($url=true) {
- // @todo Be nice to do all this in 1 location
- if ($url)
- return urlencode(preg_replace('/%([0-9a-fA-F]+)/',"%25\\1",$this->dn));
- else
- return preg_replace('/%([0-9a-fA-F]+)/',"%25\\1",$this->dn);
- }
- public function getAttrSortOrder() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
- $result = array();
- if (count($this->attributes)) {
- masort($this->attributes,'ordersort');
- foreach ($this->attributes as $attribute)
- array_push($result,$attribute->getName());
- } else {
- $display = preg_replace('/,\s+/',',',get_request('orderby','REQUEST',false,'dn'));
- if (trim($display))
- $result = explode(',',$display);
- }
- return implode(',',$result);
- }
- public function getAttrDisplayOrder() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
- $result = array();
- if (count($this->attributes)) {
- masort($this->attributes,'order');
- foreach ($this->attributes as $attribute)
- array_push($result,$attribute->getName());
- } else {
- $display = preg_replace('/,\s+/',',',get_request('display_attrs','REQUEST',false,''));
- if (trim($display))
- $result = explode(',',$display);
- }
- # If our display order is empty, then dynamically build it
- if (! count($result)) {
- foreach ($this->results as $details)
- foreach ($details as $attrs)
- $result = array_merge($result,array_keys(array_change_key_case($attrs)));
- $result = array_unique($result);
- sort($result);
- }
- # Put the DN first
- array_unshift($result,'dn');
- $result = array_unique($result);
- return implode(',',$result);
- }
- /**
- * Test if the template is visible
- *
- * @return boolean
- */
- public function isVisible() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->visible);
- return $this->visible;
- }
- public function getDescription() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->description);
- return $this->description;
- }
- }
- ?>