modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2024-05-21 23:47:00 +04:00
parent 9b134ae7c6
commit a70bccbeb8
4 changed files with 60 additions and 23 deletions

View File

@ -37,7 +37,7 @@ class Capacitor {
return $this->storage->_get($this->channel, $filter); return $this->storage->_get($this->channel, $filter);
} }
function each($filter, callable $func, ?array $args=null): void { function each($filter, ?callable $func=null, ?array $args=null): void {
$this->storage->_each($this->channel, $filter, $func, $args); $this->storage->_each($this->channel, $filter, $func, $args);
} }

View File

@ -59,4 +59,39 @@ class CapacitorChannel {
function getKeyValues($item): ?array { function getKeyValues($item): ?array {
return null; return null;
} }
/**
* méthode appelée lors du chargement d'un élément avec
* {@link Capacitor::charge()}
*
* @param mixed $item l'élément à charger
* @param array $values les valeurs calculées par {@link getKeyValues()}
* @param ?array $row la ligne à mettre à jour. vaut null s'il faut insérer
* une nouvelle ligne
* @return ?array le cas échéant, un tableau non null à marger dans $values et
* utiliser pour provisionner la ligne nouvelle créée, ou mettre à jour la
* ligne existante
*
* Si $item est modifié dans cette méthode, il est possible de le retourner
* avec la clé "_item" pour mettre à jour la ligne correspondante
*/
function onCharge($item, array $values, ?array $row): ?array {
return null;
}
/**
* méthode appelée lors du parcours des éléments avec
* {@link Capacitor::each()}
*
* @param mixed $item l'élément courant
* @param ?array $row la ligne à mettre à jour
* @return ?array le cas échéant, un tableau non null utilisé pour mettre à
* jour la ligne courante
*
* Si $item est modifié dans cette méthode, il est possible de le retourner
* avec la clé "_item" pour mettre à jour la ligne correspondante
*/
function onEach($item, array $row): ?array {
return null;
}
} }

View File

@ -29,8 +29,8 @@ abstract class CapacitorStorage {
* *
* Si $func!==null, après avoir calculé les valeurs des clés supplémentaires * Si $func!==null, après avoir calculé les valeurs des clés supplémentaires
* avec {@link CapacitorChannel::getKeyValues()}, la fonction est appelée avec * avec {@link CapacitorChannel::getKeyValues()}, la fonction est appelée avec
* les arguments ($item, $keyValues, $row, ...$args) * la signature ($item, $keyValues, $row, ...$args)
* Si la fonction retourne un tableau, il est utilisé pour modifié les valeurs * Si la fonction retourne un tableau, il est utilisé pour modifier les valeurs
* insérées/mises à jour * insérées/mises à jour
* *
* @return true si l'objet a été chargé ou mis à jour, false s'il existait * @return true si l'objet a été chargé ou mis à jour, false s'il existait
@ -58,17 +58,17 @@ abstract class CapacitorStorage {
return $this->_get($this->getChannel($channel), $filter); return $this->_get($this->getChannel($channel), $filter);
} }
abstract function _each(CapacitorChannel $channel, $filter, callable $func, ?array $args): void; abstract function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): void;
/** /**
* appeler une fonction pour chaque élément du canal spécifié. * appeler une fonction pour chaque élément du canal spécifié.
* *
* $filter permet de filtrer parmi les élements chargés * $filter permet de filtrer parmi les élements chargés
* *
* si $func retourne un tableau, il est utilisé pour mettre à jour * $func est appelé avec la signature ($item, $row, ...$args). si la fonction
* l'enregistrement. * retourne un tableau, il est utilisé pour mettre à jour la ligne
*/ */
function each(?string $channel, $filter, callable $func, ?array $args=null): void { function each(?string $channel, $filter, ?callable $func=null, ?array $args=null): void {
$this->_each($this->getChannel($channel), $filter, $func, $args); $this->_each($this->getChannel($channel), $filter, $func, $args);
} }

View File

@ -110,22 +110,23 @@ class SqliteCapacitor extends CapacitorStorage {
]); ]);
$insert = false; $insert = false;
} }
if ($func !== null) {
$context = func::_prepare($func); if ($func === null) $func = [$channel, "onCharge"];
$args ??= []; $onCharge = func::_prepare($func);
$updates = func::_call($context, [$item, $values, $row, ...$args]); $args ??= [];
if (is_array($updates)) { $updates = func::_call($onCharge, [$item, $values, $row, ...$args]);
if (array_key_exists("_item", $updates)) { if (is_array($updates)) {
$_item = serialize($updates["_item"]); if (array_key_exists("_item", $updates)) {
$updates["_item"] = $_item; $_item = serialize($updates["_item"]);
$updates["_sum"] = sha1($_item); $updates["_item"] = $_item;
if (!array_key_exists("_modified", $updates)) { $updates["_sum"] = sha1($_item);
$updates["_modified"] = $now; if (!array_key_exists("_modified", $updates)) {
} $updates["_modified"] = $now;
} }
$values = cl::merge($values, $updates);
} }
$values = cl::merge($values, $updates);
} }
if ($insert === null) { if ($insert === null) {
# aucune modification # aucune modification
return false; return false;
@ -173,9 +174,10 @@ class SqliteCapacitor extends CapacitorStorage {
else return unserialize($row["_item"]); else return unserialize($row["_item"]);
} }
function _each(CapacitorChannel $channel, $filter, callable $func, ?array $args): void { function _each(CapacitorChannel $channel, $filter, ?callable $func, ?array $args): void {
if ($func === null) $func = [$channel, "onEach"];
$onEach = func::_prepare($func);
if ($filter !== null && !is_array($filter)) $filter = ["_id" => $filter]; if ($filter !== null && !is_array($filter)) $filter = ["_id" => $filter];
$context = func::_prepare($func);
$sqlite = $this->sqlite; $sqlite = $this->sqlite;
$tableName = $channel->getTableName(); $tableName = $channel->getTableName();
$commited = false; $commited = false;
@ -189,7 +191,7 @@ class SqliteCapacitor extends CapacitorStorage {
$args ??= []; $args ??= [];
foreach ($rows as $row) { foreach ($rows as $row) {
$item = unserialize($row['_item']); $item = unserialize($row['_item']);
$updates = func::_call($context, [$item, $row, ...$args]); $updates = func::_call($onEach, [$item, $row, ...$args]);
if (is_array($updates)) { if (is_array($updates)) {
if (array_key_exists("_item", $updates)) { if (array_key_exists("_item", $updates)) {
$updates["_item"] = serialize($updates["_item"]); $updates["_item"] = serialize($updates["_item"]);