You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							175 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							175 lines
						
					
					
						
							3.5 KiB
						
					
					
				| <?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); | |
| 		} | |
| 	} | |
| 
 | |
| }
 | |
| 
 |