diff options
| -rw-r--r-- | .gitattributes | 4 | ||||
| -rw-r--r-- | framework/DataAccess/TAdodbProvider.php | 342 | ||||
| -rw-r--r-- | framework/DataAccess/TCreoleProvider.php | 84 | ||||
| -rw-r--r-- | framework/DataAccess/TDatabaseException.php | 11 | ||||
| -rw-r--r-- | framework/DataAccess/TDatabaseProvider.php | 258 | 
5 files changed, 699 insertions, 0 deletions
| diff --git a/.gitattributes b/.gitattributes index 4c19b017..f59e7084 100644 --- a/.gitattributes +++ b/.gitattributes @@ -274,6 +274,10 @@ framework/Data/TSimpleDateFormatter.php -text  framework/Data/TSqliteCache.php -text  framework/Data/TTarFileExtractor.php -text  framework/Data/TXmlDocument.php -text +framework/DataAccess/TAdodbProvider.php -text +framework/DataAccess/TCreoleProvider.php -text +framework/DataAccess/TDatabaseException.php -text +framework/DataAccess/TDatabaseProvider.php -text  framework/Exceptions/TErrorHandler.php -text  framework/Exceptions/TException.php -text  framework/Exceptions/messages.txt -text diff --git a/framework/DataAccess/TAdodbProvider.php b/framework/DataAccess/TAdodbProvider.php new file mode 100644 index 00000000..9c63b20b --- /dev/null +++ b/framework/DataAccess/TAdodbProvider.php @@ -0,0 +1,342 @@ +<?php
 +
 +Prado::using('System.DataAccess.TDatabaseProvider');
 +Prado::using('System.DataAccess.TDatabaseException');
 +
 +/**
 + * Adbodb data access module.
 + * 
 + * Usage:
 + * <code>
 + * $provider = new TAdodbProvider;
 + * $provider->setConnectionString($dsn);
 + * $connection = $provider->getConnection();
 + * $resultSet = $connection->execute('....');
 + * </code>
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.DataAccess
 + * @since 3.0
 + */
 +class TAdodbProvider extends TDatabaseProvider
 +{
 +	const FETCH_ASSOCIATIVE='associative';
 +	const FETCH_NUMERIC='numeric';
 +	const FETCH_BOTH='both';
 +	const FETCH_DEFAULT='default';
 +
 +	private $_connection = null;
 +	private $_cachedir='';
 +	private $_fetchMode = 'associative';
 +
 +	private $_hasImported=false;
 +
 +	private $_adodbLibrary='';
 +
 +	public function getConnection()
 +	{
 +		if(is_null($this->_connection))
 +		{
 +			$this->importAdodbLibrary();
 +			$this->_connection = new TAdodbConnection($this);
 +		}
 +		return $this->_connection;
 +	}
 +
 +	/**
 +	 * @return string the cache directory for adodb module
 +	 */
 +	public function getCacheDir()
 +	{
 +		return $this->_cachedir;
 +	}
 +
 +	public function getAdodbLibrary()
 +	{
 +		if(strlen($this->_adodbLibrary) < 1)
 +			return dirname(__FILE__).'/adodb';
 +		else
 +			return $this->_adodbLibrary;
 +	}
 +
 +	public function setAdodbLibrary($path)
 +	{
 +		$this->_adodbLibrary = $path;
 +	}
 +
 +	public function importAdodbLibrary()
 +	{
 +		if(!$this->_hasImported || !class_exists('ADONewConnection'))
 +		{
 +			require($this->getAdodbLibrary().'/adodb-exceptions.inc.php');
 +			require($this->getAdodbLibrary().'/adodb.inc.php');
 +			$this->_hasImported = true;
 +		}
 +	}
 +
 +	/**
 +	 * Sets the cache directory for ADODB (in adodb it is
 +	 * called to $ADODB_CACHE_DIR)
 +	 * @param string the cache directory for adodb module
 +	 */
 +	public function setCacheDir($value)
 +	{
 +		$this->_cachedir=$value;
 +	}
 +
 +	/**
 +	 * @return string fetch mode of query data
 +	 */
 +	public function getFetchMode()
 +	{
 +		return $this->_fetchMode;
 +	}
 +
 +	/**
 +	 * Sets the fetch mode of query data: Associative, Numeric, Both, Default (default)
 +	 * @param string the fetch mode of query data
 +	 */
 +	public function setFetchMode($value)
 +	{
 +		$value = strtolower($value);
 +		if($value===self::FETCH_ASSOCIATIVE || $value===self::FETCH_NUMERIC 
 +				|| $value===self::FETCH_BOTH)
 +			$this->_fetchMode=$value;
 +		else
 +			$this->_fetchMode=self::FETCH_DEFAULT;
 +	}
 +
 +}
 +
 +/**
 + * TAdodbConnection is a wrapper class of the ADODB ADOConnection class.
 + * For more information about the ADODB library, see {@link http://adodb.sourceforge.net/}.
 + *
 + * You can call any method implemented in ADOConnection class via TAdodbConnection,
 + * such as TAdodbConnection::FetchRow(), and so on. The method calls
 + * will be passed to ADOConnection class.
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.DataAccess
 + * @since 3.0
 + */
 +class TAdodbConnection extends TDbConnection
 +{
 +	private $_connection;
 +
 +	/**
 +	 * Constructor, initialize a new Adodb connection.
 +	 * @param string|TAdodbProvider DSN connection string or a TAdodbProvider
 +	 */
 +	public function __construct($provider=null)
 +	{
 +		parent::__construct($provider);
 +		if(is_string($provider))
 +			$this->initProvider($provider);
 +	}
 +
 +	/**
 +	 * Create a new provider for this connection using the DSN string.
 +	 * @param string DSN connection string.
 +	 */
 +	protected function initProvider($connectionString)
 +	{
 +		$provider  = new TAdodbProvider();
 +		$provider->setConnectionString($connectionString);
 +		$this->setProvider($provider);
 +	}
 +
 +	/**
 +	 * PHP magic function.
 +	 * This method will pass all method calls to ADOConnection class
 +	 * provided in the ADODB library.
 +	 * @param mixed method name
 +	 * @param mixed method call parameters
 +	 * @param mixed return value of the method call
 +	 */
 +	public function __call($method, $params)
 +	{
 +		if(is_null($this->_connection) || !$this->_connection->IsConnected())
 +			$this->open();
 +		return call_user_func_array(array($this->_connection,$method),$params);
 +	}
 +
 +	/** 
 +	 * Cleanup work before serializing. 
 +	 * This is a PHP defined magic method. 
 +	 * @return array the names of instance-variables to serialize. 
 +	 */ 
 +	public function __sleep() 
 +	{ 
 +		$this->close(); 
 +		return array_keys(get_object_vars($this)); 
 +	} 
 +
 +	/** 
 +	 * This method will be automatically called when unserialization happens. 
 +	 * This is a PHP defined magic method. 
 +	 */ 
 +	public function __wakeup() 
 +	{ 
 +	} 
 +
 +
 +	public function getIsClosed()
 +	{
 +		return is_null($this->_connection) || !$this->_connection->IsConnected();
 +	}
 +
 +	public function prepare($statement)
 +	{
 +		return $this->_connection->prepare($statement);
 +	}
 +
 +	public function execute($sql, $parameters=array())
 +	{
 +		return $this->_connection->execute($sql, $parameters);
 +	}
 +
 +	/**
 +	 * Start a transaction on this connection.
 +	 */
 +	public function beginTransaction()
 +	{
 +		return $this->_connection->StartTrans();
 +	}
 +
 +	/**
 +	 * Finish and cleanup transactions.
 +	 */
 +	public function completeTranaction()
 +	{
 +		return $this->connection->CompleteTrans();
 +	}
 +
 +	/**
 +	 * Fail the current transaction.
 +	 */
 +	public function failTransaction()
 +	{
 +		return $this->connection->FailTrans();
 +	}
 +
 +	/**
 +	 * @return boolean true if transaction has failed.
 +	 */
 +	public function getHasTransactionFailed()
 +	{
 +		return $this->connection->HasFailedTrans();
 +	}
 +
 +	public function commit()
 +	{
 +		return $this->connection->CommitTrans();
 +	}
 +
 +
 +	public function rollback()
 +	{
 +		return $this->connection->RollbackTrans();
 +	}
 +
 +	/**
 +	 * Establishes a DB connection.
 +	 * An ADOConnection instance will be created if none.
 +	 */
 +	public function open()
 +	{
 +		if($this->getIsClosed())
 +		{
 +			$provider = $this->getProvider();
 +			if(strlen($provider->getConnectionString()) < 1)
 +			{
 +				if(strlen($provider->getDriver()) < 1)
 +					throw new TDbConnectionException('db_driver_required');
 +
 +				$this->_connection=ADONewConnection($provider->getDriver());
 +				$this->initConnection();
 +			}
 +			else
 +				$this->_connection=ADONewConnection($provider->getConnectionString());
 +			$this->initFetchMode();
 +			$this->initCacheDir();
 +		}
 +		return $this->_connection->IsConnected();
 +	}	
 +
 +	/**
 +	 * Complete the database connection.
 +	 */
 +	protected function initConnection()
 +	{
 +		$provider = $this->getProvider();
 +
 +		if($provider->getUsePersistentConnection())
 +		{
 +			$this->_connection->PConnect($provider->getHost(),
 +				$provider->getUsername(),$provider->getPassword(),
 +					$provider->getDatabase());
 +		}
 +		else
 +		{
 +			$this->_connection->Connect($provider->getHost(),
 +				$provider->getUsername(),$provider->getPassword(),
 +					$provider->getDatabase());
 +		}	
 +	}
 +
 +	/**
 +	 * Initialize the fetch mode.
 +	 */
 +	protected function initFetchMode()
 +	{
 +		global $ADODB_FETCH_MODE;
 +		$provider = $this->getProvider();
 +		if($provider->getFetchMode()===TAdodbProvider::FETCH_ASSOCIATIVE)
 +			$ADODB_FETCH_MODE=ADODB_FETCH_ASSOC;
 +		else if($provider->fetchMode===TAdodbProvider::FETCH_NUMERIC)
 +			$ADODB_FETCH_MODE=ADODB_FETCH_NUM;
 +		else if($provider->fetchMode===TAdodbProvider::FETCH_BOTH)
 +			$ADODB_FETCH_MODE=ADODB_FETCH_BOTH;
 +		else
 +			$ADODB_FETCH_MODE=ADODB_FETCH_DEFAULT;
 +	}
 +
 +	/**
 +	 * Initialize the cache directory.
 +	 */
 +	protected function initCacheDir()
 +	{
 +		global $ADODB_CACHE_DIR;
 +		$provider = $this->getProvider();
 +		if($provider->getCacheDir()!=='')
 +			$ADODB_CACHE_DIR=$provider->getCacheDir();
 +	}
 +
 +	/**
 +	 * Closes the DB connection.
 +	 * You are not required to call this method as PHP will automatically
 +	 * to close any DB connections when exiting a script.
 +	 */
 +	public function close()
 +	{
 +		if(!is_null($this->_connection) && $this->_connection->IsConnected())
 +			$this->_connection->Close();
 +	}
 +
 +	/**
 +	 * @param string quote a string to be sent to the database.
 +	 * @param boolean if true it ensure that the variable is not quoted twice, 
 +	 * once by quote and once by the magic_quotes_gpc.
 +	 * @return string database specified quoted string
 +	 */
 +	public function quote($string, $magic_quotes=false)
 +	{
 +		return $this->_connection->qstr($string, $magic_quotes);
 +	}
 +
 +}
 +
 +?>
