Skip to content

Commit 339e988

Browse files
fix: restore support for unquoted string values stored in text[] (#333)
1 parent 985a5c5 commit 339e988

16 files changed

+1145
-558
lines changed

docs/UPGRADE.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Upgrade Instructions
22

3-
## How to Upgrade to Version 3.0.0
3+
## How to Upgrade to Version 3.0
44

55
### 1. Review type handling in your code
66
If your application relies on automatic type conversion between PostgreSQL and PHP (e.g., expecting string numbers to be converted to actual numbers or vice versa), you'll need to update your code to explicitly handle type conversion where needed.
@@ -16,7 +16,7 @@ $numericValue = (float)$tags[0] + 2; // Explicit conversion needed
1616
```
1717

1818
### 2. Update your code to handle exceptions
19-
If you're catching specific exception types when working with `JsonbArray`, update your exception handling to catch the new `InvalidJsonbArrayItemForPHPException`.
19+
If you're catching specific exception types when working with `JsonbArray`, update your exception handling to catch the new `InvalidJsonItemForPHPException` and `InvalidJsonArrayItemForPHPException`.
2020

2121
```php
2222
// Before
@@ -29,7 +29,7 @@ try {
2929
// After
3030
try {
3131
$jsonArray = $jsonbArrayType->convertToPHPValue($postgresValue, $platform);
32-
} catch (\MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException $e) {
32+
} catch (\MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonArrayItemForPHPException $e) {
3333
// Handle exception
3434
}
3535
```

src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonbArrayItemForPHPException.php renamed to src/MartinGeorgiev/Doctrine/DBAL/Types/Exceptions/InvalidJsonArrayItemForPHPException.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Doctrine\DBAL\Types\ConversionException;
88

9-
class InvalidJsonbArrayItemForPHPException extends ConversionException
9+
class InvalidJsonArrayItemForPHPException extends ConversionException
1010
{
1111
private static function create(string $message, mixed $value): self
1212
{
@@ -20,6 +20,6 @@ public static function forInvalidType(mixed $value): self
2020

2121
public static function forInvalidFormat(mixed $value): self
2222
{
23-
return self::create('Invalid JSONB format in array: %s', $value);
23+
return self::create('Invalid JSON format in array: %s', $value);
2424
}
2525
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace MartinGeorgiev\Doctrine\DBAL\Types\Exceptions;
6+
7+
use Doctrine\DBAL\Types\ConversionException;
8+
9+
class InvalidJsonItemForPHPException extends ConversionException
10+
{
11+
private static function create(string $message, mixed $value): self
12+
{
13+
return new self(\sprintf($message, \var_export($value, true)));
14+
}
15+
16+
public static function forInvalidType(mixed $value): self
17+
{
18+
return self::create('Postgres value must be single, valid JSON object, %s given', $value);
19+
}
20+
21+
public static function forInvalidFormat(mixed $value): self
22+
{
23+
return self::create('Invalid JSON format: %s', $value);
24+
}
25+
}

src/MartinGeorgiev/Doctrine/DBAL/Types/JsonTransformer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Types\ConversionException;
8+
use MartinGeorgiev\Utils\PostgresJsonToPHPArrayTransformer;
89

910
/**
1011
* Helpers for converting PHP values into PostgreSQL JSON and vice versa.
@@ -33,7 +34,6 @@ protected function transformToPostgresJson(mixed $phpValue): string
3334

3435
protected function transformFromPostgresJson(string $postgresValue): null|array|bool|float|int|string
3536
{
36-
// @phpstan-ignore-next-line
37-
return \json_decode($postgresValue, true, 512, JSON_THROW_ON_ERROR);
37+
return PostgresJsonToPHPArrayTransformer::transformPostgresJsonEncodedValueToPHPValue($postgresValue);
3838
}
3939
}

src/MartinGeorgiev/Doctrine/DBAL/Types/JsonbArray.php

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

7-
use MartinGeorgiev\Doctrine\DBAL\Types\Exceptions\InvalidJsonbArrayItemForPHPException;
7+
use MartinGeorgiev\Utils\PostgresJsonToPHPArrayTransformer;
88

99
/**
1010
* Implementation of PostgreSQL JSONB[] data type.
@@ -27,33 +27,14 @@ protected function transformArrayItemForPostgres(mixed $item): string
2727

2828
protected function transformPostgresArrayToPHPArray(string $postgresArray): array
2929
{
30-
if ($postgresArray === '{}') {
31-
return [];
32-
}
33-
34-
$trimmedPostgresArray = \mb_substr($postgresArray, 2, -2);
35-
$phpArray = \explode('},{', $trimmedPostgresArray);
36-
foreach ($phpArray as &$item) {
37-
$item = '{'.$item.'}';
38-
}
39-
40-
return $phpArray;
30+
return PostgresJsonToPHPArrayTransformer::transformPostgresArrayToPHPArray($postgresArray);
4131
}
4232

4333
/**
4434
* @param string $item
4535
*/
4636
public function transformArrayItemForPHP($item): array
4737
{
48-
try {
49-
$transformedValue = $this->transformFromPostgresJson($item);
50-
if (!\is_array($transformedValue)) {
51-
throw InvalidJsonbArrayItemForPHPException::forInvalidType($item);
52-
}
53-
54-
return $transformedValue;
55-
} catch (\JsonException) {
56-
throw InvalidJsonbArrayItemForPHPException::forInvalidFormat($item);
57-
}
38+
return PostgresJsonToPHPArrayTransformer::transformPostgresJsonEncodedValueToPHPArray($item);
5839
}
5940
}

src/MartinGeorgiev/Doctrine/DBAL/Types/TextArray.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
namespace MartinGeorgiev\Doctrine\DBAL\Types;
66

77
use Doctrine\DBAL\Platforms\AbstractPlatform;
8-
use MartinGeorgiev\Utils\ArrayDataTransformer;
8+
use MartinGeorgiev\Utils\PHPArrayToPostgresValueTransformer;
9+
use MartinGeorgiev\Utils\PostgresArrayToPHPArrayTransformer;
910

1011
/**
1112
* Implementation of PostgreSQL TEXT[] data type.
@@ -42,7 +43,7 @@ protected function transformToPostgresTextArray(array $phpTextArray): string
4243
return '{}';
4344
}
4445

45-
return ArrayDataTransformer::transformPHPArrayToPostgresTextArray($phpTextArray);
46+
return PHPArrayToPostgresValueTransformer::transformToPostgresTextArray($phpTextArray);
4647
}
4748

4849
/**
@@ -65,6 +66,6 @@ protected function transformFromPostgresTextArray(string $postgresValue): array
6566
return [];
6667
}
6768

68-
return ArrayDataTransformer::transformPostgresTextArrayToPHPArray($postgresValue);
69+
return PostgresArrayToPHPArrayTransformer::transformPostgresArrayToPHPArray($postgresValue);
6970
}
7071
}

src/MartinGeorgiev/Utils/ArrayDataTransformer.php

Lines changed: 0 additions & 170 deletions
This file was deleted.

0 commit comments

Comments
 (0)