diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/php/application.xml | 31 | ||||
-rw-r--r-- | app/php/db/DBConnection.php | 33 | ||||
-rw-r--r-- | app/php/db/DBModule.php | 45 | ||||
-rw-r--r-- | app/php/db/DBTransaction.php | 53 |
4 files changed, 139 insertions, 23 deletions
diff --git a/app/php/application.xml b/app/php/application.xml index 98f3af5..4aa2f30 100644 --- a/app/php/application.xml +++ b/app/php/application.xml @@ -1,39 +1,24 @@ <?xml version="1.0" encoding="utf-8"?> - <application id="http" mode="Debug"> - <!-- alias definitions and namespace usings - <paths> - <alias id="myalias" path="./lib" /> - <using namespace="Application.common.*" /> - </paths> - --> - - <!-- configurations for modules --> <modules> - <!-- Remove this comment mark to enable caching - <module id="cache" class="System.Caching.TDbCache" /> - --> - + <module id="db" + class="Application.db.DBModule" + config="../../config/db.json" /> + <module class="System.Data.ActiveRecord.TActiveRecordConfig" + ConnectionID="db" + EnableCache="true" /> + <module id="cache" + class="System.Caching.TDbCache" /> <!-- Remove this comment mark to enable PATH url format <module id="request" class="THttpRequest" UrlFormat="Path" /> --> - <!-- Remove this comment mark to enable logging <module id="log" class="System.Util.TLogRouter"> <route class="TBrowserLogRoute" Categories="System" /> </module> --> </modules> - - <!-- configuration for available services --> <services> <service id="page" class="TPageService" DefaultPage="Home" /> </services> - - <!-- application parameters - <parameters> - <parameter id="param1" value="value1" /> - <parameter id="param2" value="value2" /> - </parameters> - --> </application> diff --git a/app/php/db/DBConnection.php b/app/php/db/DBConnection.php new file mode 100644 index 0000000..4fb18c8 --- /dev/null +++ b/app/php/db/DBConnection.php @@ -0,0 +1,33 @@ +<?php + +Prado::using('Application.db.DBTransaction'); +Prado::using('System.Data.TDbConnection'); + +class DBConnection extends TDbConnection { + + public function __construct($dsn = '', $username = '', $password = '', $charset = '') { + $this->setTransactionClass('Application.Code.DBTransaction'); + parent::__construct($dsn, $username, $password, $charset); + } + + private $_transaction = NULL; + public function getCurrentTransaction() { + if (!$this->_transaction->getActive()) { + $this->_transaction = NULL; + } + return $this->_transaction; + } + + public function beginTransaction() { + if ($this->_transaction && $this->_transaction->getActive()) { + $this->_transaction->beginNestedTransaction(); + } + else { + $this->_transaction = parent::beginTransaction(); + } + return $this->_transaction; + } + +} + +?> diff --git a/app/php/db/DBModule.php b/app/php/db/DBModule.php new file mode 100644 index 0000000..3622db0 --- /dev/null +++ b/app/php/db/DBModule.php @@ -0,0 +1,45 @@ +<?php + +Prado::using('System.Data.TDataSourceConfig'); + +class DBModule extends TDataSourceConfig { + + private $_config; + + public function init($xml) { + $this->setConnectionClass('Application.db.DBConnection'); + $config = json_decode(file_get_contents( + realpath( + $this->getApplication()->getBasePath() + . DIRECTORY_SEPARATOR + . $this->_config + ) + )); + $newXML = new TXmlElement('module'); + foreach ($xml->getAttributes() as $attr => $val) { + $newXML->setAttribute($attr, $val); + } + $dbXML = new TXmlElement('database'); + if (isset($config->cset)) { + $dbXML->setAttribute('Charset', $config->cset); + } + $dbXML->setAttribute('Username', $config->user); + $dbXML->setAttribute('Password', $config->pass); + $dbXML->setAttribute( + 'ConnectionString', + sprintf( + '%s:host=%s;dbname=%s', + $config->type, $config->host, $config->name + ) + ); + $newXML->Elements[] = $dbXML; + parent::init($newXML); + } + + public function setConfig($config) { + $this->_config = TPropertyValue::ensureString($config); + } + +} + +?> diff --git a/app/php/db/DBTransaction.php b/app/php/db/DBTransaction.php new file mode 100644 index 0000000..b176453 --- /dev/null +++ b/app/php/db/DBTransaction.php @@ -0,0 +1,53 @@ +<?php + +Prado::using('Application.db.DBConnection'); +Prado::using('System.Data.TDbTransaction'); + +class DBTransaction extends TDbTransaction { + + private $_nestedCount = 0; + private $_rolledBack = FALSE; + + public function beginNestedTransaction() { + if ($this->getActive()) { + $this->_nestedCount++; + } + } + + public function commit() { + if ($this->_rolledBack) { + $childTransaction = (bool)($this->_nestedCount); + $this->rollback(); + if (!$childTransaction) { + throw new TDbException('Nested transaction was rolled back, unable to commit.'); + } + } + else { + if ($this->_nestedCount) { + $this->_nestedCount--; + } + else { + parent::commit(); + } + } + } + + public function rollback() { + if (!$this->getActive()) { + $this->_nestedCount = 0; + return; + } + if ($this->_nestedCount) { + $this->_rolledBack = TRUE; + $this->_nestedCount--; + } + else { + parent::rollback(); + $this->_nestedCount = 0; + $this->_rolledBack = FALSE; + } + } + +} + +?> |