Source of file DataStorage.php

Size: 6,304 Bytes - Last Modified: 2020-10-24T02:46:31+00:00

/home/travis/build/NextDom/nextdom-core/src/Helpers/DataStorage.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
<?php

/* This file is part of NextDom Software.
 *
 * NextDom is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * NextDom Software 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with NextDom Software. If not, see <http://www.gnu.org/licenses/>.
 */

namespace NextDom\Helpers;

/**
 * Classe de gestion du stockage des données
 */
class DataStorage
{
    /**
     * @var string Nom de la table des données
     */
    private $dataTableName;

    /**
     * Constructeur.
     * Initialise le nom de la table des données
     *
     * @param string $dataTableName Nom de la table des données.
     */
    public function __construct(string $dataTableName)
    {
        $this->dataTableName = 'data_' . $dataTableName;
    }

    /**
     * Créer la table des données
     */
    public function createDataTable()
    {
        if (!$this->isDataTableExists()) {
            $statement = DBHelper::getConnection()->prepare("CREATE TABLE `" . $this->dataTableName . "` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `code` VARCHAR(256) NOT NULL, `data` TEXT NULL)");
            $statement->execute();
        }
    }

    /**
     * Test si une table existe dans la base de données
     *
     * @return bool True si la table exists
     */
    public function isDataTableExists(): bool
    {
        $returnValue = false;
        $statement = DBHelper::getConnection()->prepare("SHOW TABLES LIKE ?");
        $statement->execute([$this->dataTableName]);
        $dbResult = $statement->fetchAll(\PDO::FETCH_ASSOC);
        if (count($dbResult) > 0) {
            $returnValue = true;
        }
        return $returnValue;
    }

    /**
     * Supprimer la table des données
     */
    public function dropDataTable()
    {
        DBHelper::getConnection()->prepare("DROP TABLE IF EXISTS `" . $this->dataTableName . "`")->execute();
    }

    /**
     * Supprime une donnée de la base de données
     *
     * @param string $code Code de la donnée
     */
    public function deleteData(string $code)
    {
        $statement = DBHelper::getConnection()->prepare("DELETE FROM `" . $this->dataTableName . "` WHERE `code` = ?");
        $statement->execute([$code]);
    }

    /**
     * Stocke des données au format JSON.
     *
     * @param string $code Code des données
     * @param array $jsonData Données au format JSON
     */
    public function storeJsonData(string $code, array $jsonData)
    {
        $this->storeRawData($code, json_encode($jsonData));
    }

    /**
     * Stocke des données brutes.
     * Les données sont mises à jour si elles avaient été stockées précédemment.
     *
     * @param string $code Code des données.
     * @param mixed $data Données brutes
     */
    public function storeRawData(string $code, $data)
    {
        if ($this->isDataExists($code)) {
            $this->updateRawData($code, $data);
        } else {
            $this->addRawData($code, $data);
        }
    }

    /**
     * Test si une donnée existe
     *
     * @param string $code Code de la donnée
     *
     * @return bool True si la données existe
     */
    public function isDataExists(string $code): bool
    {
        $result = false;
        if ($this->getRawData($code) !== null) {
            $result = true;
        }
        return $result;
    }

    /**
     * Obtenir une données stockée brute
     *
     * @param string $code Codes des données
     *
     * @return mixed Données correspondant au code.
     */
    public function getRawData(string $code)
    {
        $returnValue = null;
        $statement = DBHelper::getConnection()->prepare("SELECT `data` FROM `" . $this->dataTableName . "` WHERE `code` = ?");
        $statement->execute([$code]);
        $result = $statement->fetchAll(\PDO::FETCH_ASSOC);
        if (count($result) > 0) {
            $returnValue = $result[0]['data'];
        }
        return $returnValue;
    }

    /**
     * Met à jour une donnée brutes stockées
     *
     * @param string $code Codes des données
     * @param mixed $data Données brutes
     */
    public function updateRawData(string $code, $data)
    {
        $statement = DBHelper::getConnection()->prepare("UPDATE `" . $this->dataTableName . "` SET `data` = ? WHERE `code` = ?");
        $statement->execute([$data, $code]);

    }

    /**
     * Ajoute des données brutes
     *
     * @param string $code Codes des données
     * @param string $data Données brutes
     */
    public function addRawData(string $code, $data)
    {
        $statement = DBHelper::getConnection()->prepare("INSERT INTO `" . $this->dataTableName . "` (`code`, `data`) VALUES (?, ?)");
        $statement->execute([$code, $data]);
    }

    /**
     * Obtenir des données JSON
     *
     * @param string $code Code des données
     *
     * @return array|null Tableau de données.
     */
    public function getJsonData(string $code)
    {
        return json_decode($this->getRawData($code), true);
    }

    /**
     * Supprime une données à partir de son code
     *
     * @param string $code Code de la données à supprimer
     */
    public function remove(string $code)
    {
        $statement = DBHelper::getConnection()->prepare("DELETE FROM `" . $this->dataTableName . "` WHERE `code` LIKE ?");
        $statement->execute([$code]);
    }

    /**
     * Obtenir toutes données ayant un préfix commun.
     *
     * @param string $prefix Préfixe des clés.
     *
     * @return array Liste des résultats
     */
    public function getAllByPrefix(string $prefix): array
    {
        $statement = DBHelper::getConnection()->prepare("SELECT `data` FROM `" . $this->dataTableName . "` WHERE `code` LIKE ?");
        $statement->execute([$prefix . '%']);
        $returnValue = $statement->fetchAll(\PDO::FETCH_ASSOC);
        return $returnValue;
    }
}