summaryrefslogtreecommitdiff
path: root/framework/DataAccess
diff options
context:
space:
mode:
Diffstat (limited to 'framework/DataAccess')
-rw-r--r--framework/DataAccess/TAdodbProvider.php342
-rw-r--r--framework/DataAccess/TCreoleProvider.php84
-rw-r--r--framework/DataAccess/TDatabaseException.php11
-rw-r--r--framework/DataAccess/TDatabaseProvider.php258
4 files changed, 695 insertions, 0 deletions
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