* @link http://www.pradosoft.com/
* @copyright Copyright © 2005 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.DataAccess
*/
/**
* Database provider or adapter base class.
*
* All database providers should extend this base class to provide a uniform
* configuration to the database. Database providers should allow the database
* connection to be set via the {@link setConnectionString ConnectionString}
* property using a DSN string. The DSN format is
*
* $driver://$username:$password@host/$database?options[=value]
*
* Alternatively the database connections details can be set via the {@link
* setDriver Driver}, {@link setUsername Username}, {@link setPassword
* Password}, {@link setHost Host} and {@link setDatabase Database} properties.
* Additional options for individual database driver may be added via the {@link
* setConnectionOptions ConnectionOptions} property.
*
* Database provider implementation must implement the {@link getConnection
* Connection} property that returns a database connection or client. A
* DSN connection string the represents the available connection properties can
* be obtained from the protected method {@link buildConnectionString} method.
*
* @author Wei Zhuo
* @version $Id$
* @package System.DataAccess
* @since 3.0
*/
abstract class TDatabaseProvider extends TModule
{
/**
* @var string DSN connection string.
*/
private $_connectionString = '';
/**
* @var string database name.
*/
private $_database='';
/**
* @var string database driver name.
*/
private $_driver='';
/**
* @var string database host name.
*/
private $_host='';
/**
* @var string database connection username credentail.
*/
private $_username='';
/**
* @var string database connection password credential.
*/
private $_password='';
/**
* @var string additional connection options.
*/
private $_options='';
/**
* DSN connection string of the form
* $driver://$username:$password@host/$database?options[=value]
* @param string DSN style connection string.
*/
public function setConnectionString($value)
{
$this->_connectionString = $value;
}
/**
* @return string DSN connection string
*/
public function getConnectionString()
{
return $this->_connectionString;
}
/**
* @return string database driver name (mysql, sqlite, etc.)
*/
public function getDriver()
{
return $this->_driver;
}
/**
* @param string database driver name.
*/
public function setDriver($value)
{
$this->_driver=$value;
}
/**
* If the driver is sqlite, the host must be dot directory of to
* the sqlite file. E.g. "Application.pages.my_db". The database
* filename must be specified by the Database attribute.
* @return string database host name/IP (and port number) in the format
* "host[:port]"
*/
public function getHost()
{
if(strtolower($this->getDriver()) == "sqlite")
{
$dir = Prado::getPathOfNamespace($this->_host);
return $dir.'/'.$this->getDatabase();
}
else
return $this->_host;
}
/**
* Sets the database host name/IP or resource (and port number) in the
* format "host [: port]"
* @param string the DB host
*/
public function setHost($value)
{
$this->_host=$value;
}
/**
* @return string database connection username credential.
*/
public function getUsername()
{
return $this->_username;
}
/**
* @param string database connection username credential.
*/
public function setUsername($value)
{
$this->_username=$value;
}
/**
* @return string database connection password
*/
public function getPassword()
{
return $this->_password;
}
/**
* @param string database connection password.
*/
public function setPassword($value)
{
$this->_password=$value;
}
/**
* @return string default database name to connect.
*/
public function getDatabase()
{
return $this->_database;
}
/**
* @param string default database name to connect to.
*/
public function setDatabase($value)
{
$this->_database=$value;
}
/**
* @return string additional connection options.
*/
public function getConnectionOptions()
{
return $this->_options;
}
/**
* @param string additional connection options for each individual database
* driver.
*/
public function setConnectionOptions($value)
{
$this->_options=$value;
}
/**
* @return string the DSN connection string build from individual connection
* properties.
*/
protected function buildConnectionString()
{
$driver = $this->getDriver().'://';
$user = $this->getUsername();
$pass = rawurlencode($this->getPassword());
$pass = strlen($pass) > 0 ? ':'.$pass : $pass;
$host = $this->getHost().'/';
if(strtolower($this->getDriver()) == 'sqlite')
$host = rawurlencode($host);
else
$host = '@'.$host;
$db = $this->getDatabase();
$db = strlen($db) > 0 ? '/'.$db : $db;
$options = $this->getConnectionOptions();
return $driver.$user.$pass.$host.$options;
}
/**
* @return TDbConnection a database connection
*/
public abstract function getConnection();
}
/**
* 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 $Id$
* @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 using settings of a TDatabaseProvider.
*/
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. Not all database will support
* transactions.
*/
public function beginTransaction();
/**
* Makes all changes made since the previous commit/rollback permanent and
* releases any database locks. Not all database will support transactions.
*/
public function commit();
/**
* Undoes all changes made in the current transaction and releases any
* database locks. Not all database will support transactions.
*/
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);
}
/**
* Performs the connection to the database using a TDatabaseProvider,
* and provides an interface for executing SQL statements and transactions.
*
* @author Wei Zhuo
* @version $Id$
* @package System.DataAccess
* @since 3.0
*/
abstract class TDbConnection extends TComponent implements IDbConnection
{
/**
* @string TDatabaseProvider database provider containing connection
* details.
*/
private $_provider;
/**
* Creates a new database connection context.
*/
public function __construct(TDatabaseProvider $provider)
{
$this->setProvider($provider);
}
/**
* @param TDatabaseProvider sets the connection details.
*/
public function setProvider($provider)
{
$this->_provider = $provider;
}
/**
* @param TDatabaseProvider gets the database connection details.
*/
public function getProvider()
{
return $this->_provider;
}
/**
* Automatically closes the database connection.
*/
public function __destruct()
{
$this->close();
}
}
?>