diff --git a/src/A.php b/src/A.php index 4fb778c..23196f8 100644 --- a/src/A.php +++ b/src/A.php @@ -35,4 +35,8 @@ class A { else $array = [$array]; return false; } + + static function merge(?array &$dest, ...$merges): void { + $dest = cl::merge($dest, ...$merges); + } } diff --git a/src/db/CapacitorChannel.php b/src/db/CapacitorChannel.php index c4c342b..49874db 100644 --- a/src/db/CapacitorChannel.php +++ b/src/db/CapacitorChannel.php @@ -2,6 +2,7 @@ namespace nur\sery\db; use nur\sery\cl; +use nur\sery\str; /** * Class CapacitorChannel: un canal d'une instance de {@link ICapacitor} @@ -132,6 +133,59 @@ class CapacitorChannel { function verifixId(string &$id): void { } + /** + * retourne true si un nouvel élément ou un élément mis à jour a été chargé. + * false si l'élément chargé est identique au précédent. + * + * cette méthode doit être utilisée dans {@link self::onUpdate()} + */ + function wasRowModified(array $rowValues): bool { + return array_key_exists("modified_", $rowValues); + } + + final function serialize($item): string { + return serialize($item); + } + + final function unserialize(string $string) { + return unserialize($string); + } + + const SUM_DEFINITION = "varchar(40)"; + + final function sum(string $string): string { + return sha1($string); + } + + final function isSerialKey(string &$key): bool { + return str::del_suffix($key, "__"); + } + + final function getSumKeys(string $key): array { + return ["${key}__", "${key}__sum_"]; + } + + function getSum(string $key, $value): array { + $keys = $this->getSumKeys($key); + if ($value !== null) $value = $this->serialize($value); + $sum = $this->sum($value); + return array_combine($keys, [$value, $sum]); + } + + function _wasSumModified(string $key, array $row, array $prow): bool { + $sumKey = $this->getSumKeys($key)[1]; + $sum = $row[$sumKey] ?? null; + $psum = $prow[$sumKey] ?? null; + return $sum !== $psum; + } + + function wasSumModified(string $key, array $rowValues, array $prowValues): bool { + $sumKey = $this->getSumKeys($key)[1]; + $sum = $this->getSum($key, $rowValues[$key] ?? null)[$sumKey]; + $psum = $prowValues[$sumKey] ?? sha1(serialize($prowValues[$key] ?? null)); + return $sum !== $psum; + } + /** * méthode appelée lors du chargement avec {@link Capacitor::charge()} pour * créer un nouvel élément @@ -149,16 +203,6 @@ class CapacitorChannel { return null; } - /** - * retourne true si un nouvel élément ou un élément mis à jour a été chargé. - * false si l'élément chargé est identique au précédent. - * - * cette méthode doit être utilisée dans {@link self::onUpdate()} - */ - function wasModified(array $rowValues): bool { - return array_key_exists("modified_", $rowValues); - } - /** * méthode appelée lors du chargement avec {@link Capacitor::charge()} pour * mettre à jour un élément existant diff --git a/src/db/CapacitorStorage.php b/src/db/CapacitorStorage.php index d345cc4..0dd8b49 100644 --- a/src/db/CapacitorStorage.php +++ b/src/db/CapacitorStorage.php @@ -1,6 +1,7 @@ "text", - "sum_" => "varchar(40)", + "item__sum_" => CapacitorChannel::SUM_DEFINITION, "created_" => "datetime", "modified_" => "datetime", ]; @@ -57,16 +58,12 @@ abstract class CapacitorStorage { $key = $col; if ($key === $index) { $index++; - continue; - } elseif (str::del_suffix($key, "__")) { - if (!array_key_exists($key, $values)) continue; - $value = $values[$key]; - if ($value !== null) $value = serialize($value); + } elseif (!array_key_exists($key, $values)) { + } elseif ($channel->isSerialKey($key)) { + A::merge($row, $channel->getSum($key, $values[$key])); } else { - if (!array_key_exists($key, $values)) continue; - $value = $values[$key]; + $row[$col] = $values[$key]; } - $row[$col] = $value; } return $row; } @@ -81,16 +78,14 @@ abstract class CapacitorStorage { $key = $col; if ($key === $index) { $index++; - continue; } elseif (!array_key_exists($col, $row)) { - continue; - } elseif (str::del_suffix($key, "__")) { + } elseif ($channel->isSerialKey($key)) { $value = $row[$col]; - if ($value !== null) $value = unserialize($value); + if ($value !== null) $value = $channel->unserialize($value); + $values[$key] = $value; } else { - $value = $row[$col]; + $values[$key] = $row[$col]; } - $values[$key] = $value; } return $values; } diff --git a/src/db/mysql/MysqlStorage.php b/src/db/mysql/MysqlStorage.php index 4088103..4d59863 100644 --- a/src/db/mysql/MysqlStorage.php +++ b/src/db/mysql/MysqlStorage.php @@ -66,12 +66,9 @@ class MysqlStorage extends CapacitorStorage { $this->_create($channel); $tableName = $channel->getTableName(); $now = date("Y-m-d H:i:s"); - $item__ = serialize($item); - $sum_ = sha1($item__); - $row = cl::merge([ - "item__" => $item__, - "sum_" => $sum_, - ], $this->unserialize($channel, $channel->getItemValues($item))); + $row = cl::merge( + $channel->getSum("item", $item), + $this->unserialize($channel, $channel->getItemValues($item))); $prow = null; $rowIds = $this->getRowIds($channel, $row, $primaryKeys); if ($rowIds !== null) { @@ -97,7 +94,7 @@ class MysqlStorage extends CapacitorStorage { $args = [$item, $values, ...$args]; } else { # modification - if ($sum_ !== $prow["sum_"]) { + if ($channel->_wasSumModified("item", $row, $prow)) { $insert = false; $row = cl::merge($row, [ "modified_" => $now, @@ -111,17 +108,12 @@ class MysqlStorage extends CapacitorStorage { } $updates = func::call($func, ...$args); - if (is_array($updates)) { + if (is_array($updates) && $updates) { if ($insert === null) $insert = false; - $updates = $this->serialize($channel, $updates); - if (array_key_exists("item__", $updates)) { - # si item a été mis à jour, il faut mettre à jour sum_ - $updates["sum_"] = sha1($updates["item__"]); - if (!array_key_exists("modified_", $updates)) { - $updates["modified_"] = $now; - } + if (!array_key_exists("modified_", $updates)) { + $updates["modified_"] = $now; } - $row = cl::merge($row, $updates); + $row = cl::merge($row, $this->serialize($channel, $updates)); } if ($insert === null) { diff --git a/src/db/sqlite/SqliteStorage.php b/src/db/sqlite/SqliteStorage.php index 705806f..ea22e6c 100644 --- a/src/db/sqlite/SqliteStorage.php +++ b/src/db/sqlite/SqliteStorage.php @@ -64,12 +64,9 @@ class SqliteStorage extends CapacitorStorage { $this->_create($channel); $tableName = $channel->getTableName(); $now = date("Y-m-d H:i:s"); - $item__ = serialize($item); - $sum_ = sha1($item__); - $row = cl::merge([ - "item__" => $item__, - "sum_" => $sum_, - ], $this->unserialize($channel, $channel->getItemValues($item))); + $row = cl::merge( + $channel->getSum("item", $item), + $this->unserialize($channel, $channel->getItemValues($item))); $prow = null; $rowIds = $this->getRowIds($channel, $row, $primaryKeys); if ($rowIds !== null) { @@ -95,7 +92,7 @@ class SqliteStorage extends CapacitorStorage { $args = [$item, $values, ...$args]; } else { # modification - if ($sum_ !== $prow["sum_"]) { + if ($channel->_wasSumModified("item", $row, $prow)) { $insert = false; $row = cl::merge($row, [ "modified_" => $now, @@ -109,17 +106,12 @@ class SqliteStorage extends CapacitorStorage { } $updates = func::call($func, ...$args); - if (is_array($updates)) { + if (is_array($updates) && $updates) { if ($insert === null) $insert = false; - $updates = $this->serialize($channel, $updates); - if (array_key_exists("item__", $updates)) { - # si item a été mis à jour, il faut mettre à jour sum_ - $updates["sum_"] = sha1($updates["item__"]); - if (!array_key_exists("modified_", $updates)) { - $updates["modified_"] = $now; - } + if (!array_key_exists("modified_", $updates)) { + $updates["modified_"] = $now; } - $row = cl::merge($row, $updates); + $row = cl::merge($row, $this->serialize($channel, $updates)); } if ($insert === null) { diff --git a/src/php/time/Date.php b/src/php/time/Date.php index 60f6fa7..2f72bfe 100644 --- a/src/php/time/Date.php +++ b/src/php/time/Date.php @@ -11,7 +11,7 @@ class Date extends DateTime { function __construct($datetime="now", DateTimeZone $timezone=null) { parent::__construct($datetime, $timezone); - $this->setTime(0, 0, 0, 0); + $this->setTime(0, 0); } function format($format=self::DEFAULT_FORMAT): string { diff --git a/src/php/time/DateTime.php b/src/php/time/DateTime.php index 9a1b2a5..589f1dd 100644 --- a/src/php/time/DateTime.php +++ b/src/php/time/DateTime.php @@ -197,6 +197,39 @@ class DateTime extends \DateTime { return \DateTime::format($format); } + /** + * modifier cet objet pour que l'heure soit à 00:00:00 ce qui le rend propice + * à l'utilisation comme borne inférieure d'une période + */ + function wrapStartOfDay(): self { + $this->setTime(0, 0); + return $this; + } + + /** + * modifier cet objet pour que l'heure soit à 23:59:59.999999 ce qui le rend + * propice à l'utilisation comme borne supérieure d'une période + */ + function wrapEndOfDay(): self { + $this->setTime(23, 59, 59, 999999); + return $this; + } + + function getPrevDay(int $nbDays=1, bool $skipWeekend=false): self { + if ($nbDays == 1 && $skipWeekend && $this->wday == 1) { + $nbdays = 3; + } + return static::with($this->sub(new \DateInterval("P${nbDays}D"))); + } + + function getNextDay(int $nbDays=1, bool $skipWeekend=false): self { + if ($nbDays == 1 && $skipWeekend) { + $wday = $this->wday; + if ($wday > 5) $nbDays = 8 - $this->wday; + } + return static::with($this->add(new \DateInterval("P${nbDays}D"))); + } + function __toString(): string { return $this->format(); }