| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <?php
- /*
- Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
- This file is part of the Fat-Free Framework (http://fatfreeframework.com).
- This 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 later.
- Fat-Free Framework 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 Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
- */
- namespace DB;
- //! In-memory/flat-file DB wrapper
- class Jig {
- //@{ Storage formats
- const
- FORMAT_JSON=0,
- FORMAT_Serialized=1;
- //@}
- protected
- //! UUID
- $uuid,
- //! Storage location
- $dir,
- //! Current storage format
- $format,
- //! Jig log
- $log,
- //! Memory-held data
- $data,
- //! lazy load/save files
- $lazy;
- /**
- * Read data from memory/file
- * @return array
- * @param $file string
- **/
- function &read($file) {
- if (!$this->dir || !is_file($dst=$this->dir.$file)) {
- if (!isset($this->data[$file]))
- $this->data[$file]=[];
- return $this->data[$file];
- }
- if ($this->lazy && isset($this->data[$file]))
- return $this->data[$file];
- $fw=\Base::instance();
- $raw=$fw->read($dst);
- switch ($this->format) {
- case self::FORMAT_JSON:
- $data=json_decode($raw,TRUE);
- break;
- case self::FORMAT_Serialized:
- $data=$fw->unserialize($raw);
- break;
- }
- $this->data[$file] = $data;
- return $this->data[$file];
- }
- /**
- * Write data to memory/file
- * @return int
- * @param $file string
- * @param $data array
- **/
- function write($file,array $data=NULL) {
- if (!$this->dir || $this->lazy)
- return count($this->data[$file]=$data);
- $fw=\Base::instance();
- switch ($this->format) {
- case self::FORMAT_JSON:
- $out=json_encode($data,JSON_PRETTY_PRINT);
- break;
- case self::FORMAT_Serialized:
- $out=$fw->serialize($data);
- break;
- }
- return $fw->write($this->dir.$file,$out);
- }
- /**
- * Return directory
- * @return string
- **/
- function dir() {
- return $this->dir;
- }
- /**
- * Return UUID
- * @return string
- **/
- function uuid() {
- return $this->uuid;
- }
- /**
- * Return profiler results (or disable logging)
- * @param $flag bool
- * @return string
- **/
- function log($flag=TRUE) {
- if ($flag)
- return $this->log;
- $this->log=FALSE;
- }
- /**
- * Jot down log entry
- * @return NULL
- * @param $frame string
- **/
- function jot($frame) {
- if ($frame)
- $this->log.=date('r').' '.$frame.PHP_EOL;
- }
- /**
- * Clean storage
- * @return NULL
- **/
- function drop() {
- if ($this->lazy) // intentional
- $this->data=[];
- if (!$this->dir)
- $this->data=[];
- elseif ($glob=@glob($this->dir.'/*',GLOB_NOSORT))
- foreach ($glob as $file)
- @unlink($file);
- }
- //! Prohibit cloning
- private function __clone() {
- }
- /**
- * Instantiate class
- * @param $dir string
- * @param $format int
- **/
- function __construct($dir=NULL,$format=self::FORMAT_JSON,$lazy=FALSE) {
- if ($dir && !is_dir($dir))
- mkdir($dir,\Base::MODE,TRUE);
- $this->uuid=\Base::instance()->hash($this->dir=$dir);
- $this->format=$format;
- $this->lazy=$lazy;
- }
- /**
- * save file on destruction
- **/
- function __destruct() {
- if ($this->lazy) {
- $this->lazy = FALSE;
- foreach ($this->data?:[] as $file => $data)
- $this->write($file,$data);
- }
- }
- }
|