first commit
This commit is contained in:
@ -0,0 +1,595 @@
|
||||
<?php
|
||||
/**
|
||||
* $Id: JSON.php 40 2007-06-18 11:43:15Z spocke $
|
||||
*
|
||||
* @package MCManager.utils
|
||||
* @author Moxiecode
|
||||
* @copyright Copyright <20> 2007, Moxiecode Systems AB, All rights reserved.
|
||||
*/
|
||||
|
||||
define('JSON_BOOL', 1);
|
||||
define('JSON_INT', 2);
|
||||
define('JSON_STR', 3);
|
||||
define('JSON_FLOAT', 4);
|
||||
define('JSON_NULL', 5);
|
||||
define('JSON_START_OBJ', 6);
|
||||
define('JSON_END_OBJ', 7);
|
||||
define('JSON_START_ARRAY', 8);
|
||||
define('JSON_END_ARRAY', 9);
|
||||
define('JSON_KEY', 10);
|
||||
define('JSON_SKIP', 11);
|
||||
|
||||
define('JSON_IN_ARRAY', 30);
|
||||
define('JSON_IN_OBJECT', 40);
|
||||
define('JSON_IN_BETWEEN', 50);
|
||||
|
||||
class Moxiecode_JSONReader {
|
||||
var $_data, $_len, $_pos;
|
||||
var $_value, $_token;
|
||||
var $_location, $_lastLocations;
|
||||
var $_needProp;
|
||||
|
||||
function Moxiecode_JSONReader($data) {
|
||||
$this->_data = $data;
|
||||
$this->_len = strlen($data);
|
||||
$this->_pos = -1;
|
||||
$this->_location = JSON_IN_BETWEEN;
|
||||
$this->_lastLocations = array();
|
||||
$this->_needProp = false;
|
||||
}
|
||||
|
||||
function getToken() {
|
||||
return $this->_token;
|
||||
}
|
||||
|
||||
function getLocation() {
|
||||
return $this->_location;
|
||||
}
|
||||
|
||||
function getTokenName() {
|
||||
switch ($this->_token) {
|
||||
case JSON_BOOL:
|
||||
return 'JSON_BOOL';
|
||||
|
||||
case JSON_INT:
|
||||
return 'JSON_INT';
|
||||
|
||||
case JSON_STR:
|
||||
return 'JSON_STR';
|
||||
|
||||
case JSON_FLOAT:
|
||||
return 'JSON_FLOAT';
|
||||
|
||||
case JSON_NULL:
|
||||
return 'JSON_NULL';
|
||||
|
||||
case JSON_START_OBJ:
|
||||
return 'JSON_START_OBJ';
|
||||
|
||||
case JSON_END_OBJ:
|
||||
return 'JSON_END_OBJ';
|
||||
|
||||
case JSON_START_ARRAY:
|
||||
return 'JSON_START_ARRAY';
|
||||
|
||||
case JSON_END_ARRAY:
|
||||
return 'JSON_END_ARRAY';
|
||||
|
||||
case JSON_KEY:
|
||||
return 'JSON_KEY';
|
||||
}
|
||||
|
||||
return 'UNKNOWN';
|
||||
}
|
||||
|
||||
function getValue() {
|
||||
return $this->_value;
|
||||
}
|
||||
|
||||
function readToken() {
|
||||
$chr = $this->read();
|
||||
|
||||
if ($chr != null) {
|
||||
switch ($chr) {
|
||||
case '[':
|
||||
$this->_lastLocation[] = $this->_location;
|
||||
$this->_location = JSON_IN_ARRAY;
|
||||
$this->_token = JSON_START_ARRAY;
|
||||
$this->_value = null;
|
||||
$this->readAway();
|
||||
return true;
|
||||
|
||||
case ']':
|
||||
$this->_location = array_pop($this->_lastLocation);
|
||||
$this->_token = JSON_END_ARRAY;
|
||||
$this->_value = null;
|
||||
$this->readAway();
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
|
||||
case '{':
|
||||
$this->_lastLocation[] = $this->_location;
|
||||
$this->_location = JSON_IN_OBJECT;
|
||||
$this->_needProp = true;
|
||||
$this->_token = JSON_START_OBJ;
|
||||
$this->_value = null;
|
||||
$this->readAway();
|
||||
return true;
|
||||
|
||||
case '}':
|
||||
$this->_location = array_pop($this->_lastLocation);
|
||||
$this->_token = JSON_END_OBJ;
|
||||
$this->_value = null;
|
||||
$this->readAway();
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
|
||||
// String
|
||||
case '"':
|
||||
case '\'':
|
||||
return $this->_readString($chr);
|
||||
|
||||
// Null
|
||||
case 'n':
|
||||
return $this->_readNull();
|
||||
|
||||
// Bool
|
||||
case 't':
|
||||
case 'f':
|
||||
return $this->_readBool($chr);
|
||||
|
||||
default:
|
||||
// Is number
|
||||
if (is_numeric($chr) || $chr == '-' || $chr == '.')
|
||||
return $this->_readNumber($chr);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function _readBool($chr) {
|
||||
$this->_token = JSON_BOOL;
|
||||
$this->_value = $chr == 't';
|
||||
|
||||
if ($chr == 't')
|
||||
$this->skip(3); // rue
|
||||
else
|
||||
$this->skip(4); // alse
|
||||
|
||||
$this->readAway();
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function _readNull() {
|
||||
$this->_token = JSON_NULL;
|
||||
$this->_value = null;
|
||||
|
||||
$this->skip(3); // ull
|
||||
$this->readAway();
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function _readString($quote) {
|
||||
$output = "";
|
||||
$this->_token = JSON_STR;
|
||||
$endString = false;
|
||||
|
||||
while (($chr = $this->peek()) != -1) {
|
||||
switch ($chr) {
|
||||
case '\\':
|
||||
// Read away slash
|
||||
$this->read();
|
||||
|
||||
// Read escape code
|
||||
$chr = $this->read();
|
||||
switch ($chr) {
|
||||
case 't':
|
||||
$output .= "\t";
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
$output .= "\b";
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
$output .= "\f";
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
$output .= "\r";
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
$output .= "\n";
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
$output .= $this->_int2utf8(hexdec($this->read(4)));
|
||||
break;
|
||||
|
||||
default:
|
||||
$output .= $chr;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
case '"':
|
||||
if ($chr == $quote)
|
||||
$endString = true;
|
||||
|
||||
$chr = $this->read();
|
||||
if ($chr != -1 && $chr != $quote)
|
||||
$output .= $chr;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
$output .= $this->read();
|
||||
}
|
||||
|
||||
// String terminated
|
||||
if ($endString)
|
||||
break;
|
||||
}
|
||||
|
||||
$this->readAway();
|
||||
$this->_value = $output;
|
||||
|
||||
// Needed a property
|
||||
if ($this->_needProp) {
|
||||
$this->_token = JSON_KEY;
|
||||
$this->_needProp = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function _int2utf8($int) {
|
||||
$int = intval($int);
|
||||
|
||||
switch ($int) {
|
||||
case 0:
|
||||
return chr(0);
|
||||
|
||||
case ($int & 0x7F):
|
||||
return chr($int);
|
||||
|
||||
case ($int & 0x7FF):
|
||||
return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F));
|
||||
|
||||
case ($int & 0xFFFF):
|
||||
return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F));
|
||||
|
||||
case ($int & 0x1FFFFF):
|
||||
return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F));
|
||||
}
|
||||
}
|
||||
|
||||
function _readNumber($start) {
|
||||
$value = "";
|
||||
$isFloat = false;
|
||||
|
||||
$this->_token = JSON_INT;
|
||||
$value .= $start;
|
||||
|
||||
while (($chr = $this->peek()) != -1) {
|
||||
if (is_numeric($chr) || $chr == '-' || $chr == '.') {
|
||||
if ($chr == '.')
|
||||
$isFloat = true;
|
||||
|
||||
$value .= $this->read();
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
$this->readAway();
|
||||
|
||||
if ($isFloat) {
|
||||
$this->_token = JSON_FLOAT;
|
||||
$this->_value = floatval($value);
|
||||
} else
|
||||
$this->_value = intval($value);
|
||||
|
||||
if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
|
||||
$this->_needProp = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function readAway() {
|
||||
while (($chr = $this->peek()) != null) {
|
||||
if ($chr != ':' && $chr != ',' && $chr != ' ')
|
||||
return;
|
||||
|
||||
$this->read();
|
||||
}
|
||||
}
|
||||
|
||||
function read($len = 1) {
|
||||
if ($this->_pos < $this->_len) {
|
||||
if ($len > 1) {
|
||||
$str = substr($this->_data, $this->_pos + 1, $len);
|
||||
$this->_pos += $len;
|
||||
|
||||
return $str;
|
||||
} else
|
||||
return $this->_data[++$this->_pos];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function skip($len) {
|
||||
$this->_pos += $len;
|
||||
}
|
||||
|
||||
function peek() {
|
||||
if ($this->_pos < $this->_len)
|
||||
return $this->_data[$this->_pos + 1];
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class handles JSON stuff.
|
||||
*
|
||||
* @package MCManager.utils
|
||||
*/
|
||||
class Moxiecode_JSON {
|
||||
function Moxiecode_JSON() {
|
||||
}
|
||||
|
||||
function decode($input) {
|
||||
$reader = new Moxiecode_JSONReader($input);
|
||||
|
||||
return $this->readValue($reader);
|
||||
}
|
||||
|
||||
function readValue(&$reader) {
|
||||
$this->data = array();
|
||||
$this->parents = array();
|
||||
$this->cur =& $this->data;
|
||||
$key = null;
|
||||
$loc = JSON_IN_ARRAY;
|
||||
|
||||
while ($reader->readToken()) {
|
||||
switch ($reader->getToken()) {
|
||||
case JSON_STR:
|
||||
case JSON_INT:
|
||||
case JSON_BOOL:
|
||||
case JSON_FLOAT:
|
||||
case JSON_NULL:
|
||||
switch ($reader->getLocation()) {
|
||||
case JSON_IN_OBJECT:
|
||||
$this->cur[$key] = $reader->getValue();
|
||||
break;
|
||||
|
||||
case JSON_IN_ARRAY:
|
||||
$this->cur[] = $reader->getValue();
|
||||
break;
|
||||
|
||||
default:
|
||||
return $reader->getValue();
|
||||
}
|
||||
break;
|
||||
|
||||
case JSON_KEY:
|
||||
$key = $reader->getValue();
|
||||
break;
|
||||
|
||||
case JSON_START_OBJ:
|
||||
case JSON_START_ARRAY:
|
||||
if ($loc == JSON_IN_OBJECT)
|
||||
$this->addArray($key);
|
||||
else
|
||||
$this->addArray(null);
|
||||
|
||||
$cur =& $obj;
|
||||
|
||||
$loc = $reader->getLocation();
|
||||
break;
|
||||
|
||||
case JSON_END_OBJ:
|
||||
case JSON_END_ARRAY:
|
||||
$loc = $reader->getLocation();
|
||||
|
||||
if (count($this->parents) > 0) {
|
||||
$this->cur =& $this->parents[count($this->parents) - 1];
|
||||
array_pop($this->parents);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->data[0];
|
||||
}
|
||||
|
||||
// This method was needed since PHP is crapy and doesn't have pointers/references
|
||||
function addArray($key) {
|
||||
$this->parents[] =& $this->cur;
|
||||
$ar = array();
|
||||
|
||||
if ($key)
|
||||
$this->cur[$key] =& $ar;
|
||||
else
|
||||
$this->cur[] =& $ar;
|
||||
|
||||
$this->cur =& $ar;
|
||||
}
|
||||
|
||||
function getDelim($index, &$reader) {
|
||||
switch ($reader->getLocation()) {
|
||||
case JSON_IN_ARRAY:
|
||||
case JSON_IN_OBJECT:
|
||||
if ($index > 0)
|
||||
return ",";
|
||||
break;
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
function encode($input) {
|
||||
switch (gettype($input)) {
|
||||
case 'boolean':
|
||||
return $input ? 'true' : 'false';
|
||||
|
||||
case 'integer':
|
||||
return (int) $input;
|
||||
|
||||
case 'float':
|
||||
case 'double':
|
||||
return (float) $input;
|
||||
|
||||
case 'NULL':
|
||||
return 'null';
|
||||
|
||||
case 'string':
|
||||
return $this->encodeString($input);
|
||||
|
||||
case 'array':
|
||||
return $this->_encodeArray($input);
|
||||
|
||||
case 'object':
|
||||
return $this->_encodeArray(get_object_vars($input));
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
function encodeString($input) {
|
||||
// Needs to be escaped
|
||||
if (preg_match('/[^a-zA-Z0-9]/', $input)) {
|
||||
$output = '';
|
||||
|
||||
for ($i=0; $i<strlen($input); $i++) {
|
||||
switch ($input[$i]) {
|
||||
case "\b":
|
||||
$output .= "\\b";
|
||||
break;
|
||||
|
||||
case "\t":
|
||||
$output .= "\\t";
|
||||
break;
|
||||
|
||||
case "\f":
|
||||
$output .= "\\f";
|
||||
break;
|
||||
|
||||
case "\r":
|
||||
$output .= "\\r";
|
||||
break;
|
||||
|
||||
case "\n":
|
||||
$output .= "\\n";
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
$output .= "\\\\";
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
$output .= "\\'";
|
||||
break;
|
||||
|
||||
case '"':
|
||||
$output .= '\"';
|
||||
break;
|
||||
|
||||
default:
|
||||
$byte = ord($input[$i]);
|
||||
|
||||
if (($byte & 0xE0) == 0xC0) {
|
||||
$char = pack('C*', $byte, ord($input[$i + 1]));
|
||||
$i += 1;
|
||||
$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
|
||||
} if (($byte & 0xF0) == 0xE0) {
|
||||
$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]));
|
||||
$i += 2;
|
||||
$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
|
||||
} if (($byte & 0xF8) == 0xF0) {
|
||||
$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3]));
|
||||
$i += 3;
|
||||
$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
|
||||
} if (($byte & 0xFC) == 0xF8) {
|
||||
$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3]), ord($input[$i + 4]));
|
||||
$i += 4;
|
||||
$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
|
||||
} if (($byte & 0xFE) == 0xFC) {
|
||||
$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5]));
|
||||
$i += 5;
|
||||
$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
|
||||
} else if ($byte < 128)
|
||||
$output .= $input[$i];
|
||||
}
|
||||
}
|
||||
|
||||
return '"' . $output . '"';
|
||||
}
|
||||
|
||||
return '"' . $input . '"';
|
||||
}
|
||||
|
||||
function _utf82utf16($utf8) {
|
||||
if (function_exists('mb_convert_encoding'))
|
||||
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
|
||||
|
||||
switch (strlen($utf8)) {
|
||||
case 1:
|
||||
return $utf8;
|
||||
|
||||
case 2:
|
||||
return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1])));
|
||||
|
||||
case 3:
|
||||
return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2])));
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
function _encodeArray($input) {
|
||||
$output = '';
|
||||
$isIndexed = true;
|
||||
|
||||
$keys = array_keys($input);
|
||||
for ($i=0; $i<count($keys); $i++) {
|
||||
if (!is_int($keys[$i])) {
|
||||
$output .= $this->encodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]);
|
||||
$isIndexed = false;
|
||||
} else
|
||||
$output .= $this->encode($input[$keys[$i]]);
|
||||
|
||||
if ($i != count($keys) - 1)
|
||||
$output .= ',';
|
||||
}
|
||||
|
||||
return $isIndexed ? '[' . $output . ']' : '{' . $output . '}';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@ -0,0 +1,268 @@
|
||||
<?php
|
||||
/**
|
||||
* $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $
|
||||
*
|
||||
* @package MCFileManager.filesystems
|
||||
* @author Moxiecode
|
||||
* @copyright Copyright <20> 2005, Moxiecode Systems AB, All rights reserved.
|
||||
*/
|
||||
|
||||
// File type contstants
|
||||
define('MC_LOGGER_DEBUG', 0);
|
||||
define('MC_LOGGER_INFO', 10);
|
||||
define('MC_LOGGER_WARN', 20);
|
||||
define('MC_LOGGER_ERROR', 30);
|
||||
define('MC_LOGGER_FATAL', 40);
|
||||
|
||||
/**
|
||||
* Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's
|
||||
* designed to be compact but still powerful and flexible.
|
||||
*/
|
||||
class Moxiecode_Logger {
|
||||
// Private fields
|
||||
var $_path;
|
||||
var $_filename;
|
||||
var $_maxSize;
|
||||
var $_maxFiles;
|
||||
var $_maxSizeBytes;
|
||||
var $_level;
|
||||
var $_format;
|
||||
|
||||
/**
|
||||
* Constructs a new logger instance.
|
||||
*/
|
||||
function Moxiecode_Logger() {
|
||||
$this->_path = "";
|
||||
$this->_filename = "{level}.log";
|
||||
$this->setMaxSize("100k");
|
||||
$this->_maxFiles = 10;
|
||||
$this->_level = MC_LOGGER_DEBUG;
|
||||
$this->_format = "[{time}] [{level}] {message}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current log level, use the MC_LOGGER constants.
|
||||
*
|
||||
* @param int $level Log level instance for example MC_LOGGER_DEBUG.
|
||||
*/
|
||||
function setLevel($level) {
|
||||
if (is_string($level)) {
|
||||
switch (strtolower($level)) {
|
||||
case "debug":
|
||||
$level = MC_LOGGER_DEBUG;
|
||||
break;
|
||||
|
||||
case "info":
|
||||
$level = MC_LOGGER_INFO;
|
||||
break;
|
||||
|
||||
case "warn":
|
||||
case "warning":
|
||||
$level = MC_LOGGER_WARN;
|
||||
break;
|
||||
|
||||
case "error":
|
||||
$level = MC_LOGGER_ERROR;
|
||||
break;
|
||||
|
||||
case "fatal":
|
||||
$level = MC_LOGGER_FATAL;
|
||||
break;
|
||||
|
||||
default:
|
||||
$level = MC_LOGGER_FATAL;
|
||||
}
|
||||
}
|
||||
|
||||
$this->_level = $level;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current log level for example MC_LOGGER_DEBUG.
|
||||
*
|
||||
* @return int Current log level for example MC_LOGGER_DEBUG.
|
||||
*/
|
||||
function getLevel() {
|
||||
return $this->_level;
|
||||
}
|
||||
|
||||
function setPath($path) {
|
||||
$this->_path = $path;
|
||||
}
|
||||
|
||||
function getPath() {
|
||||
return $this->_path;
|
||||
}
|
||||
|
||||
function setFileName($file_name) {
|
||||
$this->_filename = $file_name;
|
||||
}
|
||||
|
||||
function getFileName() {
|
||||
return $this->_filename;
|
||||
}
|
||||
|
||||
function setFormat($format) {
|
||||
$this->_format = $format;
|
||||
}
|
||||
|
||||
function getFormat() {
|
||||
return $this->_format;
|
||||
}
|
||||
|
||||
function setMaxSize($size) {
|
||||
// Fix log max size
|
||||
$logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));
|
||||
|
||||
// Is KB
|
||||
if (strpos((strtolower($size)), "k") > 0)
|
||||
$logMaxSizeBytes *= 1024;
|
||||
|
||||
// Is MB
|
||||
if (strpos((strtolower($size)), "m") > 0)
|
||||
$logMaxSizeBytes *= (1024 * 1024);
|
||||
|
||||
$this->_maxSizeBytes = $logMaxSizeBytes;
|
||||
$this->_maxSize = $size;
|
||||
}
|
||||
|
||||
function getMaxSize() {
|
||||
return $this->_maxSize;
|
||||
}
|
||||
|
||||
function setMaxFiles($max_files) {
|
||||
$this->_maxFiles = $max_files;
|
||||
}
|
||||
|
||||
function getMaxFiles() {
|
||||
return $this->_maxFiles;
|
||||
}
|
||||
|
||||
function debug($msg) {
|
||||
$args = func_get_args();
|
||||
$this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));
|
||||
}
|
||||
|
||||
function info($msg) {
|
||||
$args = func_get_args();
|
||||
$this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));
|
||||
}
|
||||
|
||||
function warn($msg) {
|
||||
$args = func_get_args();
|
||||
$this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$args = func_get_args();
|
||||
$this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));
|
||||
}
|
||||
|
||||
function fatal($msg) {
|
||||
$args = func_get_args();
|
||||
$this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));
|
||||
}
|
||||
|
||||
function isDebugEnabled() {
|
||||
return $this->_level >= MC_LOGGER_DEBUG;
|
||||
}
|
||||
|
||||
function isInfoEnabled() {
|
||||
return $this->_level >= MC_LOGGER_INFO;
|
||||
}
|
||||
|
||||
function isWarnEnabled() {
|
||||
return $this->_level >= MC_LOGGER_WARN;
|
||||
}
|
||||
|
||||
function isErrorEnabled() {
|
||||
return $this->_level >= MC_LOGGER_ERROR;
|
||||
}
|
||||
|
||||
function isFatalEnabled() {
|
||||
return $this->_level >= MC_LOGGER_FATAL;
|
||||
}
|
||||
|
||||
function _logMsg($level, $message) {
|
||||
$roll = false;
|
||||
|
||||
if ($level < $this->_level)
|
||||
return;
|
||||
|
||||
$logFile = $this->toOSPath($this->_path . "/" . $this->_filename);
|
||||
|
||||
switch ($level) {
|
||||
case MC_LOGGER_DEBUG:
|
||||
$levelName = "DEBUG";
|
||||
break;
|
||||
|
||||
case MC_LOGGER_INFO:
|
||||
$levelName = "INFO";
|
||||
break;
|
||||
|
||||
case MC_LOGGER_WARN:
|
||||
$levelName = "WARN";
|
||||
break;
|
||||
|
||||
case MC_LOGGER_ERROR:
|
||||
$levelName = "ERROR";
|
||||
break;
|
||||
|
||||
case MC_LOGGER_FATAL:
|
||||
$levelName = "FATAL";
|
||||
break;
|
||||
}
|
||||
|
||||
$logFile = str_replace('{level}', strtolower($levelName), $logFile);
|
||||
|
||||
$text = $this->_format;
|
||||
$text = str_replace('{time}', date("Y-m-d H:i:s"), $text);
|
||||
$text = str_replace('{level}', strtolower($levelName), $text);
|
||||
$text = str_replace('{message}', $message, $text);
|
||||
$message = $text . "\r\n";
|
||||
|
||||
// Check filesize
|
||||
if (file_exists($logFile)) {
|
||||
$size = @filesize($logFile);
|
||||
|
||||
if ($size + strlen($message) > $this->_maxSizeBytes)
|
||||
$roll = true;
|
||||
}
|
||||
|
||||
// Roll if the size is right
|
||||
if ($roll) {
|
||||
for ($i=$this->_maxFiles-1; $i>=1; $i--) {
|
||||
$rfile = $this->toOSPath($logFile . "." . $i);
|
||||
$nfile = $this->toOSPath($logFile . "." . ($i+1));
|
||||
|
||||
if (@file_exists($rfile))
|
||||
@rename($rfile, $nfile);
|
||||
}
|
||||
|
||||
@rename($logFile, $this->toOSPath($logFile . ".1"));
|
||||
|
||||
// Delete last logfile
|
||||
$delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));
|
||||
if (@file_exists($delfile))
|
||||
@unlink($delfile);
|
||||
}
|
||||
|
||||
// Append log line
|
||||
if (($fp = @fopen($logFile, "a")) != null) {
|
||||
@fputs($fp, $message);
|
||||
@fflush($fp);
|
||||
@fclose($fp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Unix path to OS specific path.
|
||||
*
|
||||
* @param String $path Unix path to convert.
|
||||
*/
|
||||
function toOSPath($path) {
|
||||
return str_replace("/", DIRECTORY_SEPARATOR, $path);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user