Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/backup.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Tools/Model/SimpleDataStore.php')
-rw-r--r--lib/Tools/Model/SimpleDataStore.php487
1 files changed, 487 insertions, 0 deletions
diff --git a/lib/Tools/Model/SimpleDataStore.php b/lib/Tools/Model/SimpleDataStore.php
new file mode 100644
index 0000000..574614f
--- /dev/null
+++ b/lib/Tools/Model/SimpleDataStore.php
@@ -0,0 +1,487 @@
+<?php
+
+declare(strict_types=1);
+
+
+/**
+ * Nextcloud - Backup now. Restore later.
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Maxence Lange <maxence@artificial-owl.com>
+ * @copyright 2022
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\Backup\Tools\Model;
+
+use JsonSerializable;
+use OCA\Backup\Tools\Exceptions\InvalidItemException;
+use OCA\Backup\Tools\Exceptions\ItemNotFoundException;
+use OCA\Backup\Tools\Exceptions\MalformedArrayException;
+use OCA\Backup\Tools\Exceptions\UnknownTypeException;
+use OCA\Backup\Tools\IDeserializable;
+use OCA\Backup\Tools\Traits\TArrayTools;
+
+class SimpleDataStore implements JsonSerializable {
+ use TArrayTools;
+
+
+ /** @var array */
+ private $data;
+
+
+ /**
+ * SimpleDataStore constructor.
+ *
+ * @param array|null $data
+ */
+ public function __construct(?array $data = []) {
+ if (!is_array($data)) {
+ $data = [];
+ }
+
+ $this->data = $data;
+ }
+
+ public function default(array $default = []): void {
+ $this->data = array_merge($default, $this->data);
+ }
+
+
+ /**
+ * @param string $key
+ * @param string $value
+ *
+ * @return SimpleDataStore
+ */
+ public function s(string $key, string $value): self {
+ $this->data[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return string
+ */
+ public function g(string $key): string {
+ return $this->get($key, $this->data);
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return $this
+ */
+ public function u(string $key): self {
+ if ($this->hasKey($key)) {
+ unset($this->data[$key]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ * @param string $value
+ *
+ * @return SimpleDataStore
+ */
+ public function a(string $key, string $value): self {
+ if (!array_key_exists($key, $this->data)) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key][] = $value;
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param int $value
+ *
+ * @return SimpleDataStore
+ */
+ public function sInt(string $key, int $value): self {
+ $this->data[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return int
+ */
+ public function gInt(string $key): int {
+ return $this->getInt($key, $this->data);
+ }
+
+ /**
+ * @param string $key
+ * @param int $value
+ *
+ * @return SimpleDataStore
+ */
+ public function aInt(string $key, int $value): self {
+ if (!array_key_exists($key, $this->data)) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key][] = $value;
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param bool $value
+ *
+ * @return SimpleDataStore
+ */
+ public function sBool(string $key, bool $value): self {
+ $this->data[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return bool
+ */
+ public function gBool(string $key): bool {
+ return $this->getBool($key, $this->data);
+ }
+
+ /**
+ * @param string $key
+ * @param bool $value
+ *
+ * @return SimpleDataStore
+ */
+ public function aBool(string $key, bool $value): self {
+ if (!array_key_exists($key, $this->data)) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key][] = $value;
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param array $values
+ *
+ * @return SimpleDataStore
+ */
+ public function sArray(string $key, array $values): self {
+ $this->data[$key] = $values;
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return array
+ */
+ public function gArray(string $key): array {
+ return $this->getArray($key, $this->data);
+ }
+
+ /**
+ * @param string $key
+ * @param array $values
+ *
+ * @return SimpleDataStore
+ */
+ public function aArray(string $key, array $values): self {
+ if (!array_key_exists($key, $this->data)) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key] = array_merge($this->data[$key], $values);
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param JsonSerializable $value
+ *
+ * @return SimpleDataStore
+ */
+ public function sObj(string $key, JsonSerializable $value): self {
+ $this->data[$key] = $value;
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param string $class
+ *
+ * @return JsonSerializable[]
+ */
+ public function gObjs(string $key, string $class = ''): array {
+ $list = $this->gArray($key);
+ $result = [];
+ foreach ($list as $item) {
+ $data = new SimpleDataStore([$key => $item]);
+ $result[] = $data->gObj($key, $class);
+ }
+
+ return array_filter($result);
+ }
+
+
+ /**
+ * @param string $key
+ * @param string $class
+ *
+ * @return null|JsonSerializable
+ * @throws InvalidItemException
+ * @throws UnknownTypeException
+ * @throws ItemNotFoundException
+ */
+ public function gObj(string $key, string $class = ''): ?JsonSerializable {
+ $type = $this->typeOf($key, $this->data);
+
+ if ($type === self::$TYPE_NULL) {
+ if ($class === '') {
+ return null;
+ }
+
+ throw new InvalidItemException();
+ }
+
+ if ($type === self::$TYPE_SERIALIZABLE) {
+ return $this->getObj($key, $this->data);
+ }
+
+ if ($type === self::$TYPE_ARRAY && $class !== '') {
+ $item = new $class();
+ if (!$item instanceof IDeserializable && !$item instanceof JsonSerializable) {
+ throw new InvalidItemException(
+ $class . ' does not implement IDeserializable and JsonSerializable'
+ );
+ }
+
+ $item->import($this->getArray($key, $this->data));
+
+ return $item;
+ }
+
+ throw new InvalidItemException();
+ }
+
+ /**
+ * @param string $key
+ * @param JsonSerializable $value
+ *
+ * @return SimpleDataStore
+ */
+ public function aObj(string $key, JsonSerializable $value): self {
+ if (!array_key_exists($key, $this->data)) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key][] = $value;
+
+ return $this;
+ }
+
+
+ /**
+ * @param string $key
+ * @param SimpleDataStore $data
+ *
+ * @return $this
+ */
+ public function sData(string $key, SimpleDataStore $data): self {
+ $this->data[$key] = $data->gAll();
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ * @param SimpleDataStore $data
+ *
+ * @return $this
+ */
+ public function aData(string $key, SimpleDataStore $data): self {
+ if (!array_key_exists($key, $this->data) || !is_array($this->data[$key])) {
+ $this->data[$key] = [];
+ }
+
+ $this->data[$key][] = $data->gAll();
+
+ return $this;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return SimpleDataStore
+ */
+ public function gData(string $key): SimpleDataStore {
+ return new SimpleDataStore($this->getArray($key, $this->data));
+ }
+
+
+ /**
+ * @param string $key
+ *
+ * @return mixed
+ * @throws ItemNotFoundException
+ */
+ public function gItem(string $key) {
+ if (!array_key_exists($key, $this->data)) {
+ throw new ItemNotFoundException();
+ }
+
+ return $this->data[$key];
+ }
+
+
+ /**
+ * @return array
+ */
+ public function gAll(): array {
+ return $this->data;
+ }
+
+ /**
+ * @param array $data
+ *
+ * @return SimpleDataStore
+ */
+ public function sAll(array $data): self {
+ $this->data = $data;
+
+ return $this;
+ }
+
+
+ public function keys(): array {
+ return array_keys($this->data);
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return bool
+ */
+ public function hasKey(string $key): bool {
+ return (array_key_exists($key, $this->data));
+ }
+
+
+ /**
+ * @param array $keys
+ *
+ * @param bool $must
+ *
+ * @return bool
+ * @throws MalformedArrayException
+ */
+ public function hasKeys(array $keys, bool $must = false): bool {
+ foreach ($keys as $key) {
+ if (!$this->haveKey($key)) {
+ if ($must) {
+ throw new MalformedArrayException($key . ' missing in ' . json_encode($this->keys()));
+ }
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ /**
+ * @param array $keys
+ * @param bool $must
+ *
+ * @return bool
+ * @throws MalformedArrayException
+ * @deprecated
+ */
+ public function haveKeys(array $keys, bool $must = false): bool {
+ return $this->hasKeys($keys, $must);
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return bool
+ * @deprecated
+ */
+ public function haveKey(string $key): bool {
+ return $this->hasKey($key);
+ }
+
+
+ /**
+ * @param string $json
+ *
+ * @return $this
+ */
+ public function json(string $json): self {
+ $data = json_decode($json, true);
+ if (is_array($data)) {
+ $this->data = $data;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param JsonSerializable $obj
+ *
+ * @return $this
+ */
+ public function obj(JsonSerializable $obj): self {
+ $data = $obj->jsonSerialize();
+ if (is_array($data)) {
+ $this->data = $data;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ public function jsonSerialize(): array {
+ return $this->data;
+ }
+}