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