From 41c5b7e566c0019d0b8e0c9399b780a95ad44113 Mon Sep 17 00:00:00 2001 From: wei <> Date: Wed, 22 Feb 2006 04:01:28 +0000 Subject: Adding DataAccess modules. --- framework/DataAccess/TAdodbProvider.php | 342 ++++++++++++++++++++++++++++ framework/DataAccess/TCreoleProvider.php | 84 +++++++ framework/DataAccess/TDatabaseException.php | 11 + framework/DataAccess/TDatabaseProvider.php | 258 +++++++++++++++++++++ 4 files changed, 695 insertions(+) create mode 100644 framework/DataAccess/TAdodbProvider.php create mode 100644 framework/DataAccess/TCreoleProvider.php create mode 100644 framework/DataAccess/TDatabaseException.php create mode 100644 framework/DataAccess/TDatabaseProvider.php (limited to 'framework') 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 @@ + + * $provider = new TAdodbProvider; + * $provider->setConnectionString($dsn); + * $connection = $provider->getConnection(); + * $resultSet = $connection->execute('....'); + * + * + * @author Wei Zhuo + * @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 + * @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 @@ +_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 @@ + \ 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 @@ + + * @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 + * @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 + * @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 -- cgit v1.2.3