From 4e2c0fe6b441d991ce2d962a82eac6b424ef6af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 5 Jul 2022 01:23:35 +0200 Subject: [PATCH] move typecasting from binary comp. trait for better BT --- src/Persistence/Sql.php | 22 ++++++++++++++++ .../BinaryTypeCompatibilityTypecastTrait.php | 25 ++++++------------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/Persistence/Sql.php b/src/Persistence/Sql.php index 78670e4e9..68a76c769 100644 --- a/src/Persistence/Sql.php +++ b/src/Persistence/Sql.php @@ -644,6 +644,28 @@ protected function deleteRaw(Model $model, $idRaw): void $model->hook(self::HOOK_AFTER_DELETE_QUERY, [$delete, $c]); } + public function typecastSaveField(Field $field, $value) + { + $value = parent::typecastSaveField($field, $value); + + if ($value !== null && $this->binaryTypeIsEncodeNeeded($field->getTypeObject())) { + $value = $this->binaryTypeValueEncode($value); + } + + return $value; + } + + public function typecastLoadField(Field $field, $value) + { + $value = parent::typecastLoadField($field, $value); + + if ($value !== null && $this->binaryTypeIsDecodeNeeded($field->getTypeObject(), $value)) { + $value = $this->binaryTypeValueDecode($value); + } + + return $value; + } + public function getFieldSqlExpression(Field $field, Expression $expression): Expression { if (isset($field->getOwner()->persistence_data['use_table_prefixes'])) { diff --git a/src/Persistence/Sql/BinaryTypeCompatibilityTypecastTrait.php b/src/Persistence/Sql/BinaryTypeCompatibilityTypecastTrait.php index 8fb27d9cd..d08b9860d 100644 --- a/src/Persistence/Sql/BinaryTypeCompatibilityTypecastTrait.php +++ b/src/Persistence/Sql/BinaryTypeCompatibilityTypecastTrait.php @@ -5,7 +5,6 @@ namespace Atk4\Data\Persistence\Sql; use Atk4\Data\Exception; -use Atk4\Data\Field; use Doctrine\DBAL\Platforms\OraclePlatform; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; use Doctrine\DBAL\Platforms\SQLServerPlatform; @@ -67,29 +66,19 @@ private function binaryTypeIsEncodeNeeded(Type $type): bool return false; } - public function typecastSaveField(Field $field, $value) + /** + * @param scalar $value + */ + private function binaryTypeIsDecodeNeeded(Type $type, $value): bool { - $value = parent::typecastSaveField($field, $value); - - if ($value !== null && $this->binaryTypeIsEncodeNeeded($field->getTypeObject())) { - $value = $this->binaryTypeValueEncode($value); - } - - return $value; - } - - public function typecastLoadField(Field $field, $value) - { - $value = parent::typecastLoadField($field, $value); - - if ($value !== null && $this->binaryTypeIsEncodeNeeded($field->getTypeObject())) { + if ($this->binaryTypeIsEncodeNeeded($type)) { // always decode for Oracle platform to assert the value is always encoded, // on other platforms, binary values are stored natively if ($this->getDatabasePlatform() instanceof OraclePlatform || $this->binaryTypeValueIsEncoded($value)) { - $value = $this->binaryTypeValueDecode($value); + return true; } } - return $value; + return false; } }