Skip to content

Commit 90388cf

Browse files
authored
Merge pull request #57 from AppsDevTeam/parameters-json
Extra column in database for parameters in json format
2 parents 727b832 + de31807 commit 90388cf

3 files changed

Lines changed: 31 additions & 13 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"doctrine/dbal": "^4.0",
2525
"symfony/console": "^4.0|^5.0|^6.0|^7.0",
2626
"psr/log": "^1.0|^2.0|^3.0",
27-
"adt/utils": "^2.10",
27+
"adt/utils": "^2.14",
2828
"adt/command-lock": "^1.1"
2929
},
3030
"autoload": {

src/BackgroundQueue.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public function __construct(array $config)
7373
$config['bulkSize'] = 1;
7474
}
7575
if (!isset($config['parametersFormat'])) {
76-
$config['parametersFormat'] = BackgroundJob::PARAMETERS_FORMAT_SERIALIZE;
76+
$config['parametersFormat'] = BackgroundJob::PARAMETERS_FORMAT_JSON;
7777
}
7878
if (!in_array($config['parametersFormat'], BackgroundJob::PARAMETERS_FORMATS, true)) {
7979
throw new Exception('Unsupported parameters format: ' . $config['parametersFormat']);
@@ -687,7 +687,8 @@ public function updateSchema(bool $force = false): void
687687
$table->addColumn('queue', Types::STRING, ['length' => 255])->setNotnull(true);
688688
$table->addColumn('priority', Types::INTEGER)->setNotnull(false);
689689
$table->addColumn('callback_name', Types::STRING, ['length' => 255])->setNotnull(true);
690-
$table->addColumn('parameters', Types::BLOB)->setNotnull(true);
690+
$table->addColumn('parameters', Types::BLOB)->setNotnull(false);
691+
$table->addColumn('parameters_json', Types::JSON)->setNotnull(false);
691692
$table->addColumn('state', Types::SMALLINT)->setNotnull(true);
692693
$table->addColumn('created_at', Types::DATETIME_IMMUTABLE)->setNotnull(true);
693694
$table->addColumn('last_attempt_at', Types::DATETIME_IMMUTABLE)->setNotnull(false);

src/Entity/BackgroundJob.php

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

33
namespace ADT\BackgroundQueue\Entity;
44

5+
use ADT\Utils\Utils;
56
use DateTime;
67
use DateTimeImmutable;
78
use Exception;
@@ -44,6 +45,7 @@ final class BackgroundJob
4445
private ?int $priority;
4546
private string $callbackName;
4647
private $parameters; /** @see self::setParameters() */
48+
private $parameters_json = null; /** @see self::setParameters() */
4749
private int $state = self::STATE_READY;
4850
private DateTimeImmutable $createdAt;
4951
private ?DateTimeImmutable $lastAttemptAt = null;
@@ -134,19 +136,26 @@ public function setSerialGroup(?string $serialGroup): self
134136
public function getParameters(): array
135137
{
136138
$this->parameters = is_resource($this->parameters) ? stream_get_contents($this->parameters) : $this->parameters;
137-
138-
if (substr($this->parameters, 0, 2) === 'a:') {
139+
140+
if (!is_null($this->parameters)) {
139141
return unserialize($this->parameters);
140142
}
141143

142-
return json_decode($this->parameters, true);
144+
$parametersJson = json_decode($this->parameters_json, true);
145+
$parameters = [];
146+
foreach ($parametersJson as $key => $value) {
147+
$parameters[$key] = Utils::getDateTimeFromArray($value, true);
148+
}
149+
return $parameters;
143150
}
144151

145152
/**
146153
* Parametry ukládá jako serializované pole nebo jako json.
147154
* Formát určuje parametr v BackgroundQueue `parametersFormat`.
148155
* - `serialize` => ukládá jako serializované pole a je bez omezení
149-
* - `json` => parametry mohou obsahovat pouze skalární typy, pole a NULL
156+
* - `json` => ukládá jako json
157+
* - parametry mohou obsahovat pouze skalární typy, pole, NULL a \DateTimeInterface
158+
* - pokud je nějaký z parametrů objekt, automaticky se použije "serialize"
150159
*
151160
* @param object|array|string|int|float|bool|null $parameters
152161
* @param string $parametersFormat
@@ -156,17 +165,23 @@ public function setParameters($parameters, string $parametersFormat): self
156165
{
157166
$parameters = is_array($parameters) ? $parameters : [$parameters];
158167

168+
if ($parametersFormat == self::PARAMETERS_FORMAT_JSON) {
169+
foreach ($parameters as $parameter) {
170+
if (!is_scalar($parameter) && !is_array($parameter) && !is_null($parameter) && !($parameter instanceof \DateTimeInterface)) {
171+
$parametersFormat = self::PARAMETERS_FORMAT_SERIALIZE;
172+
break;
173+
}
174+
}
175+
}
176+
159177
switch ($parametersFormat) {
160178
case self::PARAMETERS_FORMAT_SERIALIZE:
161179
$this->parameters = serialize($parameters);
180+
$this->parameters_json = null;
162181
break;
163182
case self::PARAMETERS_FORMAT_JSON:
164-
foreach ($parameters as $idx => $parameter) {
165-
if (!is_scalar($parameter) && !is_array($parameter) && !is_null($parameter)) {
166-
throw new Exception("Unsupported type '" . gettype($parameter) . "' for \$parameters[$idx] using parametersFormat = " . self::PARAMETERS_FORMAT_JSON);
167-
}
168-
}
169-
$this->parameters = json_encode($parameters);
183+
$this->parameters = null;
184+
$this->parameters_json = json_encode($parameters);
170185
break;
171186
default:
172187
throw new Exception("Unsupported parameters format: $parametersFormat");
@@ -327,6 +342,7 @@ public static function createEntity(array $values): self
327342
$entity->priority = $values['priority'];
328343
$entity->callbackName = $values['callback_name'];
329344
$entity->parameters = $values['parameters'];
345+
$entity->parameters_json = $values['parameters_json'];
330346
$entity->state = $values['state'];
331347
$entity->createdAt = new DateTimeImmutable($values['created_at']);
332348
$entity->lastAttemptAt = $values['last_attempt_at'] ? new DateTimeImmutable($values['last_attempt_at']) : null;
@@ -353,6 +369,7 @@ public function getDatabaseValues(): array
353369
'priority' => $this->priority,
354370
'callback_name' => $this->callbackName,
355371
'parameters' => $this->parameters,
372+
'parameters_json' => $this->parameters_json,
356373
'state' => $this->state,
357374
'created_at' => $this->createdAt->format('Y-m-d H:i:s'),
358375
'last_attempt_at' => $this->lastAttemptAt ? $this->lastAttemptAt->format('Y-m-d H:i:s') : null,

0 commit comments

Comments
 (0)