modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2024-06-18 17:10:40 +04:00
parent 111a87bc3b
commit 057f3316ac
3 changed files with 39 additions and 20 deletions

View File

@ -50,8 +50,8 @@ class Capacitor {
$this->storage->_reset($this->channel, $recreate); $this->storage->_reset($this->channel, $recreate);
} }
function charge($item, $func=null, ?array $args=null): int { function charge($item, $func=null, ?array $args=null, ?array &$values=null): int {
return $this->storage->_charge($this->channel, $item, $func, $args); return $this->storage->_charge($this->channel, $item, $func, $args, $values);
} }
function discharge(bool $reset=true): iterable { function discharge(bool $reset=true): iterable {

View File

@ -248,7 +248,7 @@ class CapacitorChannel {
* Si $item est modifié dans cette méthode, il est possible de le retourner * Si $item est modifié dans cette méthode, il est possible de le retourner
* avec la clé "item" pour mettre à jour la ligne correspondante. * avec la clé "item" pour mettre à jour la ligne correspondante.
*/ */
function onCreate($item, array $rowValues): ?array { function onCreate($item, array $rowValues, ?array $alwaysNull): ?array {
return null; return null;
} }

View File

@ -178,7 +178,7 @@ EOT;
$this->_reset($this->getChannel($channel), $recreate); $this->_reset($this->getChannel($channel), $recreate);
} }
function _charge(CapacitorChannel $channel, $item, $func, ?array $args): int { function _charge(CapacitorChannel $channel, $item, $func, ?array $args, ?array &$values=null): int {
$this->_create($channel); $this->_create($channel);
$tableName = $channel->getTableName(); $tableName = $channel->getTableName();
$now = date("Y-m-d H:i:s"); $now = date("Y-m-d H:i:s");
@ -204,10 +204,11 @@ EOT;
"modified_" => $now, "modified_" => $now,
]); ]);
$insert = true; $insert = true;
if ($func === null) $func = "->onCreate"; $initFunc = [$channel, "onCreate"];
func::ensure_func($func, $channel, $args); $initArgs = $args;
func::ensure_func($initFunc, null, $initArgs);
$values = $this->unserialize($channel, $row); $values = $this->unserialize($channel, $row);
$args = [$item, $values, ...$args]; $pvalues = null;
} else { } else {
# modification # modification
if ($channel->_wasSumModified("item", $row, $prow)) { if ($channel->_wasSumModified("item", $row, $prow)) {
@ -216,22 +217,36 @@ EOT;
"modified_" => $now, "modified_" => $now,
]); ]);
} }
if ($func === null) $func = "->onUpdate"; $initFunc = [$channel, "onUpdate"];
func::ensure_func($func, $channel, $args); $initArgs = $args;
func::ensure_func($initFunc, null, $initArgs);
$values = $this->unserialize($channel, $row); $values = $this->unserialize($channel, $row);
$pvalues = $this->unserialize($channel, $prow); $pvalues = $this->unserialize($channel, $prow);
$args = [$item, $values, $pvalues, ...$args];
} }
$updates = func::call($func, ...$args); $updates = func::call($initFunc, $item, $values, $pvalues, ...$initArgs);
if (is_array($updates) && $updates) { if (is_array($updates) && $updates) {
if ($insert === null) $insert = false; if ($insert === null) $insert = false;
if (!array_key_exists("modified_", $updates)) { if (!array_key_exists("modified_", $updates)) {
$updates["modified_"] = $now; $updates["modified_"] = $now;
} }
$values = cl::merge($values, $updates);
$row = cl::merge($row, $this->serialize($channel, $updates)); $row = cl::merge($row, $this->serialize($channel, $updates));
} }
if ($func !== null) {
func::ensure_func($func, $channel, $args);
$updates = func::call($func, $item, $values, $pvalues, ...$args);
if (is_array($updates) && $updates) {
if ($insert === null) $insert = false;
if (!array_key_exists("modified_", $updates)) {
$updates["modified_"] = $now;
}
$values = cl::merge($values, $updates);
$row = cl::merge($row, $this->serialize($channel, $updates));
}
}
if ($insert === null) { if ($insert === null) {
# aucune modification # aucune modification
return 0; return 0;
@ -255,20 +270,24 @@ EOT;
/** /**
* charger une valeur dans le canal * charger une valeur dans le canal
* *
* Si $func!==null, après avoir calculé les valeurs des clés supplémentaires * Après avoir calculé les valeurs des clés supplémentaires
* avec {@link CapacitorChannel::getItemValues()}, la fonction est appelée * avec {@link CapacitorChannel::getItemValues()}, l'une des deux fonctions
* avec la signature de {@link CapacitorChannel::onCreate()} ou * {@link CapacitorChannel::onCreate()} ou {@link CapacitorChannel::onUpdate()}
* {@link CapacitorChannel::onUpdate()} en fonction du type d'opération: * est appelée en fonction du type d'opération: création ou mise à jour
* création ou mise à jour
* *
* Si la fonction retourne un tableau, il est utilisé pour modifier les valeurs * Ensuite, si $func !== null, la fonction est appelée avec la signature de
* insérées/mises à jour * {@link CapacitorChannel::onCreate()} ou {@link CapacitorChannel::onUpdate()}
* en fonction du type d'opération: création ou mise à jour
*
* Dans les deux cas, si la fonction retourne un tableau, il est utilisé pour
* modifier les valeurs insérées/mises à jour. De plus, $values obtient la
* valeur finale des données insérées/mises à jour
* *
* @return int 1 si l'objet a été chargé ou mis à jour, 0 s'il existait * @return int 1 si l'objet a été chargé ou mis à jour, 0 s'il existait
* déjà à l'identique dans le canal * déjà à l'identique dans le canal
*/ */
function charge(?string $channel, $item, $func=null, ?array $args=null): int { function charge(?string $channel, $item, $func=null, ?array $args=null, ?array &$values=null): int {
return $this->_charge($this->getChannel($channel), $item, $func, $args); return $this->_charge($this->getChannel($channel), $item, $func, $args, $values);
} }
function _discharge(CapacitorChannel $channel, bool $reset=true): iterable { function _discharge(CapacitorChannel $channel, bool $reset=true): iterable {