Skip to content

Commit

Permalink
Fix class constants as type in sql queries output
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeSimonson committed Apr 3, 2018
1 parent 6eff53d commit dcbc151
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 17 deletions.
23 changes: 20 additions & 3 deletions lib/Doctrine/DBAL/Migrations/Version.php
Original file line number Diff line number Diff line change
Expand Up @@ -397,11 +397,10 @@ private function executeRegisteredSql($dryRun = false, $timeAllQueries = false)
foreach ($this->sql as $key => $query) {
$queryStart = microtime(true);

$this->outputSqlQuery($key, $query);
if ( ! isset($this->params[$key])) {
$this->outputWriter->write(' <comment>-></comment> ' . $query);
$this->connection->executeQuery($query);
} else {
$this->outputWriter->write(sprintf(' <comment>-></comment> %s (with parameters)', $query));
$this->connection->executeQuery($query, $this->params[$key], $this->types[$key]);
}

Expand Down Expand Up @@ -461,7 +460,7 @@ private function formatParamsForOutput(array $params, array $types)
if (Type::hasType($type)) {
$outval = Type::getType($type)->convertToDatabaseValue($value, $platform);
} else {
$outval = '?';
$outval = $this->parameterToString($value);
}
$out[] = is_string($key) ? sprintf(':%s => %s', $key, $outval) : $outval;
}
Expand All @@ -478,4 +477,22 @@ private function dispatchEvent($eventName, $direction, $dryRun)
$dryRun
));
}

private function parameterToString(array $values) : string
{
$output = [];
foreach ($values as $value) {
$outval = '?';
if (is_int($value) || is_string($value)) {
$outval = (string) $value;
}
if (is_bool($value)) {
$outval = $value ? 'true' : 'false';
}

$output[] = $outval;
}

return implode(', ', $output);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,24 @@

class VersionOutputSqlWithParam extends AbstractMigration
{
private $param = [
'param1' => 1,
'param2' => 2,
'param3' => 3,
];

public function setParam($param)
{
$this->param = $param;
}

public function down(Schema $schema)
{
}

public function up(Schema $schema)
{
$this->addSql('Select 1 WHERE 1');
$this->addSql('Select :param1 WHERE :param2 = :param3', [
'param1' => 1,
'param2' => 2,
'param3' => 3,
]);
$this->addSql('Select :param1 WHERE :param2 = :param3', $this->param);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Doctrine\DBAL\Migrations\Tests\Stub;

use Doctrine\DBAL\Connection;
use \Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

class VersionOutputSqlWithParamAndType extends AbstractMigration
{
private $param = [
'param1' => 1,
];

private $type = [Connection::PARAM_STR_ARRAY];

public function setParam($param)
{
$this->param = $param;
}

public function setType(array $type)
{
$this->type = $type;
}

public function down(Schema $schema)
{
}

public function up(Schema $schema)
{
$this->addSql('Select id WHERE id IN ( :param1 )', $this->param, $this->type);
}
}
55 changes: 46 additions & 9 deletions tests/Doctrine/DBAL/Migrations/Tests/VersionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
use Doctrine\DBAL\Migrations\Tests\Stub\VersionDummyException;
use Doctrine\DBAL\Migrations\Tests\Stub\VersionOutputSql;
use Doctrine\DBAL\Migrations\Tests\Stub\VersionOutputSqlWithParam;
use Doctrine\DBAL\Migrations\Tests\Stub\VersionOutputSqlWithParamAndType;
use Doctrine\DBAL\Migrations\Version;
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamFile;
Expand Down Expand Up @@ -66,6 +67,41 @@ public function testCreateVersion()
self::assertEquals($versionName, $version->getVersion());
}

public function testShowSqlStatementsParameters()
{
$outputWriter = $this->getOutputWriter();
$configuration = new Configuration($this->getSqliteConnection(), $outputWriter);
$configuration->setMigrationsNamespace('sdfq');
$configuration->setMigrationsDirectory('.');
$version = new Version($configuration, '0004', VersionOutputSqlWithParam::class);
$version->getMigration()->setParam([
0 => 456,
1 => 'tralala',
2 => 456,
]);
$version->execute(Version::DIRECTION_UP);
$this->assertContains('(456, tralala, 456)', $this->getOutputStreamContent($this->output));
}

public function testShowSqlStatementsParametersWithTypes()
{
$outputWriter = $this->getOutputWriter();
$configuration = new Configuration($this->getSqliteConnection(), $outputWriter);
$configuration->setMigrationsNamespace('sdfq');
$configuration->setMigrationsDirectory('.');
$version = new Version($configuration, '0004', VersionOutputSqlWithParamAndType::class);
$version->getMigration()->setParam([
0 => [
456,
3,
456,
],
]);
$version->getMigration()->setType([Connection::PARAM_INT_ARRAY]);
$version->execute(Version::DIRECTION_UP, true);
$this->assertContains('(456, 3, 456)', $this->getOutputStreamContent($this->output));
}

/**
* Create migration with description
*/
Expand Down Expand Up @@ -407,8 +443,8 @@ public function testDryRunCausesSqlToBeOutputViaTheOutputWriter()
$ow = new OutputWriter(function ($msg) use (&$messages) {
$messages[] = trim($msg);
});
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config,
'006',
VersionDryRunWithoutParams::class
Expand All @@ -426,8 +462,8 @@ public function testDryRunWithQuestionMarkedParamsOutputsParamsWithSqlStatement(
$ow = new OutputWriter(function ($msg) use (&$messages) {
$messages[] = trim($msg);
});
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config,
'006',
VersionDryRunQuestionMarkParams::class
Expand All @@ -446,8 +482,8 @@ public function testDryRunWithNamedParametersOutputsParamsAndNamesWithSqlStateme
$ow = new OutputWriter(function ($msg) use (&$messages) {
$messages[] = trim($msg);
});
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config,
'006',
VersionDryRunNamedParams::class
Expand All @@ -465,7 +501,8 @@ public static function dryRunTypes()
return [
'datetime' => [new \DateTime('2016-07-05 01:00:00'), 'datetime', '2016-07-05 01:00:00'],
'array' => [['one' => 'two'], 'array', serialize(['one' => 'two'])],
'doctrine_param' => [[1,2,3,4,5], Connection::PARAM_INT_ARRAY, '?'],
'doctrine_param' => [[1,2,3,4,5], Connection::PARAM_INT_ARRAY, '1, 2, 3, 4, 5'],
'boolean' => [[true], '', 'true'],
];
}

Expand All @@ -478,8 +515,8 @@ public function testDryRunWithParametersOfComplexTypesCorrectFormatsParameters($
$ow = new OutputWriter(function ($msg) use (&$messages) {
$messages[] = trim($msg);
});
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config = new Configuration($this->getSqliteConnection(), $ow);
$version = new Version(
$config,
'006',
VersionDryRunTypes::class
Expand Down

0 comments on commit dcbc151

Please sign in to comment.