[DoctrineBridge] Avoids blob values to be logged by doctrine

This commit is contained in:
Jean-François Simon 2013-03-07 17:43:05 +01:00 committed by Fabien Potencier
parent 7241be9b64
commit ef534568c6
3 changed files with 58 additions and 2 deletions

View File

@ -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);
}

View File

@ -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)

View File

@ -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,
));
}
}