* This program 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.
 * 
 * This program 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 this program.  If not, see . */
/**
 * Object-Cache
 * @author f0o 
 * @copyright 2015 f0o, LibreNMS
 * @license GPL
 * @package LibreNMS
 * @subpackage Cache
 */
class ObjCache implements ArrayAccess {
	private $data = array();
	private $obj  = "";
	/**
	 * Initialize ObjCache
	 * @param string $obj Name of Object
	 * @return void
	 */
	public function __construct( $obj ) {
		global $config;
		$this->obj = $obj;
		if( isset($GLOBALS['_ObjCache'][$obj]) ) {
			$this->data = $GLOBALS['_ObjCacheSkell'][$obj];
		} else {
			if( !is_array($GLOBALS['_ObjCacheSkell']) ) {
				$GLOBALS['_ObjCacheSkell'] = array();
			}
			if( !is_array($GLOBALS['_ObjCache']) ) {
				$GLOBALS['_ObjCache'] = array();
			}
			if( file_exists($config['install_dir'].'/includes/caches/'.$obj.'.inc.php') ) {
				$data = array();
				include($config['install_dir'].'/includes/caches/'.$obj.'.inc.php');
				$this->data = $data;
				$GLOBALS['_ObjCacheSkell'][$obj] = $this->data;
				if( !is_array($GLOBALS['_ObjCache'][$obj]) ) {
					$GLOBALS['_ObjCache'][$obj] = $this->data;
				}
			}
		}
	}
	/**
	 * Check if data exists
	 * @param string $obj Name of Data-Object
	 * @return boolean
	 */
	public function offsetExists( $obj ) {
		if( isset($this->data[$obj]) ) {
			return true;
		}
		return false;
	}
	/**
	 * Get Data-Object
	 * @param string $obj Name of Data-Object
	 * @return mixed
	 */
	public function offsetGet( $obj ) {
		if( isset($this->data[$obj]) ) {
			if( isset($this->data[$obj]['value']) ) {
				return $this->data[$obj]['value'];
			} elseif( isset($GLOBALS['_ObjCache'][$this->obj][$obj]['value']) ) {
				return $GLOBALS['_ObjCache'][$this->obj][$obj]['value'];
			} else {
				$GLOBALS['_ObjCache'][$this->obj][$obj]['value'] = dbFetchCell($this->data[$obj]['query'],$this->data[$obj]['params']);
				return $GLOBALS['_ObjCache'][$this->obj][$obj]['value'];
			}
		}
	}
	/**
	 * Overrides internal Cache-Object
	 * @param string $obj Name of Data-Object
	 * @param mixed $value Value
	 * @return boolean
	 */
	public function offsetSet( $obj, $value ) {
		if( !is_array($this->data[$obj]) ) {
			$this->data[$obj] = array();
		}
		$this->data[$obj]['value'] = $value;
		return $this->data[$obj]['value'];
	}
	/**
	 * Reset Data-Object
	 * @param string $obj Name of Data-Object
	 * @return mixed
	 */
	public function offsetUnset( $obj ) {
		unset($this->data[$obj]['value']);
		return true;
	}
}