Skip to content

Commit 4e9fa61

Browse files
authored
Add QueryBuilder::prepareBinary() method (#292)
1 parent 66bcb27 commit 4e9fa61

File tree

6 files changed

+46
-4
lines changed

6 files changed

+46
-4
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
- Enh #286: Use constructor to create columns and initialize properties (@Tigrov)
2222
- Enh #288: Refactor `Schema::findColumns()` method (@Tigrov)
2323
- Enh #289: Refactor `Schema::normalizeDefaultValue()` method and move it to `ColumnFactory` class (@Tigrov)
24+
- New #292: Override `QueryBuilder::prepareBinary()` method (@Tigrov)
2425

2526
## 1.3.0 March 21, 2024
2627

src/Builder/LikeConditionBuilder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function build(LikeConditionInterface $expression, array &$params = []):
4343
* Different pdo_oci8 versions may or may not implement `PDO::quote()`, so {@see Quoter::quoteValue()} may or
4444
* may not quote `\`.
4545
*/
46-
$this->escapingReplacements['\\'] = substr((string) $this->queryBuilder->quoter()->quoteValue('\\'), 1, -1);
46+
$this->escapingReplacements['\\'] = substr($this->queryBuilder->quoter()->quoteValue('\\'), 1, -1);
4747
}
4848

4949
return parent::build($expression, $params);

src/Command.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Yiisoft\Db\Oracle;
66

77
use PDO;
8+
use Yiisoft\Db\Command\DataType;
89
use Yiisoft\Db\Constant\PhpType;
910
use Yiisoft\Db\Driver\Pdo\AbstractPdoCommand;
1011
use Yiisoft\Db\QueryBuilder\AbstractQueryBuilder;
@@ -64,7 +65,7 @@ public function insertWithReturningPks(string $table, array $columns): bool|arra
6465
$this->setSql($sql)->bindValues($params);
6566
$this->prepare(false);
6667

67-
/** @psalm-var array<string, array{column: string, value: mixed, dataType: int, size: int}> $returnParams */
68+
/** @psalm-var array<string, array{column: string, value: mixed, dataType: DataType::*, size: int}> $returnParams */
6869
foreach ($returnParams as $name => &$value) {
6970
$this->bindParam($name, $value['value'], $value['dataType'], $value['size']);
7071
}

src/QueryBuilder.php

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use Yiisoft\Db\Schema\QuoterInterface;
1212
use Yiisoft\Db\Schema\SchemaInterface;
1313

14+
use function bin2hex;
15+
1416
/**
1517
* Implements the Oracle Server specific query builder.
1618
*/
@@ -54,4 +56,9 @@ public function __construct(QuoterInterface $quoter, SchemaInterface $schema)
5456

5557
parent::__construct($quoter, $schema, $ddlBuilder, $dmlBuilder, $dqlBuilder, $columnDefinitionBuilder);
5658
}
59+
60+
protected function prepareBinary(string $binary): string
61+
{
62+
return "HEXTORAW('" . bin2hex($binary) . "')";
63+
}
5764
}

tests/Provider/QueryBuilderProvider.php

+20-1
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ public static function buildColumnDefinition(): array
317317
$values["defaultValue('')"][0] = "varchar2(255) DEFAULT ''";
318318
$values['defaultValue(null)'][0] = 'varchar2(255) DEFAULT NULL';
319319
$values['defaultValue($expression)'][0] = 'number(10) DEFAULT (1 + 2)';
320-
$values['notNull()->defaultValue(null)'][0] = 'varchar2(255) NOT NULL';
320+
$values['defaultValue($emptyExpression)'][0] = 'number(10)';
321321
$values['notNull()'][0] = 'varchar2(255) NOT NULL';
322322
$values['null()'][0] = 'varchar2(255) NULL';
323323
$values['integer()->primaryKey()'][0] = 'number(10) PRIMARY KEY';
@@ -337,4 +337,23 @@ public static function buildColumnDefinition(): array
337337
['number(10) REFERENCES "ref_table" ("id") ON DELETE SET NULL', ColumnBuilder::integer()->reference($referenceSetNull)],
338338
];
339339
}
340+
341+
public static function prepareParam(): array
342+
{
343+
$values = parent::prepareParam();
344+
345+
$values['binary'][0] = "HEXTORAW('737472696e67')";
346+
347+
return $values;
348+
}
349+
350+
public static function prepareValue(): array
351+
{
352+
$values = parent::prepareValue();
353+
354+
$values['binary'][0] = "HEXTORAW('737472696e67')";
355+
$values['paramBinary'][0] = "HEXTORAW('737472696e67')";
356+
357+
return $values;
358+
}
340359
}

tests/QueryBuilderTest.php

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
namespace Yiisoft\Db\Oracle\Tests;
66

7+
use PHPUnit\Framework\Attributes\DataProviderExternal;
78
use Throwable;
89
use Yiisoft\Db\Constant\ColumnType;
910
use Yiisoft\Db\Exception\Exception;
1011
use Yiisoft\Db\Exception\InvalidArgumentException;
1112
use Yiisoft\Db\Exception\InvalidConfigException;
1213
use Yiisoft\Db\Exception\NotSupportedException;
1314
use Yiisoft\Db\Expression\ExpressionInterface;
15+
use Yiisoft\Db\Oracle\Tests\Provider\QueryBuilderProvider;
1416
use Yiisoft\Db\Oracle\Tests\Support\TestTrait;
1517
use Yiisoft\Db\Query\Query;
1618
use Yiisoft\Db\Query\QueryInterface;
@@ -672,9 +674,21 @@ public function testSelectScalar(array|bool|float|int|string $columns, string $e
672674
parent::testSelectScalar($columns, $expected);
673675
}
674676

675-
/** @dataProvider \Yiisoft\Db\Oracle\Tests\Provider\QueryBuilderProvider::buildColumnDefinition() */
677+
#[DataProviderExternal(QueryBuilderProvider::class, 'buildColumnDefinition')]
676678
public function testBuildColumnDefinition(string $expected, ColumnSchemaInterface|string $column): void
677679
{
678680
parent::testBuildColumnDefinition($expected, $column);
679681
}
682+
683+
#[DataProviderExternal(QueryBuilderProvider::class, 'prepareParam')]
684+
public function testPrepareParam(string $expected, mixed $value, int $type): void
685+
{
686+
parent::testPrepareParam($expected, $value, $type);
687+
}
688+
689+
#[DataProviderExternal(QueryBuilderProvider::class, 'prepareValue')]
690+
public function testPrepareValue(string $expected, mixed $value): void
691+
{
692+
parent::testPrepareValue($expected, $value);
693+
}
680694
}

0 commit comments

Comments
 (0)