diff --git a/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php b/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php index 921dbdf880..fd1dde44b9 100644 --- a/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php +++ b/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php @@ -22,6 +22,9 @@ use Doctrine\DBAL\Logging\SQLLogger; */ class DbalLogger implements SQLLogger { + const MAX_STRING_LENGTH = 32; + const BINARY_DATA_VALUE = '(binary value)'; + protected $logger; protected $stopwatch; @@ -46,6 +49,26 @@ class DbalLogger implements SQLLogger $this->stopwatch->start('doctrine', 'doctrine'); } + if (is_array($params)) { + foreach ($params as $index => $param) { + if (!is_string($params[$index])) { + continue; + } + + // non utf-8 strings break json encoding + if (null === preg_match('#[^\p{L}\p{N} ]#u', $params[$index])) { + $params[$index] = self::BINARY_DATA_VALUE; + continue; + } + + // too long string must be shorten + if (self::MAX_STRING_LENGTH < strlen($params[$index])) { + $params[$index] = substr($params[$index], self::MAX_STRING_LENGTH - 6).' [...]'; + continue; + } + } + } + if (null !== $this->logger) { $this->log($sql, null === $params ? array() : $params); } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php index 8c85778dba..1fc6ae378e 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php @@ -33,10 +33,15 @@ class EntityTypePerformanceTest extends FormPerformanceTestCase protected function getExtensions() { $manager = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry'); + $manager->expects($this->any()) ->method('getManager') ->will($this->returnValue($this->em)); + $manager->expects($this->any()) + ->method('getManagerForClass') + ->will($this->returnValue($this->em)); + return array( new CoreExtension(), new DoctrineOrmExtension($manager) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php b/src/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php index c4ca0eecdf..b2c855722e 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php @@ -11,6 +11,8 @@ namespace Symfony\Bridge\Doctrine\Tests\Logger; +use Symfony\Bridge\Doctrine\Logger\DbalLogger; + class DbalLoggerTest extends \PHPUnit_Framework_TestCase { /** @@ -59,12 +61,38 @@ class DbalLoggerTest extends \PHPUnit_Framework_TestCase $dbalLogger ->expects($this->once()) ->method('log') - ->with('SQL', array('utf8' => 'foo', 'nonutf8' => "\x7F\xFF")) + ->with('SQL', array('utf8' => 'foo', 'nonutf8' => DbalLogger::BINARY_DATA_VALUE)) ; $dbalLogger->startQuery('SQL', array( 'utf8' => 'foo', - 'nonutf8' => "\x7F\xFF" + 'nonutf8' => "\x7F\xFF", + )); + } + + public function testLogLongString() + { + $logger = $this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface'); + + $dbalLogger = $this + ->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger') + ->setConstructorArgs(array($logger, null)) + ->setMethods(array('log')) + ->getMock() + ; + + $shortString = str_repeat('a', DbalLogger::MAX_STRING_LENGTH); + $longString = str_repeat('a', DbalLogger::MAX_STRING_LENGTH + 1); + + $dbalLogger + ->expects($this->once()) + ->method('log') + ->with('SQL', array('short' => $shortString, 'long' => substr($longString, DbalLogger::MAX_STRING_LENGTH - 6).' [...]')) + ; + + $dbalLogger->startQuery('SQL', array( + 'short' => $shortString, + 'long' => $longString, )); } }