modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2024-06-06 16:07:58 +04:00
parent d223446e3c
commit 06b1bce249
7 changed files with 118 additions and 58 deletions

View File

@ -35,4 +35,8 @@ class A {
else $array = [$array];
return false;
}
static function merge(?array &$dest, ...$merges): void {
$dest = cl::merge($dest, ...$merges);
}
}

View File

@ -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

View File

@ -1,6 +1,7 @@
<?php
namespace nur\sery\db;
use nur\sery\A;
use nur\sery\cl;
use nur\sery\str;
@ -32,7 +33,7 @@ abstract class CapacitorStorage {
const COLUMN_DEFINITIONS = [
"item__" => "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);
} else {
$value = $row[$col];
}
if ($value !== null) $value = $channel->unserialize($value);
$values[$key] = $value;
} else {
$values[$key] = $row[$col];
}
}
return $values;
}

View File

@ -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;
}
}
$row = cl::merge($row, $updates);
$row = cl::merge($row, $this->serialize($channel, $updates));
}
if ($insert === null) {

View File

@ -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;
}
}
$row = cl::merge($row, $updates);
$row = cl::merge($row, $this->serialize($channel, $updates));
}
if ($insert === null) {

View File

@ -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 {

View File

@ -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();
}