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); ?>