Viewing file:      sqlite.php (6.79 KB)      -rw-r--r-- Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
<?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;     }
  } 
  |