[9.3.00] nouvelle classe de gestion des json
This commit is contained in:
parent
586fa44e76
commit
70c647ac97
@ -14,13 +14,10 @@
|
|||||||
* @link http://zwiicms.com/
|
* @link http://zwiicms.com/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Chargement de classes personnalisées
|
// Classes personnalisées
|
||||||
require "core/vendor/sitemap/SitemapGenerator.php";
|
require "core/vendor/autoload.php";
|
||||||
require "core/vendor/flintstone/autoload.php";
|
|
||||||
require "core/vendor/phpmailer/phpmailer.php";
|
|
||||||
require "core/vendor/phpmailer/exception.php";
|
|
||||||
|
|
||||||
|
|
||||||
|
// Classe internes
|
||||||
class common {
|
class common {
|
||||||
const DISPLAY_RAW = 0;
|
const DISPLAY_RAW = 0;
|
||||||
const DISPLAY_JSON = 1;
|
const DISPLAY_JSON = 1;
|
||||||
@ -507,13 +504,20 @@ class common {
|
|||||||
} else {
|
} else {
|
||||||
$folder = self::DATA_DIR;
|
$folder = self::DATA_DIR;
|
||||||
}
|
}
|
||||||
$store[$stageId] = new Flintstone\Flintstone($stageId, [
|
//$store[$stageId] = new Flintstone\Flintstone($stageId, [
|
||||||
'dir' => $folder,
|
// 'dir' => $folder,
|
||||||
'ext' => 'json',
|
// 'ext' => 'json',
|
||||||
'formatter' => new Flintstone\Formatter\JsonFormatter()
|
// 'formatter' => new Flintstone\Formatter\JsonFormatter()
|
||||||
]);
|
// ]);
|
||||||
|
|
||||||
$store[$stageId]->set($stageId,$this->getData([$stageId]));
|
//$store[$stageId]->set($stageId,$this->getData([$stageId]));
|
||||||
|
|
||||||
|
$db[$stageId] = new \Prowebcraft\JsonDb([
|
||||||
|
'name' => $stageId . '.json',
|
||||||
|
'dir' => $folder
|
||||||
|
]);
|
||||||
|
$db[$stageId]->set($stageId,$this->getData([$stageId]));
|
||||||
|
$db[$stageId]->save;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -537,12 +541,18 @@ class common {
|
|||||||
} else {
|
} else {
|
||||||
$folder = self::DATA_DIR;
|
$folder = self::DATA_DIR;
|
||||||
}
|
}
|
||||||
$store[$stageId] = new Flintstone\Flintstone($stageId, [
|
//$store[$stageId] = new Flintstone\Flintstone($stageId, [
|
||||||
'dir' => $folder,
|
// 'dir' => $folder,
|
||||||
'ext' => 'json',
|
// 'ext' => 'json',
|
||||||
'formatter' => new Flintstone\Formatter\JsonFormatter()
|
// 'formatter' => new Flintstone\Formatter\JsonFormatter()
|
||||||
]);
|
//]);
|
||||||
$tempData = $store[$stageId]->get($stageId);
|
$db[$stageId] = new \Prowebcraft\JsonDb([
|
||||||
|
'name' => $stageId . '.json',
|
||||||
|
'dir' => $folder
|
||||||
|
]);
|
||||||
|
|
||||||
|
//$tempData = $store[$stageId]->get($stageId);
|
||||||
|
$tempData = $db[$stageId]->get($stageId);
|
||||||
if ($tempData) {
|
if ($tempData) {
|
||||||
$data [$stageId] = $tempData;
|
$data [$stageId] = $tempData;
|
||||||
} else {
|
} else {
|
||||||
@ -1209,13 +1219,6 @@ class core extends common {
|
|||||||
elseif(is_readable('core/vendor/' . $classPath)) {
|
elseif(is_readable('core/vendor/' . $classPath)) {
|
||||||
require 'core/vendor/' . $classPath;
|
require 'core/vendor/' . $classPath;
|
||||||
}
|
}
|
||||||
// Classes personnalisées
|
|
||||||
elseif(is_readable('core/vendor/flinstone/' . $classPath)) {
|
|
||||||
require 'core/vendor/flintstone/' . $className . '.php';
|
|
||||||
require 'core/vendor/flintstone/Formatter/' . $className . '.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
9
core/vendor/autoload.php
vendored
Normal file
9
core/vendor/autoload.php
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
// JsonDB
|
||||||
|
require "core/vendor/jsondb/Dot.php";
|
||||||
|
require "core/vendor/jsondb/JsonDB.php";
|
||||||
|
// phpMailer
|
||||||
|
require "core/vendor/phpmailer/phpmailer.php";
|
||||||
|
require "core/vendor/phpmailer/exception.php";
|
||||||
|
// Sitemap Creator
|
||||||
|
require "core/vendor/sitemap/SitemapGenerator.php";
|
53
core/vendor/flintstone/Cache/ArrayCache.php
vendored
53
core/vendor/flintstone/Cache/ArrayCache.php
vendored
@ -1,53 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone\Cache;
|
|
||||||
|
|
||||||
class ArrayCache implements CacheInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Cache data.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $cache = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function contains($key)
|
|
||||||
{
|
|
||||||
return array_key_exists($key, $this->cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function get($key)
|
|
||||||
{
|
|
||||||
return $this->cache[$key];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function set($key, $data)
|
|
||||||
{
|
|
||||||
$this->cache[$key] = $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function delete($key)
|
|
||||||
{
|
|
||||||
unset($this->cache[$key]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function flush()
|
|
||||||
{
|
|
||||||
$this->cache = [];
|
|
||||||
}
|
|
||||||
}
|
|
44
core/vendor/flintstone/Cache/CacheInterface.php
vendored
44
core/vendor/flintstone/Cache/CacheInterface.php
vendored
@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone\Cache;
|
|
||||||
|
|
||||||
interface CacheInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Check if a key exists in the cache.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function contains($key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a key from the cache.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function get($key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a key in the cache.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $data
|
|
||||||
*/
|
|
||||||
public function set($key, $data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a key from the cache.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*/
|
|
||||||
public function delete($key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush the cache.
|
|
||||||
*/
|
|
||||||
public function flush();
|
|
||||||
}
|
|
209
core/vendor/flintstone/Config.php
vendored
209
core/vendor/flintstone/Config.php
vendored
@ -1,209 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
use Flintstone\Cache\ArrayCache;
|
|
||||||
use Flintstone\Cache\CacheInterface;
|
|
||||||
use Flintstone\Formatter\FormatterInterface;
|
|
||||||
use Flintstone\Formatter\SerializeFormatter;
|
|
||||||
|
|
||||||
class Config
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Config.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $config = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param array $config
|
|
||||||
*/
|
|
||||||
public function __construct(array $config = [])
|
|
||||||
{
|
|
||||||
$config = $this->normalizeConfig($config);
|
|
||||||
$this->setDir($config['dir']);
|
|
||||||
$this->setExt($config['ext']);
|
|
||||||
$this->setGzip($config['gzip']);
|
|
||||||
$this->setCache($config['cache']);
|
|
||||||
$this->setFormatter($config['formatter']);
|
|
||||||
$this->setSwapMemoryLimit($config['swap_memory_limit']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Normalize the user supplied config.
|
|
||||||
*
|
|
||||||
* @param array $config
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function normalizeConfig(array $config): array
|
|
||||||
{
|
|
||||||
$defaultConfig = [
|
|
||||||
'dir' => getcwd(),
|
|
||||||
'ext' => '.dat',
|
|
||||||
'gzip' => false,
|
|
||||||
'cache' => true,
|
|
||||||
'formatter' => null,
|
|
||||||
'swap_memory_limit' => 2097152, // 2MB
|
|
||||||
];
|
|
||||||
|
|
||||||
return array_replace($defaultConfig, $config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the dir.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getDir(): string
|
|
||||||
{
|
|
||||||
return $this->config['dir'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the dir.
|
|
||||||
*
|
|
||||||
* @param string $dir
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setDir(string $dir)
|
|
||||||
{
|
|
||||||
if (!is_dir($dir)) {
|
|
||||||
throw new Exception('Directory does not exist: ' . $dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->config['dir'] = rtrim($dir, '/\\') . DIRECTORY_SEPARATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the ext.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getExt(): string
|
|
||||||
{
|
|
||||||
if ($this->useGzip()) {
|
|
||||||
return $this->config['ext'] . '.gz';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->config['ext'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the ext.
|
|
||||||
*
|
|
||||||
* @param string $ext
|
|
||||||
*/
|
|
||||||
public function setExt(string $ext)
|
|
||||||
{
|
|
||||||
if (substr($ext, 0, 1) !== '.') {
|
|
||||||
$ext = '.' . $ext;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->config['ext'] = $ext;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use gzip?
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function useGzip(): bool
|
|
||||||
{
|
|
||||||
return $this->config['gzip'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set gzip.
|
|
||||||
*
|
|
||||||
* @param bool $gzip
|
|
||||||
*/
|
|
||||||
public function setGzip(bool $gzip)
|
|
||||||
{
|
|
||||||
$this->config['gzip'] = $gzip;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the cache.
|
|
||||||
*
|
|
||||||
* @return CacheInterface|false
|
|
||||||
*/
|
|
||||||
public function getCache()
|
|
||||||
{
|
|
||||||
return $this->config['cache'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the cache.
|
|
||||||
*
|
|
||||||
* @param mixed $cache
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setCache($cache)
|
|
||||||
{
|
|
||||||
if (!is_bool($cache) && !$cache instanceof CacheInterface) {
|
|
||||||
throw new Exception('Cache must be a boolean or an instance of Flintstone\Cache\CacheInterface');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($cache === true) {
|
|
||||||
$cache = new ArrayCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->config['cache'] = $cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the formatter.
|
|
||||||
*
|
|
||||||
* @return FormatterInterface
|
|
||||||
*/
|
|
||||||
public function getFormatter(): FormatterInterface
|
|
||||||
{
|
|
||||||
return $this->config['formatter'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the formatter.
|
|
||||||
*
|
|
||||||
* @param FormatterInterface|null $formatter
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setFormatter($formatter)
|
|
||||||
{
|
|
||||||
if ($formatter === null) {
|
|
||||||
$formatter = new SerializeFormatter();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$formatter instanceof FormatterInterface) {
|
|
||||||
throw new Exception('Formatter must be an instance of Flintstone\Formatter\FormatterInterface');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->config['formatter'] = $formatter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the swap memory limit.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getSwapMemoryLimit(): int
|
|
||||||
{
|
|
||||||
return $this->config['swap_memory_limit'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the swap memory limit.
|
|
||||||
*
|
|
||||||
* @param int $limit
|
|
||||||
*/
|
|
||||||
public function setSwapMemoryLimit(int $limit)
|
|
||||||
{
|
|
||||||
$this->config['swap_memory_limit'] = $limit;
|
|
||||||
}
|
|
||||||
}
|
|
255
core/vendor/flintstone/Database.php
vendored
255
core/vendor/flintstone/Database.php
vendored
@ -1,255 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
use SplFileObject;
|
|
||||||
use SplTempFileObject;
|
|
||||||
|
|
||||||
class Database
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* File read flag.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
const FILE_READ = 1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* File write flag.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
const FILE_WRITE = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* File append flag.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
const FILE_APPEND = 3;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* File access mode.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $fileAccessMode = [
|
|
||||||
self::FILE_READ => [
|
|
||||||
'mode' => 'rb',
|
|
||||||
'operation' => LOCK_SH,
|
|
||||||
],
|
|
||||||
self::FILE_WRITE => [
|
|
||||||
'mode' => 'wb',
|
|
||||||
'operation' => LOCK_EX,
|
|
||||||
],
|
|
||||||
self::FILE_APPEND => [
|
|
||||||
'mode' => 'ab',
|
|
||||||
'operation' => LOCK_EX,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Database name.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Config class.
|
|
||||||
*
|
|
||||||
* @var Config
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
* @param Config|null $config
|
|
||||||
*/
|
|
||||||
public function __construct(string $name, Config $config = null)
|
|
||||||
{
|
|
||||||
$this->setName($name);
|
|
||||||
|
|
||||||
if ($config) {
|
|
||||||
$this->setConfig($config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the database name.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getName(): string
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the database name.
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setName(string $name)
|
|
||||||
{
|
|
||||||
Validation::validateDatabaseName($name);
|
|
||||||
$this->name = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the config.
|
|
||||||
*
|
|
||||||
* @return Config
|
|
||||||
*/
|
|
||||||
public function getConfig(): Config
|
|
||||||
{
|
|
||||||
return $this->config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the config.
|
|
||||||
*
|
|
||||||
* @param Config $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Config $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the path to the database file.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getPath(): string
|
|
||||||
{
|
|
||||||
return $this->config->getDir() . $this->getName() . $this->config->getExt();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open the database file.
|
|
||||||
*
|
|
||||||
* @param int $mode
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*
|
|
||||||
* @return SplFileObject
|
|
||||||
*/
|
|
||||||
protected function openFile(int $mode): SplFileObject
|
|
||||||
{
|
|
||||||
$path = $this->getPath();
|
|
||||||
|
|
||||||
if (!is_file($path) && !@touch($path)) {
|
|
||||||
throw new Exception('Could not create file: ' . $path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_readable($path) || !is_writable($path)) {
|
|
||||||
throw new Exception('File does not have permission for read and write: ' . $path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->getConfig()->useGzip()) {
|
|
||||||
$path = 'compress.zlib://' . $path;
|
|
||||||
}
|
|
||||||
|
|
||||||
$res = $this->fileAccessMode[$mode];
|
|
||||||
$file = new SplFileObject($path, $res['mode']);
|
|
||||||
|
|
||||||
if ($mode === self::FILE_READ) {
|
|
||||||
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY | SplFileObject::READ_AHEAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->getConfig()->useGzip() && !$file->flock($res['operation'])) {
|
|
||||||
$file = null;
|
|
||||||
throw new Exception('Could not lock file: ' . $path);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open a temporary file.
|
|
||||||
*
|
|
||||||
* @return SplTempFileObject
|
|
||||||
*/
|
|
||||||
public function openTempFile(): SplTempFileObject
|
|
||||||
{
|
|
||||||
return new SplTempFileObject($this->getConfig()->getSwapMemoryLimit());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close the database file.
|
|
||||||
*
|
|
||||||
* @param SplFileObject $file
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
protected function closeFile(SplFileObject &$file)
|
|
||||||
{
|
|
||||||
if (!$this->getConfig()->useGzip() && !$file->flock(LOCK_UN)) {
|
|
||||||
$file = null;
|
|
||||||
throw new Exception('Could not unlock file');
|
|
||||||
}
|
|
||||||
|
|
||||||
$file = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read lines from the database file.
|
|
||||||
*
|
|
||||||
* @return \Generator
|
|
||||||
*/
|
|
||||||
public function readFromFile(): \Generator
|
|
||||||
{
|
|
||||||
$file = $this->openFile(static::FILE_READ);
|
|
||||||
|
|
||||||
try {
|
|
||||||
foreach ($file as $line) {
|
|
||||||
yield new Line($line);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
$this->closeFile($file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Append a line to the database file.
|
|
||||||
*
|
|
||||||
* @param string $line
|
|
||||||
*/
|
|
||||||
public function appendToFile(string $line)
|
|
||||||
{
|
|
||||||
$file = $this->openFile(static::FILE_APPEND);
|
|
||||||
$file->fwrite($line);
|
|
||||||
$this->closeFile($file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush the database file.
|
|
||||||
*/
|
|
||||||
public function flushFile()
|
|
||||||
{
|
|
||||||
$file = $this->openFile(static::FILE_WRITE);
|
|
||||||
$this->closeFile($file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write temporary file contents to database file.
|
|
||||||
*
|
|
||||||
* @param SplTempFileObject $tmpFile
|
|
||||||
*/
|
|
||||||
public function writeTempToFile(SplTempFileObject &$tmpFile)
|
|
||||||
{
|
|
||||||
$file = $this->openFile(static::FILE_WRITE);
|
|
||||||
|
|
||||||
foreach ($tmpFile as $line) {
|
|
||||||
$file->fwrite($line);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->closeFile($file);
|
|
||||||
$tmpFile = null;
|
|
||||||
}
|
|
||||||
}
|
|
7
core/vendor/flintstone/Exception.php
vendored
7
core/vendor/flintstone/Exception.php
vendored
@ -1,7 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
class Exception extends \Exception
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone\Formatter;
|
|
||||||
|
|
||||||
interface FormatterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Encode data into a string.
|
|
||||||
*
|
|
||||||
* @param mixed $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function encode($data): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a string into data.
|
|
||||||
*
|
|
||||||
* @param string $data
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function decode(string $data);
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone\Formatter;
|
|
||||||
|
|
||||||
use Flintstone\Exception;
|
|
||||||
|
|
||||||
class JsonFormatter implements FormatterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
private $assoc;
|
|
||||||
|
|
||||||
public function __construct(bool $assoc = true)
|
|
||||||
{
|
|
||||||
$this->assoc = $assoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function encode($data): string
|
|
||||||
{
|
|
||||||
$result = json_encode($data);
|
|
||||||
|
|
||||||
if (json_last_error() === JSON_ERROR_NONE) {
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception(json_last_error_msg());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function decode(string $data)
|
|
||||||
{
|
|
||||||
$result = json_decode($data, $this->assoc);
|
|
||||||
|
|
||||||
if (json_last_error() === JSON_ERROR_NONE) {
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception(json_last_error_msg());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone\Formatter;
|
|
||||||
|
|
||||||
class SerializeFormatter implements FormatterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function encode($data): string
|
|
||||||
{
|
|
||||||
return serialize($this->preserveLines($data, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function decode(string $data)
|
|
||||||
{
|
|
||||||
return $this->preserveLines(unserialize($data), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Preserve new lines, recursive function.
|
|
||||||
*
|
|
||||||
* @param mixed $data
|
|
||||||
* @param bool $reverse
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
protected function preserveLines($data, bool $reverse)
|
|
||||||
{
|
|
||||||
$search = ["\n", "\r"];
|
|
||||||
$replace = ['\\n', '\\r'];
|
|
||||||
|
|
||||||
if ($reverse) {
|
|
||||||
$search = ['\\n', '\\r'];
|
|
||||||
$replace = ["\n", "\r"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_string($data)) {
|
|
||||||
$data = str_replace($search, $replace, $data);
|
|
||||||
} elseif (is_array($data)) {
|
|
||||||
foreach ($data as &$value) {
|
|
||||||
$value = $this->preserveLines($value, $reverse);
|
|
||||||
}
|
|
||||||
unset($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
}
|
|
37
core/vendor/flintstone/Line.php
vendored
37
core/vendor/flintstone/Line.php
vendored
@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
class Line
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $line;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $pieces = [];
|
|
||||||
|
|
||||||
public function __construct(string $line)
|
|
||||||
{
|
|
||||||
$this->line = $line;
|
|
||||||
$this->pieces = explode('=', $line, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLine(): string
|
|
||||||
{
|
|
||||||
return $this->line;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getKey(): string
|
|
||||||
{
|
|
||||||
return $this->pieces[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getData(): string
|
|
||||||
{
|
|
||||||
return $this->pieces[1];
|
|
||||||
}
|
|
||||||
}
|
|
34
core/vendor/flintstone/Validation.php
vendored
34
core/vendor/flintstone/Validation.php
vendored
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
class Validation
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Validate the key.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function validateKey(string $key)
|
|
||||||
{
|
|
||||||
if (empty($key) || !preg_match('/^[\w-]+$/', $key)) {
|
|
||||||
throw new Exception('Invalid characters in key');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the database name is valid.
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function validateDatabaseName(string $name)
|
|
||||||
{
|
|
||||||
if (empty($name) || !preg_match('/^[\w-]+$/', $name)) {
|
|
||||||
throw new Exception('Invalid characters in database name');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
12
core/vendor/flintstone/autoload.php
vendored
12
core/vendor/flintstone/autoload.php
vendored
@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
require 'core/vendor/flintstone/Flintstone.php';
|
|
||||||
require 'core/vendor/flintstone/Config.php';
|
|
||||||
require 'core/vendor/flintstone/Database.php';
|
|
||||||
require 'core/vendor/flintstone/Line.php';
|
|
||||||
require 'core/vendor/flintstone/Validation.php';
|
|
||||||
require 'core/vendor/flintstone/Exception.php';
|
|
||||||
require 'core/vendor/flintstone/Formatter/FormatterInterface.php';
|
|
||||||
require 'core/vendor/flintstone/Formatter/JsonFormatter.php';
|
|
||||||
require 'core/vendor/flintstone/Formatter/SerializeFormatter.php';
|
|
||||||
require 'core/vendor/flintstone/Cache/CacheInterface.php';
|
|
||||||
require 'core/vendor/flintstone/Cache/ArrayCache.php';
|
|
285
core/vendor/flintstone/flintstone.php
vendored
285
core/vendor/flintstone/flintstone.php
vendored
@ -1,285 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Flintstone;
|
|
||||||
|
|
||||||
class Flintstone
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Flintstone version.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
const VERSION = '2.2';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Database class.
|
|
||||||
*
|
|
||||||
* @var Database
|
|
||||||
*/
|
|
||||||
protected $database;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Config class.
|
|
||||||
*
|
|
||||||
* @var Config
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param Database|string $database
|
|
||||||
* @param Config|array $config
|
|
||||||
*/
|
|
||||||
public function __construct($database, $config)
|
|
||||||
{
|
|
||||||
if (is_string($database)) {
|
|
||||||
$database = new Database($database);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_array($config)) {
|
|
||||||
$config = new Config($config);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->setDatabase($database);
|
|
||||||
$this->setConfig($config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the database.
|
|
||||||
*
|
|
||||||
* @return Database
|
|
||||||
*/
|
|
||||||
public function getDatabase(): Database
|
|
||||||
{
|
|
||||||
return $this->database;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the database.
|
|
||||||
*
|
|
||||||
* @param Database $database
|
|
||||||
*/
|
|
||||||
public function setDatabase(Database $database)
|
|
||||||
{
|
|
||||||
$this->database = $database;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the config.
|
|
||||||
*
|
|
||||||
* @return Config
|
|
||||||
*/
|
|
||||||
public function getConfig(): Config
|
|
||||||
{
|
|
||||||
return $this->config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the config.
|
|
||||||
*
|
|
||||||
* @param Config $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Config $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
$this->getDatabase()->setConfig($config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a key from the database.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function get(string $key)
|
|
||||||
{
|
|
||||||
Validation::validateKey($key);
|
|
||||||
|
|
||||||
// Fetch the key from cache
|
|
||||||
if ($cache = $this->getConfig()->getCache()) {
|
|
||||||
if ($cache->contains($key)) {
|
|
||||||
return $cache->get($key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch the key from database
|
|
||||||
$file = $this->getDatabase()->readFromFile();
|
|
||||||
$data = false;
|
|
||||||
|
|
||||||
foreach ($file as $line) {
|
|
||||||
/** @var Line $line */
|
|
||||||
if ($line->getKey() == $key) {
|
|
||||||
$data = $this->decodeData($line->getData());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the data to cache
|
|
||||||
if ($cache && $data !== false) {
|
|
||||||
$cache->set($key, $data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a key in the database.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $data
|
|
||||||
*/
|
|
||||||
public function set(string $key, $data)
|
|
||||||
{
|
|
||||||
Validation::validateKey($key);
|
|
||||||
|
|
||||||
// If the key already exists we need to replace it
|
|
||||||
if ($this->get($key) !== false) {
|
|
||||||
$this->replace($key, $data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the key to the database
|
|
||||||
$this->getDatabase()->appendToFile($this->getLineString($key, $data));
|
|
||||||
|
|
||||||
// Delete the key from cache
|
|
||||||
if ($cache = $this->getConfig()->getCache()) {
|
|
||||||
$cache->delete($key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a key from the database.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
*/
|
|
||||||
public function delete(string $key)
|
|
||||||
{
|
|
||||||
Validation::validateKey($key);
|
|
||||||
|
|
||||||
if ($this->get($key) !== false) {
|
|
||||||
$this->replace($key, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush the database.
|
|
||||||
*/
|
|
||||||
public function flush()
|
|
||||||
{
|
|
||||||
$this->getDatabase()->flushFile();
|
|
||||||
|
|
||||||
// Flush the cache
|
|
||||||
if ($cache = $this->getConfig()->getCache()) {
|
|
||||||
$cache->flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all keys from the database.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getKeys(): array
|
|
||||||
{
|
|
||||||
$keys = [];
|
|
||||||
$file = $this->getDatabase()->readFromFile();
|
|
||||||
|
|
||||||
foreach ($file as $line) {
|
|
||||||
/** @var Line $line */
|
|
||||||
$keys[] = $line->getKey();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all data from the database.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getAll(): array
|
|
||||||
{
|
|
||||||
$data = [];
|
|
||||||
$file = $this->getDatabase()->readFromFile();
|
|
||||||
|
|
||||||
foreach ($file as $line) {
|
|
||||||
/** @var Line $line */
|
|
||||||
$data[$line->getKey()] = $this->decodeData($line->getData());
|
|
||||||
}
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace a key in the database.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $data
|
|
||||||
*/
|
|
||||||
protected function replace(string $key, $data)
|
|
||||||
{
|
|
||||||
// Write a new database to a temporary file
|
|
||||||
$tmpFile = $this->getDatabase()->openTempFile();
|
|
||||||
$file = $this->getDatabase()->readFromFile();
|
|
||||||
|
|
||||||
foreach ($file as $line) {
|
|
||||||
/** @var Line $line */
|
|
||||||
if ($line->getKey() == $key) {
|
|
||||||
if ($data !== false) {
|
|
||||||
$tmpFile->fwrite($this->getLineString($key, $data));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$tmpFile->fwrite($line->getLine() . "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$tmpFile->rewind();
|
|
||||||
|
|
||||||
// Overwrite the database with the temporary file
|
|
||||||
$this->getDatabase()->writeTempToFile($tmpFile);
|
|
||||||
|
|
||||||
// Delete the key from cache
|
|
||||||
if ($cache = $this->getConfig()->getCache()) {
|
|
||||||
$cache->delete($key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the line string to write.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function getLineString(string $key, $data): string
|
|
||||||
{
|
|
||||||
return $key . '=' . $this->encodeData($data) . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a string into data.
|
|
||||||
*
|
|
||||||
* @param string $data
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
protected function decodeData(string $data)
|
|
||||||
{
|
|
||||||
return $this->getConfig()->getFormatter()->decode($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode data into a string.
|
|
||||||
*
|
|
||||||
* @param mixed $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function encodeData($data): string
|
|
||||||
{
|
|
||||||
return $this->getConfig()->getFormatter()->encode($data);
|
|
||||||
}
|
|
||||||
}
|
|
316
core/vendor/jsondb/Dot.php
vendored
Normal file
316
core/vendor/jsondb/Dot.php
vendored
Normal file
@ -0,0 +1,316 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Prowebcraft;
|
||||||
|
|
||||||
|
use ArrayAccess;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dot Notation
|
||||||
|
*
|
||||||
|
* This class provides dot notation access to arrays, so it's easy to handle
|
||||||
|
* multidimensional data in a clean way.
|
||||||
|
*/
|
||||||
|
class Dot implements ArrayAccess
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var array Data */
|
||||||
|
protected $data = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param array|null $data Data
|
||||||
|
*/
|
||||||
|
public function __construct(array $data = null)
|
||||||
|
{
|
||||||
|
if (is_array($data)) {
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get value of path, default value if path doesn't exist or all data
|
||||||
|
*
|
||||||
|
* @param array $array Source Array
|
||||||
|
* @param mixed|null $key Path
|
||||||
|
* @param mixed|null $default Default value
|
||||||
|
* @return mixed Value of path
|
||||||
|
*/
|
||||||
|
public static function getValue($array, $key, $default = null)
|
||||||
|
{
|
||||||
|
if (is_string($key)) {
|
||||||
|
// Iterate path
|
||||||
|
$keys = explode('.', $key);
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($array[$key])) {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
$array = &$array[$key];
|
||||||
|
}
|
||||||
|
// Get value
|
||||||
|
return $array;
|
||||||
|
} elseif (is_null($key)) {
|
||||||
|
// Get all data
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set value or array of values to path
|
||||||
|
*
|
||||||
|
* @param array $array Target array with data
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
*/
|
||||||
|
public static function setValue(&$array, $key, $value)
|
||||||
|
{
|
||||||
|
if (is_string($key)) {
|
||||||
|
// Iterate path
|
||||||
|
$keys = explode('.', $key);
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($array[$key]) || !is_array($array[$key])) {
|
||||||
|
$array[$key] = [];
|
||||||
|
}
|
||||||
|
$array = &$array[$key];
|
||||||
|
}
|
||||||
|
// Set value to path
|
||||||
|
$array = $value;
|
||||||
|
} elseif (is_array($key)) {
|
||||||
|
// Iterate array of paths and values
|
||||||
|
foreach ($key as $k => $v) {
|
||||||
|
self::setValue($array, $k, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add value or array of values to path
|
||||||
|
*
|
||||||
|
* @param array $array Target array with data
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
* @param boolean $pop Helper to pop out last key if value is an array
|
||||||
|
*/
|
||||||
|
public static function addValue(&$array, $key, $value = null, $pop = false)
|
||||||
|
{
|
||||||
|
if (is_string($key)) {
|
||||||
|
// Iterate path
|
||||||
|
$keys = explode('.', $key);
|
||||||
|
if ($pop === true) {
|
||||||
|
array_pop($keys);
|
||||||
|
}
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($array[$key]) || !is_array($array[$key])) {
|
||||||
|
$array[$key] = [];
|
||||||
|
}
|
||||||
|
$array = &$array[$key];
|
||||||
|
}
|
||||||
|
// Add value to path
|
||||||
|
$array[] = $value;
|
||||||
|
} elseif (is_array($key)) {
|
||||||
|
// Iterate array of paths and values
|
||||||
|
foreach ($key as $k => $v) {
|
||||||
|
self::addValue($array, $k, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete path or array of paths
|
||||||
|
*
|
||||||
|
* @param array $array Target array with data
|
||||||
|
* @param mixed $key Path or array of paths to delete
|
||||||
|
*/
|
||||||
|
public static function deleteValue(&$array, $key)
|
||||||
|
{
|
||||||
|
if (is_string($key)) {
|
||||||
|
// Iterate path
|
||||||
|
$keys = explode('.', $key);
|
||||||
|
$last = array_pop($keys);
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($array[$key])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$array = &$array[$key];
|
||||||
|
}
|
||||||
|
if (isset($array[$last])) {
|
||||||
|
// Detele path
|
||||||
|
unset($array[$last]);
|
||||||
|
}
|
||||||
|
} elseif (is_array($key)) {
|
||||||
|
// Iterate array of paths
|
||||||
|
foreach ($key as $k) {
|
||||||
|
self::delete($k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get value of path, default value if path doesn't exist or all data
|
||||||
|
*
|
||||||
|
* @param mixed|null $key Path
|
||||||
|
* @param mixed|null $default Default value
|
||||||
|
* @return mixed Value of path
|
||||||
|
*/
|
||||||
|
public function get($key = null, $default = null)
|
||||||
|
{
|
||||||
|
return self::getValue($this->data, $key, $default);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set value or array of values to path
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
*/
|
||||||
|
public function set($key, $value = null)
|
||||||
|
{
|
||||||
|
return self::setValue($this->data, $key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add value or array of values to path
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
* @param boolean $pop Helper to pop out last key if value is an array
|
||||||
|
*/
|
||||||
|
public function add($key, $value = null, $pop = false)
|
||||||
|
{
|
||||||
|
return self::addValue($this->data, $key, $value, $pop);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if path exists
|
||||||
|
*
|
||||||
|
* @param string $key Path
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function has($key)
|
||||||
|
{
|
||||||
|
$keys = explode('.', (string)$key);
|
||||||
|
$data = &$this->data;
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($data[$key])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$data = &$data[$key];
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete path or array of paths
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths to delete
|
||||||
|
*/
|
||||||
|
public function delete($key)
|
||||||
|
{
|
||||||
|
return self::deleteValue($this->data, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all data, data from path or array of paths and
|
||||||
|
* optionally format path if it doesn't exist
|
||||||
|
*
|
||||||
|
* @param mixed|null $key Path or array of paths to clean
|
||||||
|
* @param boolean $format Format option
|
||||||
|
*/
|
||||||
|
public function clear($key = null, $format = false)
|
||||||
|
{
|
||||||
|
if (is_string($key)) {
|
||||||
|
// Iterate path
|
||||||
|
$keys = explode('.', $key);
|
||||||
|
$data = &$this->data;
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (!isset($data[$key]) || !is_array($data[$key])) {
|
||||||
|
if ($format === true) {
|
||||||
|
$data[$key] = [];
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$data = &$data[$key];
|
||||||
|
}
|
||||||
|
// Clear path
|
||||||
|
$data = [];
|
||||||
|
} elseif (is_array($key)) {
|
||||||
|
// Iterate array
|
||||||
|
foreach ($key as $k) {
|
||||||
|
$this->clear($k, $format);
|
||||||
|
}
|
||||||
|
} elseif (is_null($key)) {
|
||||||
|
// Clear all data
|
||||||
|
$this->data = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set data
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function setData(array $data)
|
||||||
|
{
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set data as a reference
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function setDataAsRef(array &$data)
|
||||||
|
{
|
||||||
|
$this->data = &$data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ArrayAccess abstract methods
|
||||||
|
*/
|
||||||
|
public function offsetSet($offset, $value)
|
||||||
|
{
|
||||||
|
$this->set($offset, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetExists($offset)
|
||||||
|
{
|
||||||
|
return $this->has($offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetGet($offset)
|
||||||
|
{
|
||||||
|
return $this->get($offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetUnset($offset)
|
||||||
|
{
|
||||||
|
$this->delete($offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Magic methods
|
||||||
|
*/
|
||||||
|
public function __set($key, $value = null)
|
||||||
|
{
|
||||||
|
$this->set($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __get($key)
|
||||||
|
{
|
||||||
|
return $this->get($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __isset($key)
|
||||||
|
{
|
||||||
|
return $this->has($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __unset($key)
|
||||||
|
{
|
||||||
|
$this->delete($key);
|
||||||
|
}
|
||||||
|
}
|
138
core/vendor/jsondb/JsonDb.php
vendored
Normal file
138
core/vendor/jsondb/JsonDb.php
vendored
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: Andrey Mistulov
|
||||||
|
* Company: Aristos
|
||||||
|
* Date: 14.03.2017
|
||||||
|
* Time: 15:25
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Prowebcraft;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Data
|
||||||
|
* @package Aristos
|
||||||
|
*/
|
||||||
|
class JsonDb extends \Prowebcraft\Dot
|
||||||
|
{
|
||||||
|
protected $db = '';
|
||||||
|
protected $data = null;
|
||||||
|
protected $config = [];
|
||||||
|
|
||||||
|
public function __construct($config = [])
|
||||||
|
{
|
||||||
|
$this->config = array_merge([
|
||||||
|
'name' => 'data.json',
|
||||||
|
'backup' => 5,
|
||||||
|
'dir' => getcwd(),
|
||||||
|
'template' => getcwd() . DIRECTORY_SEPARATOR . 'data.template.json'
|
||||||
|
], $config);
|
||||||
|
$this->loadData();
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set value or array of values to path
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
* @param bool $save Сохранить данные в базу
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function set($key, $value = null, $save = true)
|
||||||
|
{
|
||||||
|
parent::set($key, $value);
|
||||||
|
if ($save) $this->save();
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add value or array of values to path
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths and values
|
||||||
|
* @param mixed|null $value Value to set if path is not an array
|
||||||
|
* @param boolean $pop Helper to pop out last key if value is an array
|
||||||
|
* @param bool $save Сохранить данные в базу
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function add($key, $value = null, $pop = false, $save = true)
|
||||||
|
{
|
||||||
|
parent::add($key, $value, $pop);
|
||||||
|
if ($save) $this->save();
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete path or array of paths
|
||||||
|
*
|
||||||
|
* @param mixed $key Path or array of paths to delete
|
||||||
|
* @param bool $save Сохранить данные в базу
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function delete($key, $save = true)
|
||||||
|
{
|
||||||
|
parent::delete($key);
|
||||||
|
if ($save) $this->save();
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all data, data from path or array of paths and
|
||||||
|
* optionally format path if it doesn't exist
|
||||||
|
*
|
||||||
|
* @param mixed|null $key Path or array of paths to clean
|
||||||
|
* @param boolean $format Format option
|
||||||
|
* @param bool $save Сохранить данные в базу
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function clear($key = null, $format = false, $save = true)
|
||||||
|
{
|
||||||
|
parent::clear($key, $format);
|
||||||
|
if ($save) $this->save();
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Загрузка локальной базы данных
|
||||||
|
* @param bool $reload
|
||||||
|
* Перезагрузить данные?
|
||||||
|
* @return array|mixed|null
|
||||||
|
*/
|
||||||
|
protected function loadData($reload = false) {
|
||||||
|
if ($this->data === null || $reload) {
|
||||||
|
$this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'];
|
||||||
|
if (!file_exists($this->db)) {
|
||||||
|
$templateFile = $this->config['template'];
|
||||||
|
if (file_exists($templateFile)) {
|
||||||
|
copy($templateFile, $this->db);
|
||||||
|
} else {
|
||||||
|
file_put_contents($this->db, '{}');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($this->config['backup']) {
|
||||||
|
try {
|
||||||
|
//todo make backup of database
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->data = json_decode(file_get_contents($this->db), true);
|
||||||
|
if (!$this->data === null) {
|
||||||
|
throw new \InvalidArgumentException('Database file ' . $this->db
|
||||||
|
. ' contains invalid json object. Please validate or remove file');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сохранение в локальную базу
|
||||||
|
*/
|
||||||
|
public function save() {
|
||||||
|
file_put_contents($this->db, json_encode($this->data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -8,6 +8,8 @@
|
|||||||
*
|
*
|
||||||
* @author Rémi Jean <remi.jean@outlook.com>
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2018-2019, Frédéric Tempez
|
||||||
* @license GNU General Public License, version 3
|
* @license GNU General Public License, version 3
|
||||||
* @link http://zwiicms.com/
|
* @link http://zwiicms.com/
|
||||||
*/
|
*/
|
||||||
@ -15,8 +17,8 @@
|
|||||||
/**
|
/**
|
||||||
* Vérification de la version de PHP
|
* Vérification de la version de PHP
|
||||||
*/
|
*/
|
||||||
if(version_compare(PHP_VERSION, '7.0.0', '<')) {
|
if(version_compare(PHP_VERSION, '5.6.0', '<')) {
|
||||||
exit('PHP 7.0+ required.');
|
exit('PHP 5.6+ required.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set locale to French */
|
/* Set locale to French */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user