Current File : //home/strato/chroot/opt/RZphp80/includes/XML/Query2XML/Driver/Array.php
<?php
/**
 * This file contains the class XML_Query2XML_Driver_Array.
 *
 * PHP version 5
 *
 * @category  XML
 * @package   XML_Query2XML
 * @author    Lukas Feiler <lukas.feiler@lukasfeiler.com>
 * @copyright 2008 Lukas Feiler
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL Version 2.1
 * @version   CVS: $Id: Array.php 259514 2008-05-10 21:04:44Z lukasfeiler $
 * @link      http://pear.php.net/package/XML_Query2XML
 */

/**
 * XML_Query2XML_Driver_Array extends XML_Query2XML_Driver.
 */
require_once 'XML/Query2XML.php';

/**
 * Array-based driver.
 *
 * usage:
 * <code>
 * $arrayDriver = XML_Query2XML_Driver_Array::factory();
 * $arrayDriver->addResultSet(
 *  'RESULT_SET_NAME', // to be used for $sql or $options['sql']
 *  array(
 *    array('column' => 'value', ...), // record #1
 *    array('column' => 'value', ...)  // record #2
 *  )
 * );
 * </code>
 * Usage scenario:
 * - Transform an array of associative arrays to XML:
 *   $query2xml->getFlatXML('RESULT_SET_ARTISTS_FLAT');
 * - Transform an array of index arrays to XML:
 *   $dom = $query2xml->getXML(
 *       'RESULT_SET_ARTISTS_FLAT',
 *       array(
 *          'rootTag' => 'data',
 *          'rowTag' => 'row',
 *          'idColumn' => false,
 *          'elements' => array(
 *              'name' => '0',
 *              'ID' => '1',
 *              'info' => '2'
 *          )
 *       )
 *   );
 * - Easy integration of other data sources without having
 *   to write a separate driver.
 * - Easy lookup table for static data. $options['sql']['data']
 *   can be used to specify the matching record.
 *
 * @category  XML
 * @package   XML_Query2XML
 * @author    Lukas Feiler <lukas.feiler@lukasfeiler.com>
 * @copyright 2008 Lukas Feiler
 * @license   http://www.gnu.org/copyleft/lesser.html  LGPL Version 2.1
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/XML_Query2XML
 * @since     Release 1.8.0RC1
 */
class XML_Query2XML_Driver_Array extends XML_Query2XML_Driver
{
    /**
     * An associative array of result sets.
     * @var array An associative array.
     */
    private $_resultSets = null;
    
    /**
     * Add a named result set.
     *
     * @param string $name      The name of the result set.
     * @param array  $resultSet An indexed array of associative arrays.
     *
     * @return void
     */
    public function addResultSet($name, array $resultSet)
    {
        $this->_resultSets[$name] = $resultSet;
    }
    
    /**
     * Remove a named result set.
     *
     * @param string $name The name of the result set to remove
     *
     * @return void
     */
    public function removeResultSet($name)
    {
        unset($this->_resultSets[$name]);
    }
    
    /**
     * Factory method
     *
     * @param array  $resultSet     An index array of associative arrays.
     *                              This argument is optional.
     * @param string $resultSetName The name of the result set. This argument
     *                              is optional. The default is an empty string.
     *
     * @return XML_Query2XML_Driver_Array
     */
    public static function factory(array $resultSet = null, $resultSetName = '')
    {
        $driver = new XML_Query2XML_Driver_Array();
        if (is_array($resultSet)) {
            $driver->addResultSet($resultSetName, $resultSet);
        }
        return $driver;
    }
    
    /**
     * Returns all records from a named result set.
     *
     * @param array  $query      An array with at least one element: 'query'.
     * @param string $configPath The configuration path.
     *
     * @return array An index array of associative arrays.
     */
    public function getAllRecords($query, $configPath)
    {
        $resultSetName = $query['query'];
        if (!isset($this->_resultSets[$resultSetName])) {
            throw new XML_Query2XML_ArrayException(
                $configPath . ': the result set "' . $resultSetName . '" '
                . 'does not exist'
            );
        }
        $resultSet = $this->_resultSets[$resultSetName];
        if (array_key_exists('data', $query)) {
            /*
             * Only return records that have a corresponding
             * column for each element key of $query['data']
             * and have the same column value as the array
             * element.
             */
            $filteredResultSet = array();
            for ($i = 0; $i < count($resultSet); $i++) {
                $include = true;
                foreach ($query['data'] as $key => $value) {
                    if (array_key_exists($key, $resultSet[$i])) {
                        if ($resultSet[$i][$key] != $value) {
                            $include = false;
                            break;
                        }
                    } else {
                        $include = false;
                    }
                }
                if ($include) {
                    $filteredResultSet[] = $resultSet[$i];
                }
            }
            $resultSet = $filteredResultSet;
        }
        
        return $resultSet;
    }
}

/**
 * Exception for errors related to the array driver.
 *
 * @category XML
 * @package  XML_Query2XML
 * @author   Lukas Feiler <lukas.feiler@lukasfeiler.com>
 * @license  http://www.gnu.org/copyleft/lesser.html  LGPL Version 2.1
 * @link     http://pear.php.net/package/XML_Query2XML
 * @since    Release 1.8.0RC1
 */
class XML_Query2XML_ArrayException extends XML_Query2XML_DriverException
{
    /**
     * Constructor
     *
     * @param string $message The error message.
     */
    public function __construct($message)
    {
        parent::__construct($message);
    }
}
?>