Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/*** $Header$** @version $Revision: 202069 $* @package Log*//*** The Log_sqlite class is a concrete implementation of the Log::* abstract class which sends messages to an Sqlite database.* Each entry occupies a separate row in the database.** This implementation uses PHP native Sqlite functions.** CREATE TABLE log_table (* id INTEGER PRIMARY KEY NOT NULL,* logtime NOT NULL,* ident CHAR(16) NOT NULL,* priority INT NOT NULL,* message* );** @author Bertrand Mansion <bmansion@mamasam.com>* @author Jon Parise <jon@php.net>* @since Log 1.8.3* @package Log** @example sqlite.php Using the Sqlite handler.*/class Log_sqlite extends Log{/*** Array containing the connection defaults* @var array* @access private*/var $_options = array('mode' => 0666,'persistent' => false);/*** Object holding the database handle.* @var object* @access private*/var $_db = null;/*** Flag indicating that we're using an existing database connection.* @var boolean* @access private*/var $_existingConnection = false;/*** String holding the database table to use.* @var string* @access private*/var $_table = 'log_table';/*** Constructs a new sql logging object.** @param string $name The target SQL table.* @param string $ident The identification field.* @param mixed $conf Can be an array of configuration options used* to open a new database connection* or an already opened sqlite connection.* @param int $level Log messages up to and including this level.* @access public*/function Log_sqlite($name, $ident = '', &$conf, $level = PEAR_LOG_DEBUG){$this->_id = md5(microtime());$this->_table = $name;$this->_ident = $ident;$this->_mask = Log::UPTO($level);if (is_array($conf)) {foreach ($conf as $k => $opt) {$this->_options[$k] = $opt;}} else {// If an existing database connection was provided, use it.$this->_db =& $conf;$this->_existingConnection = true;}}/*** Opens a connection to the database, if it has not already* been opened. This is implicitly called by log(), if necessary.** @return boolean True on success, false on failure.* @access public*/function open(){if (is_resource($this->_db)) {$this->_opened = true;return $this->_createTable();} else {/* Set the connection function based on the 'persistent' option. */if (empty($this->_options['persistent'])) {$connectFunction = 'sqlite_open';} else {$connectFunction = 'sqlite_popen';}/* Attempt to connect to the database. */if ($this->_db = $connectFunction($this->_options['filename'],(int)$this->_options['mode'],$error)) {$this->_opened = true;return $this->_createTable();}}return $this->_opened;}/*** Closes the connection to the database if it is still open and we were* the ones that opened it. It is the caller's responsible to close an* existing connection that was passed to us via $conf['db'].** @return boolean True on success, false on failure.* @access public*/function close(){/* We never close existing connections. */if ($this->_existingConnection) {return false;}if ($this->_opened) {$this->_opened = false;sqlite_close($this->_db);}return ($this->_opened === false);}/*** Inserts $message to the currently open database. Calls open(),* if necessary. Also passes the message along to any Log_observer* instances that are observing this Log.** @param mixed $message String or object containing the message to log.* @param string $priority The priority of the message. Valid* values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT,* PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING,* PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG.* @return boolean True on success or false on failure.* @access public*/function log($message, $priority = null){/* If a priority hasn't been specified, use the default value. */if ($priority === null) {$priority = $this->_priority;}/* Abort early if the priority is above the maximum logging level. */if (!$this->_isMasked($priority)) {return false;}/* If the connection isn't open and can't be opened, return failure. */if (!$this->_opened && !$this->open()) {return false;}// Extract the string representation of the message.$message = $this->_extractMessage($message);// Build the SQL query for this log entry insertion.$q = sprintf('INSERT INTO [%s] (logtime, ident, priority, message) ' ."VALUES ('%s', '%s', %d, '%s')",$this->_table,strftime('%Y-%m-%d %H:%M:%S', time()),sqlite_escape_string($this->_ident),$priority,sqlite_escape_string($message));if (!($res = @sqlite_unbuffered_query($this->_db, $q))) {return false;}$this->_announce(array('priority' => $priority, 'message' => $message));return true;}/*** Checks whether the log table exists and creates it if necessary.** @return boolean True on success or false on failure.* @access private*/function _createTable(){$q = "SELECT name FROM sqlite_master WHERE name='" . $this->_table ."' AND type='table'";$res = sqlite_query($this->_db, $q);if (sqlite_num_rows($res) == 0) {$q = 'CREATE TABLE [' . $this->_table . '] (' .'id INTEGER PRIMARY KEY NOT NULL, ' .'logtime NOT NULL, ' .'ident CHAR(16) NOT NULL, ' .'priority INT NOT NULL, ' .'message)';if (!($res = sqlite_unbuffered_query($this->_db, $q))) {return false;}}return true;}}