From 5695b869a905d276ec4a069131fbd793a06ed3e5 Mon Sep 17 00:00:00 2001 From: Andrey Akimov Date: Thu, 4 May 2017 21:30:38 +0300 Subject: [PATCH] Fixes #13890: DbTarget log transaction bug --- framework/CHANGELOG.md | 1 + framework/log/DbTarget.php | 6 ++++++ tests/framework/log/DbTargetTest.php | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e814f0b..20a41dd 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -44,6 +44,7 @@ Yii Framework 2 Change Log - Bug #13790: Fixed error in `\yii\widgets\MaskedInput` JavaScript by raising version required (samdark) - Bug #13807: Fixed `yii\db\QueryBuilder` to inherit subquery params when building a `INSERT INTO ... SELECT` query (sergeymakinen) - Bug #13848: `yii\di\Instance::ensure()` wasn't throwing an exception when `$type` is specified and `$reference` object isn't instance of `$type` (c-jonua) +- Bug #13890: DbTarget log transaction bug (shirase) - Bug #13901: Fixed passing unused parameter to `formatMessage()` call in `\yii\validators\IpValidator` (Kolyunya) - Bug #13961: Fixed `unserialize()` error during RBAC rule retrieving from PostgreSQL DBMS (vsguts) - Bug #14012: `yii\db\pgsql\Schema::findViewNames()` was skipping materialized views (insolita) diff --git a/framework/log/DbTarget.php b/framework/log/DbTarget.php index d77f6e9..922a9cd 100644 --- a/framework/log/DbTarget.php +++ b/framework/log/DbTarget.php @@ -60,6 +60,12 @@ class DbTarget extends Target */ public function export() { + if ($this->db->getTransaction()) { + $this->db = clone $this->db; + $this->db->pdo = null; + $this->db->open(); + } + $tableName = $this->db->quoteTableName($this->logTable); $sql = "INSERT INTO $tableName ([[level]], [[category]], [[log_time]], [[prefix]], [[message]]) VALUES (:level, :category, :log_time, :prefix, :message)"; diff --git a/tests/framework/log/DbTargetTest.php b/tests/framework/log/DbTargetTest.php index efe0353..812bf98 100644 --- a/tests/framework/log/DbTargetTest.php +++ b/tests/framework/log/DbTargetTest.php @@ -140,4 +140,29 @@ abstract class DbTargetTest extends TestCase $loggedTime = $query->createCommand(self::getConnection())->queryScalar(); static::assertEquals($time, $loggedTime); } + + public function testTransactionRollBack() + { + $db = self::getConnection(); + $logger = Yii::getLogger(); + + $tx = $db->beginTransaction(); + + $messsageData = [ + 'test', + Logger::LEVEL_WARNING, + 'test', + time(), + [] + ]; + + $logger->messages[] = $messsageData; + $logger->flush(true); + + $tx->rollBack(); + + $query = (new Query())->select('COUNT(*)')->from(self::$logTable)->where(['category' => 'test', 'message' => 'test']); + $count = $query->createCommand($db)->queryScalar(); + static::assertEquals(1, $count); + } } \ No newline at end of file