diff --git a/source/helpers.php b/source/helpers.php index 46b4081..546ac3b 100644 --- a/source/helpers.php +++ b/source/helpers.php @@ -2,7 +2,7 @@ namespace rosavox\helpers; - + /** */ class cache_state @@ -28,6 +28,59 @@ function cache_get(string $key, \Closure $retrieve) } +/** + */ +function database_map_type(string $type) +{ + switch ($type) + { + case 'integer': return \SQLITE3_INTEGER; + case 'string': return \SQLITE3_TEXT; + default: throw (new \Exception(\sprintf('unhandled type: %s', $type))); + } +} + + +/** + */ +function database_get(string $query_template, array $arguments) : array +{ + $connection = new \SQLite3('data.sqlite'); + $rows = $connection->query($query_template); + /* +$query = "SELECT * FROM books"; +$result = $db->query($query); + +while ($row = $result->fetchArray(SQLITE3_ASSOC)) { + */ +} + + +/** + */ +function database_put(string $query_template, array $arguments) : int +{ + $connection = new \SQLite3('data.sqlite'); + $statement = $connection->prepare($query); + foreach ($arguments as $key => $value) + { + $statement->bindValue( + \sprintf(':%s', $key), + $value['value'], + database_map_type($value['type']) + ); + } + if ($statement->execute()) { + // SELECT last_insert_rowid() + echo "Buch erfolgreich hinzugefügt!"; + } + else + { + echo "Fehler beim Hinzufügen des Buches: " . $db->lastErrorMsg(); + } +} + + /** */ function string_coin(string $template, array $arguments) : string @@ -41,6 +94,114 @@ function string_coin(string $template, array $arguments) : string } +/** + */ +class class_crud_jsonfile +{ + private string $path; + + private \Closure $id_encode; + + private \Closure $id_decode; + + public function __construct( + string $path, + \Closure $id_encode, + \Closure $id_decode + ) + { + $this->path = $path; + $this->id_encode = $id_encode; + $this->id_decode = $id_decode; + } + + private function get() : array + { + $content = (\file_exists($this->path) ? \file_get_contents($this->path) : null); + return ( + ($content === null) + ? + ['last_id' => 0, 'entries' => []] + : + \json_decode($content, true) + ); + } + + private function put(array $data) : void + { + $content = \json_encode($data, \JSON_PRETTY_PRINT); + \file_put_contents($this->path, $content); + } + + public function list_() : array + { + $data = $this->get(); + return \array_map( + fn ($id_encoded) => [ + 'id' => ($this->id_decode)($id_encoded), + 'value' => $data['entries'][$id_encoded], + ], + \array_keys($data['entries']) + ); + } + + public function read(int $id) + { + $data = $this->get(); + $id_encoded = ($this->id_encode)($id); + if (! \array_key_exists($id_encoded, $data['entries'])) + { + throw (new \Exception('not found')); + } + else + { + return $data['entries'][$id_encoded]; + } + } + + public function create($value) : int + { + $data = $this->get(); + $id = ($data['last_id'] + 1); + $id_encoded = ($this->id_encode)($id); + $data['last_id'] = $id; + $data['entries'][$id_encoded] = $value; + $this->put($data); + return $id; + } + + public function update(int $id, $value) : void + { + $data = $this->get(); + $id_encoded = ($this->id_encode)($id); + if (! \array_key_exists($id_encoded, $data['entries'])) + { + throw (new \Exception('not found')); + } + else + { + $data['entries'][$id_encoded] = $value; + $this->put($data); + } + } + + public function delete(int $id) : void + { + $data = $this->get(); + $id_encoded = ($this->id_encode)($id); + if (! \array_key_exists($id_encoded, $data['entries'])) + { + throw (new \Exception('not found')); + } + else + { + unset($data['entries'][$id_encoded]); + $this->put($data); + } + } +} + + /** */ function render(string $template_name, array $arguments) : string diff --git a/source/index.html.php b/source/index.html.php index 0140df9..f74147a 100644 --- a/source/index.html.php +++ b/source/index.html.php @@ -7,7 +7,7 @@ require_once(__DIR__ . '/logic.php'); $mode = ($_GET['mode'] ?? 'list'); $id_encoded = (! empty($_GET['id']) ? $_GET['id'] : null); -$id = (($id_encoded === null) ? null : \rosavox\logic\docs_id_decode($id_encoded)); +$id = (($id_encoded === null) ? null : \intval($id_encoded)); function nav(string $mode, array $args) : void @@ -37,15 +37,10 @@ function nav(string $mode, array $args) : void
+