summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/php/application.xml31
-rw-r--r--app/php/db/DBConnection.php33
-rw-r--r--app/php/db/DBModule.php45
-rw-r--r--app/php/db/DBTransaction.php53
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;
+ }
+ }
+
+}
+
+?>