<?php
 
/**
 
 * @package DATA_MySQL5
 
 */
 
 
/**
 
 * This class is the abstraction of a MySQL5 database implementing the
 
 * array access behavior.
 
 * 
 
 * Example:
 
 * <code>
 
 * // connect to MySQL
 
 * $DB->connect($server, $user, $pass);
 
 * // select database 
 
 * $DB->selectSchema($schema);
 
 * // access a table
 
 * $DB['table']...;
 
 * </code>
 
 * 
 
 * @todo Implement table existence check.
 
 */
 
class DATA_MySQL5_Database implements ArrayAccess {
 
    /**
 
     * Disables inboxing in this object.
 
     * @var bool
 
     */
 
    protected $inboxingDisabled;
 
    
 
    /**
 
     * Constructor.
 
     */
 
    public function __construct() {
 
        $this->inboxingDisabled = false;
 
    }
 
    
 
    /**
 
     * isset(..) handler. Indicates if table exists in current schema.
 
     * Not implemented yet.
 
     * Will throw {@link DATA_NotImplemented DATA_NotImplemented exception}.
 
     * @param string $offset The table name.
 
     * @return bool True if table exists, false otherwise.
 
     */
 
    public function offsetExists($offset) {
 
        throw new DATA_NotImplemented("DATA_MySQL5_Database::offsetExists");
 
    }
 
    
 
    /**
 
     * [..] handler. Returns a table object corresponding to the array offset.
 
     * Must be a valid table (won't be checked).
 
     * @param string $offset The table name.
 
     * @return DATA_MySQL5_Table The table object.
 
     */
 
    public function offsetGet($offset) {
 
        $table = new DATA_MySQL5_Table($offset);
 
        if ($this->inboxingDisabled) {
 
            $table = $table->withoutInboxing;
 
        }
 
        return $table;
 
    }
 
    
 
    /**
 
     * [..] = handler. Table creation is not available.
 
     * Will throw {@link DATA_ReadOnly DATA_ReadOnly exception}.
 
     */
 
    public function offsetSet($offset, $value) {
 
        throw new DATA_ReadOnly();
 
    }
 
    
 
    /**
 
     * unset(..) handler. Table dropping is not available.
 
     * Will throw {@link DATA_ReadOnly DATA_ReadOnly exception}.
 
     */
 
    public function offsetUnset($offset) {
 
        throw new DATA_ReadOnly();
 
    }
 
    
 
    /**
 
     * Member property overloading.
 
     * 
 
     * withoutInboxing property returns a db object with inboxing of
 
     * mysql types disabled.
 
     * 
 
     * @param string $propname Property name.
 
     * @return mixed Property value.
 
     */
 
    public function __get($propname) {
 
        if ($propname == 'withoutInboxing') {
 
            $newDB = clone $this;
 
            $newDB->inboxingDisabled = true;
 
            return $newDB;
 
        }
 
        throw new Exception("Undefined property: {$propname}");
 
    }
 
    
 
    /**
 
     * Function call overload. Proxies the calls to the common database
 
     * functions, if present.
 
     * @see DATA_MySQL5_Access
 
     */
 
    public function __call($methodName, $arguments) {
 
        if (is_callable(array('DATA_MySQL5_Access', $methodName))) {
 
            return call_user_func_array(array('DATA_MySQL5_Access', $methodName), $arguments);
 
        }
 
    }
 
}
 
?>
 
 
 |