All pastes #67097 Raw Edit

Something

public php v1 · immutable
#67097 ·published 2006-06-19 09:26 UTC
rendered paste body
<?php/** * Sayume logger class * * Class that is responsible for querying the log files.  All selects, * inserts, deletes, and creating new log files goes through this * class. * * @author	Sean Hickey */class SayLogger {	/**	 * The directory the log files are stored in.	 * @var	string	 */	var $logDir;		/**	 * The name of the log file to query	 * @var	string	 */	var $log;		/**	 * The full path and name of the log file	 * to query.	 * @var	string	 */	var $logFile;		/**	 * The full path and name of the log description	 * file that's being queried.	 * @var	string	 */	var $logDescFile;		/**	 * Array that comes from the log description	 * file, that expresses the column layout of	 * the log file.	 * @var	array	 */	var $logDesc = array();		/**	 * Set to TRUE if a method produced an error.	 * @var	bool	 */	var $error = false;		var $ASC = true;	var $DESC = false;		/**	 * Class constructor	 *	 * @param	string	$logDir	The directory where the log files are stored	 * @param	string	$log		The name of the log file	 * @return	void	 */	function SayLogger($logDir, $log) {		$this->logDir = $logDir;		$this->log = $log;		$this->logFile = $logDir . '/' . $log . '.slog';		$this->logDescFile = $logDir . '/' . $log . '.sdes';		if (!file_exists($this->logFile) || !file_exists($this->logDescFile)) {			$this->error = true;		}		if (!$this->parseDesc()) {			$this->error = true;		}	}	/**	 * Parses a log description file into an array	 *	 * The log description file contains information about the name of the	 * columns in the log file, any extra instructions for the column such	 * as auto_increment, and the next auto_increment value.	 *	 * Returns TRUE if the log description file was successfully parsed, FALSE	 * if there was an error.	 *	 * @return	bool	 */	function parseDesc() {		$contents = file_get_contents($this->logDescFile);		if (empty($contents)) {			return false;		}		$this->logDesc = unserialize($contents);		return true;	}		/**	 * Writes log file description to description file	 *	 * Takes the log file description array, and any changes made to it, and	 * writes it back to the log description file.	 *	 * Returns TRUE if the data was successfully written to the log description	 * file, or FALSE if there was an error.	 *	 * @return	bool	 */	function writeDesc() {		$contents = serialize($this->logDesc);		if (!file_exists($this->logDescFile)) {			return false;		}		if (!$handler = @fopen($this->logDescFile, 'w')) {			return false;		}		$result = @fwrite($handler, $contents);		@fclose($handler);		return $result;	}		/**	 * Selects rows from the log file	 *	 * @return	obj	 */	function select($what) {		$columns = explode(',', $what);		$handle = fopen($this->logFile, "r");		$rows = array();		while (($data = fgetcsv($handle)) !== false) {			$nData = array();			for ($i = 0; $i < count($data); $i++) {				$nData[$this->logDesc[$i]['name']] = $data[$i];			}			$yData = array();			foreach ($nData as $key => $value) {				if (in_array($key, $columns)) {					$yData[$key] = $value;				}			}			$rows[] = $yData;		}				$results = & new SayResults($rows, $this->logDesc);		return $results;	}	function insert() {		$args = func_get_args();		$contents = '';		for ($i = 0; $i < count($args); $i++) {			if ($args[$i] == null) {							if ($this->logDesc[$i]['type'] == 'int') {									if ($this->logDesc[$i]['extra'] == 'auto_increment') {						$args[$i] = $this->logDesc[$i]['val'];						$this->logDesc[$i]['val']++;					} else {						$args[$i] = 0;					}									} else if ($this->logDesc[$i]['type'] == 'date') {					$args[$i] = time();				}			}					$args[$i] = str_replace('"', '\\"', $args[$i]);			$contents .= '"' . $args[$i] . '"';			if ($i < (count($args) - 1)) {				$contents .= ',';			}		}				$this->writeDesc();		if (!$handler = @fopen($this->logFile, 'a')) {			return false;		}				$result = @fwrite($handler, $contents . "\r\n");		@fclose($handler);		return $result;	}	function delete($what) {		}		function create($logDir, $name, $column) {		if (!is_object($column)) {			return false;		}		$columns = $column->getDesc();		$results = $column->getResults();		$logDesc = serialize($columns);		if (!is_writable($logDir)) {			return false;		}				if (!$handler = @fopen($logDir . '/' . $name . '.sdes', 'w')) {			return false;		}				$result = @fwrite($handler, $logDesc);		@fclose($handler);		if (!$result) {			return false;		}				if (!$handler = @fopen($logDir . '/' . $name . '.slog', 'w')) {			return false;		}				$result = @fwrite($handler, $results . "\r\n");		@fclose($handler);		return $result;	}		function getDesc() {		return $this->logDesc;	}}/** * Sayume logger results class * * Stores the results from each query to the log files. * * @author	Sean Hickey */class SayResults {	var $resultData;	var $tempResults;	var $logDesc;		var $skey = false;	var $sarray = false;	var $sasc = true;   	function SayResults($resultData, $logDesc) {		$this->resultData = $resultData;		$this->logDesc = $logDesc;	}		function get() {		return $this->resultData;	}		function eq($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] == $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function neq($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] != $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function lt($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] < $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}	function lteq($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] <= $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function gt($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] > $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function gteq($what, $val) {		$nData = array();		foreach ($this->resultData as $data) {			if ($data[$what] >= $val) {				$nData[] = $data;			}		}				$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function distinct($what) {		$nArray = $this->resultData;				foreach ($nArray as $sub) {			$cmp[] = $sub[$what];		}		$unique = array_unique($cmp);		foreach ($unique as $k => $rien) {			$new[] = $nArray[$k];		}				$results = & new SayResults($new, $this->logDesc);		return $results;	}		function orderby($what, $order) {		$this->skey = $what;		$this->sasc = $order;		$this->tempResults = $this->resultData;		uksort($this->tempResults, array(&$this, "_as_cmp"));				$results = & new SayResults($this->tempResults, $this->logDesc);		return $results;	}		function limit($what) {		$nData = array();		$nData = array_slice($this->resultData, 0, $what);		$results = & new SayResults($nData, $this->logDesc);		return $results;	}		function _as_cmp($a, $b) {		//since uksort will pass here only indexes get real values from our array		if (!is_array($a) && !is_array($b)) {			$a = $this->tempResults[$a][$this->skey];			$b = $this->tempResults[$b][$this->skey];		}		//if string - use string comparision		if (!ctype_digit($a) && !ctype_digit($b)) {			if ($this->sasc) {				return strcasecmp($a, $b);			} else {				return strcasecmp($b, $a);			}		} else {			if (intval($a) == intval($b)) {				return 0;			}			if ($this->sasc) {				return (intval($a) > intval($b)) ? -1 : 1;			} else {				return (intval($a) > intval($b)) ? 1 : -1;			}		}	}		function getDesc() {		return $this->logDesc;	}		function getResults() {		return $this->flattenResults();	}		function flattenResults() {		$contents = '';		foreach ($this->resultData as $data) {			$nData = array();			foreach ($data as $d) {				$nData[] = '"' . str_replace('"', '\\"', $d) . '"';			}						$contents .= join(',', $nData) . "\r\n";		}				return $contents;	}}class SayColumn {	var $columns;		function add($name, $type, $extra = '', $val = '') {		$types = array('int', 'str', 'date');		if (!in_array($type, $types)) {			return false;		}		if ($extra == 'auto_increment' && $val == '') {			$val = 1;		}				$this->columns[] = array('name' => $name, 'type' => $type, 'extra' => $extra, 'val' => $val);		return true;	}		function getDesc() {		return $this->columns;	}		function getResults() {		return '';	}}$sl = new SayLogger('logs', 'main');//$sl->insert(null, '127.0.0.3', 'http://www.yahoo.com', time(), 'Non-Geeks');$rows = $sl->select('id,ip,referrer,timestamp,page');$vars = $rows->eq('ip', '127.0.0.1')->get();print_r($vars);?>