\ No newline at end of file diff --git a/framework/DataAccess/TCreoleProvider.php b/framework/DataAccess/TCreoleProvider.php new file mode 100644 index 00000000..d45818fa --- /dev/null +++ b/framework/DataAccess/TCreoleProvider.php @@ -0,0 +1,84 @@ +<?php
 +
 +Prado::using('System.DataAccess.TDatabaseProvider');
 +Prado::using('System.DataAccess.TDatabaseException');
 +
 +Prado::using('System.DataAccess.creole.*');
 +
 +class TCreoleProvider extends TDatabaseProvider
 +{
 +	private $_connection = null;
 +
 +	public function getConnection()
 +	{
 +		if(is_null($this->_connection))
 +			$this->_connection = new TCreoleConnection($this);
 +		return $this->_connection;
 +	}
 +
 +	public function getConnectionString()
 +	{
 +		if(strlen(parent::getConnectionString()) > 0)
 +			return parent::getConnectionString();
 +		else
 +			return $this->generateConnectionString();
 +	}
 +
 +	protected function generateConnectionString()
 +	{
 +		$driver = $this->getDriver();
 +		$user = $this->getUsername();
 +		$pass = $this->getPassword();
 +		$host = $this->getHost();
 +		$database = $this->getDatabase();
 +
 +		$pass = strlen($pass) > 0 ? ':'.$pass : '';
 +		$username_password = strlen($user) > 0 ? $user.$pass.'@' : '';
 +		$database = strlen($database) > 0 ? '/'.$database : '';
 +
 +		return "{$driver}://{$username_password}{$host}{$database}";
 +	}
 +}
 +
 +class TCreoleConnection extends TDbConnection
 +{
 +	private $_connection = null;
 +
 +	protected function beginDbTransaction()
 +	{
 +	}
 +
 +	/**
 +	 * Closes the connection to the database.
 +	 */
 +	public function close()
 +	{
 +		$this->_connection->close();
 +	}
 +
 +	public function prepare($statement)
 +	{
 +		return $this->_connection->prepareStatement($statement);
 +	}
 +
 +	public function execute($sql, 
 +
 +	/**
 +	 * Opens a database connection with settings provided in the ConnectionString.
 +	 */
 +	public function open()
 +	{
 +		if(is_null($this->_connection))
 +		{
 +			$connectionString = $this->getProvider()->getConnectionString();
 +			if(strlen($connectionString) < 1 || strcmp($connectionString,'://') === 0)
 +				throw new TDbConnectionException('db_driver_required');
 +			$class = 'System.DataAccess.creole.creole.Creole';
 +			$creole = Prado::createComponent($class);
 +			$this->_connection = $creole->getConnection($connectionString);				
 +		}
 +		return $this->_connection;
 +	}
 +}
 +
 +?>
\ No newline at end of file diff --git a/framework/DataAccess/TDatabaseException.php b/framework/DataAccess/TDatabaseException.php new file mode 100644 index 00000000..7d01bbc5 --- /dev/null +++ b/framework/DataAccess/TDatabaseException.php @@ -0,0 +1,11 @@ +<?php
 +
 +class TDatabaseException extends TException
 +{
 +}
 +
 +class TDbConnectionException extends TDatabaseException
 +{
 +}
 +
 +?>
\ No newline at end of file diff --git a/framework/DataAccess/TDatabaseProvider.php b/framework/DataAccess/TDatabaseProvider.php new file mode 100644 index 00000000..8f676345 --- /dev/null +++ b/framework/DataAccess/TDatabaseProvider.php @@ -0,0 +1,258 @@ +<?php
 +
 +/**
 + * Database access module. 
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.DataAccess
 + * @since 3.0
 + */
 +abstract class TDatabaseProvider extends TModule
 +{
 +	private $_connectionString = '';
 +	private $_database='';
 +	private $_driver='';
 +	private $_host='';
 +	private $_username='';
 +	private $_password='';
 +	private $_persistent=true;
 +
 +	/**
 +	 * @param string used to open the connection
 +	 */
 +	public function	setConnectionString($value)
 +	{
 +		$this->_connectionString = $value;
 +	}
 +
 +	/**
 +	 * @return string used to open the connection
 +	 */
 +	public function getConnectionString()
 +	{
 +		return $this->_connectionString;
 +	}
 +
 +	/**
 +	 * @return string the DB driver (mysql, sqlite, etc.)
 +	 */
 +	public function getDriver()
 +	{
 +		return $this->_driver;
 +	}
 +
 +	/**
 +	 * Sets the DB driver (mysql, sqlite, etc.)
 +	 * @param string the DB driver
 +	 */
 +	public function setDriver($value)
 +	{
 +		$this->_driver=$value;
 +	}
 +
 +	/**
 +	 * @return string the DB host name/IP (and port number) in the format "host[:port]"
 +	 */
 +	public function getHost()
 +	{
 +		return $this->_host;
 +	}
 +
 +	/**
 +	 * Sets the DB host name/IP (and port number) in the format "host[:port]"
 +	 * @param string the DB host
 +	 */
 +	public function setHost($value)
 +	{
 +		$this->_host=$value;
 +	}
 +
 +	/**
 +	 * @return string the DB username
 +	 */
 +	public function getUsername()
 +	{
 +		return $this->_username;
 +	}
 +
 +	/**
 +	 * Sets the DB username
 +	 * @param string the DB username
 +	 */
 +	public function setUsername($value)
 +	{
 +		$this->_username=$value;
 +	}
 +
 +	/**
 +	 * @return string the DB password
 +	 */
 +	public function getPassword()
 +	{
 +		return $this->_password;
 +	}
 +
 +	/**
 +	 * Sets the DB password
 +	 * @param string the DB password
 +	 */
 +	public function setPassword($value)
 +	{
 +		$this->_password=$value;
 +	}
 +
 +	/**
 +	 * @return string the database name
 +	 */
 +	public function getDatabase()
 +	{
 +		return $this->_database;
 +	}
 +
 +	/**
 +	 * Sets the database name
 +	 * @param string the database name
 +	 */
 +	public function setDatabase($value)
 +	{
 +		$this->_database=$value;
 +	}
 +
 +	/**
 +	 * @return boolean whether the DB connection is persistent
 +	 */
 +	public function getUsePersistentConnection()
 +	{
 +		return $this->_persistent;
 +	}
 +
 +	/**
 +	 * Sets whether the DB connection should be persistent
 +	 * @param boolean whether the DB connection should be persistent
 +	 */
 +	public function setUsePersistentConnection($value)
 +	{
 +		$this->_persistent=$value;
 +	}
 +
 +	/**
 +	 * @return TDbConnection a database connection
 +	 */
 +	public abstract function getConnection();
 +}
 +
 +/**
 + * Performs the connection to the database using a TDatabaseProvider, 
 + * executes SQL statements.
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.DataAccess
 + * @since 3.0
 + */
 +abstract class TDbConnection extends TComponent implements IDbConnection
 +{
 +	private $_provider;
 +
 +	public function __construct($provider)
 +	{
 +		if($provider instanceof TDatabaseProvider)
 +			$this->setProvider($provider);
 +	}
 +	
 +	public function setProvider($provider)
 +	{
 +		$this->_provider = $provider;
 +	}
 +
 +	public function getProvider()
 +	{
 +		return $this->_provider;
 +	}
 +}
 +
 +/**
 + * A connection (session) with a specific database. SQL statements are executed 
 + * and results are returned within the context of a connection.
 + *
 + * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 + * @version $Revision: $  $Date: $
 + * @package System.DataAccess
 + * @since 3.0
 + */
 +interface IDbConnection
 +{
 +	/**
 +	 * Closes the connection to the database.
 +	 */
 +	public function close();
 +
 +	/**
 +	 * @return boolean retrieves whether this connection has been closed.
 +	 */
 +	public function getIsClosed();
 +
 +	/**
 +	 * Opens a database connection with settings provided in the ConnectionString.
 +	 */
 +	public function open();
 +
 +	/**
 +	 * @return string creates a prepared statement for sending parameterized 
 +	 * SQL statements to the database.
 +	 */
 +	public function prepare($statement);
 +
 +	/**
 +	 * Executes the SQL statement which may be any kind of SQL statement, 
 +	 * including prepared statements.
 +	 * @param string sql query statement
 +	 * @param array subsititution parameters
 +	 * @return mixed result set
 +	 */
 +	public function execute($sql, $parameters=array());
 +
 +	/**
 +	 * Start a transaction on this connection.
 +	 */
 +	public function beginTransaction();
 +
 +	/**
 +	 * Finish and cleanup transactions.
 +	 */
 +	public function completeTranaction();
 +
 +	/**
 +	 * Fail the current transaction.
 +	 */
 +	public function failTransaction();
 +
 +	/**
 +	 * @return boolean true if transaction has failed.
 +	 */
 +	public function getHasTransactionFailed();
 +
 +	/**
 +	 * Makes all changes made since the previous commit/rollback permanent and 
 +	 * releases any database locks.
 +	 */
 +	public function commit();
 +
 +	/**
 +	 * Undoes all changes made in the current transaction and releases any 
 +	 * database locks
 +	 */
 +	public function rollback();
 +
 +	/**
 +	 * @param string quote a string to be sent to the database.
 +	 * @param boolean if true it ensure that the variable is not quoted twice, 
 +	 * once by quote and once by the magic_quotes_gpc.
 +	 * @return string database specified quoted string
 +	 */
 +	public function quote($string, $magic_quotes=false);
 +
 +}
 +
 +?>
\ No newline at end of file | 
