From e9044ac913b511f9f1b2aad12d18a79f40131b8b Mon Sep 17 00:00:00 2001
From: wei <>
Date: Fri, 19 May 2006 03:05:18 +0000
Subject: Update TAdodb and removed a few drivers.
---
framework/DataAccess/TAdodb.php | 256 +++++++++++++++++++++++++++++++++++-----
1 file changed, 225 insertions(+), 31 deletions(-)
(limited to 'framework/DataAccess/TAdodb.php')
diff --git a/framework/DataAccess/TAdodb.php b/framework/DataAccess/TAdodb.php
index f6b486e4..c7005c76 100644
--- a/framework/DataAccess/TAdodb.php
+++ b/framework/DataAccess/TAdodb.php
@@ -1,17 +1,100 @@
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright © 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Revision: $ $Date: $
+ * @package System.DataAccess
+ */
+/**
+ * Include the database provider base class.
+ */
Prado::using('System.DataAccess.TDatabaseProvider');
/**
- * Adbodb data access module.
+ * TAdodb database connection module.
+ *
+ * The TAdodb module class allows the database connection details to be
+ * specified in the application.xml or config.xml, the later are directory level
+ * configurations.
+ *
+ * ...
+ *
+ * ...
+ *
+ * ...
+ *
+ * ...
+ *
+ * Where mysql is the driver name, username and
+ * password are the required credentials to connection to the database,
+ * localhost is the database resource and mydatabase is the
+ * name of database to connect to.
+ *
+ * The Adodb library supports many database drivers. The drivers included are
+ * # mysql MySQL without transactions.
+ * # mysqlt MySQL 3.23 or later with transaction support.
+ * # mysqli MySQLi extension, does not support transactions.
+ * # pdo_mysql PDO driver for MysSQL.
+ *
+ * # oracle Oracle 7.
+ * # oci8po Portable version of oci8 driver.
+ * # oci8 Oracle (oci8).
+ * # oci805 Oracle 8.0.5 driver.
+ * # pdo_oci PDO driver for Oracle.
+ * # odbc_oracle Oracle support via ODBC.
*
- * Usage:
+ * # postgres7 Postgres 7, 8.
+ * # pdo_pgsql PDO driver for postgres.
+ * # postgres64 Postgress 6.4.
+ *
+ * # pdo_mssql PDO driver for MSSQL.
+ * # odbc_mssql MSSQL support via ODBC.
+ * # mssqlpo Portable MSSQL Driver that supports || instead of +.
+ * # ado_mssql Microsoft SQL Server ADO data driver.
+ * # mssql Native mssql driver.
+ *
+ * # ldap LDAP.
+ * # sqlite SQLite database.
+ *
+ * For other database drivers and detail documentation regarding indiviual
+ * drivers visit {@link http://adodb.sourceforge. net/}
+ *
+ * When using an sqlite database it is easier to specify the {@link setDriver
+ * Driver} as "sqlite" and {@link setHost Host} as the path to the sqlite
+ * database file. For example:
*
- * $provider = new TAdodb;
- * $provider->setConnectionString($dsn); $
- * connection = $provider->getConnection();
- * $resultSet = $connection->execute('....');
+ *
+ *
+ * Note that the database file should not contain no dots. The path can
+ * be use namespace or a fullpath (but no dots).
+ *
+ * To access the database from a TPage or other TApplicationComponent classes
+ * use the {@link TApplication::getModule getModule} method of TApplication.
+ *
+ * $db = $this->getApplication()->getModule('my_db1');
+ * //similarly
+ * $db = $this->Application->Modules['my_db1'];
*
+ *
+ * For classes that are not instance of TApplicationComponent (such as
+ * TUserManager) use the static {@link PradoBase::getApplication getApplication}
+ * method first.
+ *
+ * $db = Prado::getApplication()->getModule('my_db1');
+ *
+ *
+ * If you wish to use a Adodb connections without module configuration, see the
+ * TAdodbConnection class.
*
* @author Wei Zhuo
* @version $Revision: $ $Date: $
@@ -20,44 +103,113 @@ Prado::using('System.DataAccess.TDatabaseProvider');
*/
class TAdodb extends TDatabaseProvider
{
+ /**
+ * @var string Adodb associative fetch mode.
+ */
const FETCH_ASSOCIATIVE='associative';
+ /**
+ * @var string Adodb numeric fetch mode.
+ */
const FETCH_NUMERIC='numeric';
+ /**
+ * @var string Adodb fetch mode using both associative and numeric.
+ */
const FETCH_BOTH='both';
+ /**
+ * @var string Adodb default fetch mode.
+ */
const FETCH_DEFAULT='default';
+ /**
+ * @var TAdodbConnection database connection.
+ */
private $_connection = null;
+ /**
+ * @var string Adodb record set cache directory.
+ */
private $_cachedir='';
+ /**
+ * @var string current fetch mode.
+ */
private $_fetchMode = 'associative';
+ /**
+ * @var boolean whether to enable the active recors.
+ */
+ private $_enableActiveRecords = false;
+ /**
+ * @return TAdodbConnection connects to the database and returns the
+ * connection resource.
+ */
public function getConnection()
{
- $this->initialize();
return $this->_connection;
}
-
- public function initialize()
+
+ /**
+ * Initialize the module configurations.
+ */
+ public function init($config)
{
+ parent::init($config);
if(!class_exists('ADOConnection', false))
$this->importAdodbLibrary();
if(is_null($this->_connection))
- $this->_connection = new TAdodbConnection($this);
+ {
+ if($config instanceof TAdodbConnection)
+ $this->_connection = $config;
+ else
+ $this->_connection = new TAdodbConnection($this);
+ if($this->getEnableActiveRecords())
+ $this->initializeActiveRecords();
+ }
}
- public function enableActiveRecords()
+ /**
+ * Enabling Adodb to retrieve results as active records, and active record
+ * object to save changes. Once set to true and the connection is
+ * initialized, setting EnableActiveRecords to false has no effect.
+ * @param boolean true to allow active records.
+ */
+ public function setEnableActiveRecords($value)
+ {
+ $this->_enableActiveRecords = TPropertyValue::ensureBoolean($value);
+ }
+
+ /**
+ * @param boolean whether to enable active records.
+ */
+ public function getEnableActiveRecords()
{
- $conn = $this->getConnection();
- if(is_null($conn->getInternalConnection()) && $conn->open())
+ return $this->_enableActiveRecords;
+ }
+
+ /**
+ * Initialize the active records by setting the active records database
+ * adpater to the current database connection.
+ */
+ public function initializeActiveRecords()
+ {
+ $conn = $this->_connection;
+ if(!is_null($conn->getInternalConnection()) || $conn->open())
{
Prado::using('System.DataAccess.TActiveRecord');
TActiveRecord::setDatabaseAdapter($conn->getInternalConnection());
+ $this->_enableActiveRecords = true;
}
}
+ /**
+ * @return string the adodb library path.
+ */
protected function getAdodbLibrary()
{
return Prado::getPathOfNamespace('System.3rdParty.adodb');
}
+ /**
+ * Import the necessary adodb library files.
+ */
protected function importAdodbLibrary()
{
$path = $this->getAdodbLibrary();
@@ -66,7 +218,7 @@ class TAdodb extends TDatabaseProvider
}
/**
- * @return string the cache directory for adodb module
+ * @return string the cache directory for Adodb to save cached queries.
*/
public function getCacheDir()
{
@@ -74,17 +226,17 @@ class TAdodb extends TDatabaseProvider
}
/**
- * Sets the cache directory for ADODB (in adodb it is
- * called to $ADODB_CACHE_DIR)
+ * The cache directory for Adodb to save cached queries. The path can be
+ * specified using a namespace or the fullpath.
* @param string the cache directory for adodb module
*/
public function setCacheDir($value)
{
- $this->_cachedir=$value;
+ $this->_cachedir=Prado::getPathOfNamespace($value);
}
/**
- * @return string fetch mode of query data
+ * @return string fetch mode of queried data
*/
public function getFetchMode()
{
@@ -92,7 +244,9 @@ class TAdodb extends TDatabaseProvider
}
/**
- * Sets the fetch mode of query data: Associative, Numeric, Both, Default (default)
+ * Sets the fetch mode of query data, valid modes are Associative,
+ * Numeric, Both or Default. The mode names are
+ * case insensitive.
* @param string the fetch mode of query data
*/
public function setFetchMode($value)
@@ -104,16 +258,23 @@ class TAdodb extends TDatabaseProvider
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/}.
+ * TAdodbConnection provides access to the ADODB ADOConnection class. For detail
+ * documentation regarding indiviual drivers visit {@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.
+ * will be passed an ADOConnection instance.
+ *
+ * To use TAdodbConnection without the TAdodb database connection provider pass
+ * a DSN style connection string to the TAdodbConnection constructor.
+ *
+ * $dsn = "mysql://username:password@localhost/mydb";
+ * $db = new TAdodbConnection($dsn);
+ * $resultSet = $db->execute('...');
+ *
*
* @author Wei Zhuo
* @version $Revision: $ $Date: $
@@ -122,10 +283,14 @@ class TAdodb extends TDatabaseProvider
*/
class TAdodbConnection extends TDbConnection
{
+ /**
+ * @var ADOConnection database connection.
+ */
private $_connection;
/**
- * Gets the internal connection.
+ * Gets the internal connection. Should only be used by framework
+ * developers.
*/
public function getInternalConnection()
{
@@ -190,16 +355,38 @@ class TAdodbConnection extends TDbConnection
return call_user_func_array(array($this->_connection,$method),$params);
}
+ /**
+ * @return boolean true if the database is connected.
+ */
public function getIsClosed()
{
return is_null($this->_connection) || !$this->_connection->IsConnected();
}
+ /**
+ * Prepares (compiles) an SQL query for repeated execution. Bind parameters
+ * are denoted by ?, except for the oci8 driver, which uses the traditional
+ * Oracle :varname convention. If there is an error, or we are emulating
+ * Prepare( ), we return the original $sql string.
+ *
+ * Prepare( ) cannot be used with functions that use SQL query rewriting
+ * techniques, e.g. PageExecute( ) and SelectLimit( ).
+ *
+ * @param string sql statement.
+ * @return array an array containing the original sql statement in the first
+ * array element;
+ */
public function prepare($statement)
{
return $this->_connection->prepare($statement);
}
+ /**
+ * Execute SQL statement $sql and return derived class of ADORecordSet if
+ * successful. Note that a record set is always returned on success, even if
+ * we are executing an insert or update statement. You can also pass in $sql
+ * a statement prepared in {@link prepare}.
+ */
public function execute($sql, $parameters=array())
{
return $this->_connection->execute($sql, $parameters);
@@ -221,13 +408,21 @@ class TAdodbConnection extends TDbConnection
return $this->connection->CompleteTrans();
}
-
+ /**
+ * End a transaction successfully.
+ * @return true if successful. If the database does not support
+ * transactions, will return true also as data is always committed.
+ */
public function commit()
{
return $this->connection->CommitTrans();
}
-
+ /**
+ * End a transaction, rollback all changes.
+ * @return true if successful. If the database does not support
+ * transactions, will return false as data is never rollbacked.
+ */
public function rollback()
{
return $this->connection->RollbackTrans();
@@ -242,7 +437,7 @@ class TAdodbConnection extends TDbConnection
if($this->getIsClosed())
{
$provider = $this->getProvider();
- $provider->initialize();
+ $provider->init($this);
if(strlen($provider->getConnectionString()) < 1)
{
if(strlen($provider->getDriver()) < 1)
@@ -259,13 +454,13 @@ class TAdodbConnection extends TDbConnection
}
/**
- * Complete the database connection.
+ * Creates the database connection using host, username, password and
+ * database name properties.
*/
protected function initConnection()
{
$provider = $this->getProvider();
-
- if($provider->getUsePersistentConnection())
+ if(is_int(strpos($provider->getConnectionOptions(), 'persist')))
{
$this->_connection->PConnect($provider->getHost(),
$provider->getUsername(),$provider->getPassword(),
@@ -328,7 +523,6 @@ class TAdodbConnection extends TDbConnection
{
return $this->_connection->qstr($string, $magic_quotes);
}
-
}
?>
\ No newline at end of file
--
cgit v1.2.3