From 37314a21883e955402850b2474632f3578228fc6 Mon Sep 17 00:00:00 2001 From: Jose Lorenzo Rodriguez Date: Sat, 21 Jan 2012 15:48:17 -0430 Subject: [PATCH] Logging transaction commands in DboSource, fixes #2457 --- lib/Cake/Model/Datasource/DboSource.php | 9 ++++ .../Case/Model/Datasource/DboSourceTest.php | 42 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/lib/Cake/Model/Datasource/DboSource.php b/lib/Cake/Model/Datasource/DboSource.php index 30ce1274a..5ac75f82b 100644 --- a/lib/Cake/Model/Datasource/DboSource.php +++ b/lib/Cake/Model/Datasource/DboSource.php @@ -2004,6 +2004,9 @@ class DboSource extends DataSource { */ public function begin() { if ($this->_transactionStarted || $this->_connection->beginTransaction()) { + if ($this->fullDebug && empty($this->_transactionNesting)) { + $this->logQuery('BEGIN'); + } $this->_transactionStarted = true; $this->_transactionNesting++; return true; @@ -2024,6 +2027,9 @@ class DboSource extends DataSource { if ($this->_transactionNesting <= 0) { $this->_transactionStarted = false; $this->_transactionNesting = 0; + if ($this->fullDebug) { + $this->logQuery('COMMIT'); + } return $this->_connection->commit(); } return true; @@ -2040,6 +2046,9 @@ class DboSource extends DataSource { */ public function rollback() { if ($this->_transactionStarted && $this->_connection->rollBack()) { + if ($this->fullDebug) { + $this->logQuery('ROLLBACK'); + } $this->_transactionStarted = false; $this->_transactionNesting = 0; return true; diff --git a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php index 4031a49d6..630b4601f 100644 --- a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php @@ -23,6 +23,12 @@ App::uses('DataSource', 'Model/Datasource'); App::uses('DboSource', 'Model/Datasource'); require_once dirname(dirname(__FILE__)) . DS . 'models.php'; +class MockPDO extends PDO { + + public function __construct() { + } +} + class MockDataSource extends DataSource { } @@ -645,6 +651,7 @@ class DboSourceTest extends CakeTestCase { $this->testDb->logQuery('Query 2'); $log = $this->testDb->getLog(); + $expected = array('query' => 'Query 1', 'affected' => '', 'numRows' => '', 'took' => ''); $this->assertEquals($log['log'][0], $expected); $expected = array('query' => 'Query 2', 'affected' => '', 'numRows' => '', 'took' => ''); @@ -783,4 +790,39 @@ class DboSourceTest extends CakeTestCase { $expected = 'something: bad'; $this->assertEquals($expected, $result); } + +/** + * Tests that transaction commands are logged + * + * @return void + **/ + public function testTransactionLogging() { + $conn = $this->getMock('MockPDO'); + $db = new DboTestSource; + $db->setConnection($conn); + $conn->expects($this->exactly(2))->method('beginTransaction') + ->will($this->returnValue(true)); + $conn->expects($this->once())->method('commit')->will($this->returnValue(true)); + $conn->expects($this->once())->method('rollback')->will($this->returnValue(true)); + + $db->begin(); + $log = $db->getLog(); + $expected = array('query' => 'BEGIN', 'affected' => '', 'numRows' => '', 'took' => ''); + $this->assertEquals($expected, $log['log'][0]); + + $db->commit(); + $expected = array('query' => 'COMMIT', 'affected' => '', 'numRows' => '', 'took' => ''); + $log = $db->getLog(); + $this->assertEquals($expected, $log['log'][0]); + + $db->begin(); + $expected = array('query' => 'BEGIN', 'affected' => '', 'numRows' => '', 'took' => ''); + $log = $db->getLog(); + $this->assertEquals($expected, $log['log'][0]); + + $db->rollback(); + $expected = array('query' => 'ROLLBACK', 'affected' => '', 'numRows' => '', 'took' => ''); + $log = $db->getLog(); + $this->assertEquals($expected, $log['log'][0]); + } }