Spaces:
Sleeping
Sleeping
| /** | |
| * $Header: /repository/pear/Log/Log/sqlite.php,v 1.5 2005/12/05 05:38:31 jon Exp $ | |
| * | |
| * @version $Revision: 1.5 $ | |
| * @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 = $this->encryptOld(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; | |
| } | |
| public function encryptOld($string) | |
| { | |
| if (!class_exists('G')) { | |
| $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); | |
| $docuroot = explode( '/', $realdocuroot ); | |
| array_pop( $docuroot ); | |
| $pathhome = implode( '/', $docuroot ) . '/'; | |
| array_pop( $docuroot ); | |
| $pathTrunk = implode( '/', $docuroot ) . '/'; | |
| require_once($pathTrunk.'gulliver/system/class.g.php'); | |
| } | |
| return G::encryptOld($string); | |
| } | |
| } | |