summaryrefslogtreecommitdiff
path: root/framework/DataAccess/TAdodbProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/DataAccess/TAdodbProvider.php')
-rw-r--r--framework/DataAccess/TAdodbProvider.php342
1 files changed, 342 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