Author: grobmeier
Date: Thu May  7 06:29:28 2009
New Revision: 772512

URL: http://svn.apache.org/viewvc?rev=772512&view=rev
Log:
#LOG4PHP-30: Added new appender which uses the the PDO extension (plus test)

Added:
    incubator/log4php/trunk/src/main/php/appenders/LoggerAppenderPDO.php
    incubator/log4php/trunk/src/test/php/appenders/LoggerAppenderPDOTest.php
Modified:
    incubator/log4php/trunk/src/main/php/LoggerManager.php

Modified: incubator/log4php/trunk/src/main/php/LoggerManager.php
URL: 
http://svn.apache.org/viewvc/incubator/log4php/trunk/src/main/php/LoggerManager.php?rev=772512&r1=772511&r2=772512&view=diff
==============================================================================
--- incubator/log4php/trunk/src/main/php/LoggerManager.php (original)
+++ incubator/log4php/trunk/src/main/php/LoggerManager.php Thu May  7 06:29:28 
2009
@@ -61,6 +61,7 @@
                'LoggerRoot' => '/LoggerRoot.php',
                'LoggerAppender' => '/LoggerAppender.php',
                'LoggerAppenderAdodb' => '/appenders/LoggerAppenderAdodb.php',
+               'LoggerAppenderPDO' => '/appenders/LoggerAppenderPDO.php',
                'LoggerAppenderConsole' => 
'/appenders/LoggerAppenderConsole.php',
                'LoggerAppenderDailyFile' => 
'/appenders/LoggerAppenderDailyFile.php',
                'LoggerAppenderDb' => '/appenders/LoggerAppenderDb.php',

Added: incubator/log4php/trunk/src/main/php/appenders/LoggerAppenderPDO.php
URL: 
http://svn.apache.org/viewvc/incubator/log4php/trunk/src/main/php/appenders/LoggerAppenderPDO.php?rev=772512&view=auto
==============================================================================
--- incubator/log4php/trunk/src/main/php/appenders/LoggerAppenderPDO.php (added)
+++ incubator/log4php/trunk/src/main/php/appenders/LoggerAppenderPDO.php Thu 
May  7 06:29:28 2009
@@ -0,0 +1,206 @@
+<?php
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Appends log events to a db table using PDO
+ *
+ * <p>This appender uses a table in a database to log events.</p>
+ * <p>Parameters are {...@link $host}, {...@link $user}, {...@link $password},
+ * {...@link $database}, {...@link $createTable}, {...@link $table} and 
{...@link $sql}.</p>
+ *
+ * @package log4php
+ * @subpackage appenders
+ * @since 2.0
+ */
+class LoggerAppenderPDO extends LoggerAppender {
+    /** Create the log table if it does not exists (optional). */
+       private $createTable = true;
+    
+    /** Database user name */
+    private $user = '';
+    
+    /** Database password */
+    private $password = '';
+    
+    /** Name of the database to connect to */
+    private $database;
+       
+       /** DSN string for enabling a connection */    
+    private $dsn;
+    
+    /** A {...@link LoggerPatternLayout} string used to format a valid insert 
query (mandatory) */
+    private $sql;
+    
+    /** Table name to write events. Used only if {...@link $createTable} is 
true. */    
+    private $table = 'log4php_log';
+    
+    /** The instance */
+    private $db = null;
+    
+    /** boolean used to check if all conditions to append are true */
+    private $canAppend = true;
+    
+    /**
+     * Constructor.
+     * This apender doesn't require a layout.
+     * @param string $name appender name
+     */
+    function __construct($name) {
+        parent::__construct($name);
+        $this->requiresLayout = false;
+    }
+
+    /**
+     * Setup db connection.
+     * Based on defined options, this method connects to db defined in 
{...@link $dsn}
+     * and creates a {...@link $table} table if {...@link $createTable} is 
true.
+     * @return boolean true if all ok.
+     */
+    public function activateOptions() {
+       $this->db = new PDO($this->dsn,$this->password,$this->password);
+               
+               if($this->db == null) {
+                       $this->db = null;
+                       $this->closed = true;
+                       $this->canAppend = false;
+                       return;
+                       // TODO throw exception instead?
+               }
+               
+        // test if log table exists
+        $result = $this->db->query('select * from ' . $this->table . ' where 1 
= 0');
+        if ($result == false and $this->createTable) {
+               // TODO mysql syntax?
+            $query = "CREATE TABLE {$this->table} (     timestamp 
varchar(32)," .
+                                                                               
        "logger varchar(32)," .
+                                                                               
        "level varchar(32)," .
+                                                                               
        "message varchar(64)," .
+                                                                               
        "thread varchar(32)," .
+                                                                               
        "file varchar(64)," .
+                                                                               
        "line varchar(4) );";
+
+            $result = $this->db->query($query);
+            if (!$result) {
+                $this->canAppend = false;
+                return;
+                // TODO throw exception?
+            }
+        }
+        
+        if($this->sql == '' || $this->sql == null) {
+            $this->sql = "INSERT INTO $this->table ( timestamp, " .
+                                                                               
        "logger, " .
+                                                                               
        "level, " .
+                                                                               
        "message, " .
+                                                                               
        "thread, " .
+                                                                               
        "file, " .
+                                                                               
        "line" .
+                                                ") VALUES 
('%d','%c','%p','%m','%t','%F','%L')";
+        }
+        
+               $this->layout = LoggerLayout::factory('LoggerPatternLayout');
+        $this->layout->setConversionPattern($this->sql);
+        $this->canAppend = true;
+        return true;
+    }
+    
+    /**
+     * Appends a new event to the database using the sql format.
+     */
+    public function append($event) {
+        if ($this->canAppend) {
+            $query = $this->layout->format($event);
+            $this->db->exec($query);
+        }
+    }
+    
+    /**
+     * Closes the connection to the logging database
+     */
+    public function close() {
+        if ($this->db !== null) {
+            $db = null;
+        }
+        $this->closed = true;
+    }
+    
+    /**
+     * Indicator if the logging table should be created on startup,
+     * if its not existing.
+     */
+    public function setCreateTable($flag) {
+        $this->createTable = LoggerOptionConverter::toBoolean($flag, true);
+    }
+   
+       /**
+     * Sets the username for this connection. 
+     * Defaults to ''
+     */
+    function setUser($newUser) {
+        $this->user = $newUser;
+    }
+    
+    /**
+     * Sets the password for this connection. 
+     * Defaults to ''
+     */
+    public function setPassword($newPassword) {
+        $this->password = $newPassword;
+    }
+    
+    /**
+     * Sets the SQL string into which the event should be transformed.
+     * Defaults to:
+     * 
+     * INSERT INTO $this->table 
+     * ( timestamp, logger, level, message, thread, file, line) 
+     * VALUES 
+     * ('%d','%c','%p','%m','%t','%F','%L')
+     * 
+     * It's not necessary to change this except you have customized logging'
+     */
+    public function setSql($sql) {
+        $this->sql = $sql;    
+    }
+    
+    /**
+     * Sets the tablename to which this appender should log.
+     * Defaults to log4php_log
+     */
+    public function setTable($table) {
+        $this->table = $table;
+    }
+    
+    /**
+     * Sets the DSN string for this connection. In case of
+     * SQLite it could look like this: 'sqlite:appenders/pdotest.sqlite'
+     */
+    public function setDSN($dsn) {
+        $this->dsn = $dsn;
+    }
+    
+    /**
+     * Sometimes databases allow only one connection to themselves in one 
thread.
+     * SQLite has this behaviour. In that case this handle is needed if the 
database
+     * must be checked for events
+     */
+    public function getDatabaseHandle() {
+        return $this->db;
+    }
+}
+

Added: incubator/log4php/trunk/src/test/php/appenders/LoggerAppenderPDOTest.php
URL: 
http://svn.apache.org/viewvc/incubator/log4php/trunk/src/test/php/appenders/LoggerAppenderPDOTest.php?rev=772512&view=auto
==============================================================================
--- incubator/log4php/trunk/src/test/php/appenders/LoggerAppenderPDOTest.php 
(added)
+++ incubator/log4php/trunk/src/test/php/appenders/LoggerAppenderPDOTest.php 
Thu May  7 06:29:28 2009
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ * @category   tests   
+ * @package    log4php
+ * @subpackage appenders
+ * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, 
Version 2.0
+ * @version    SVN: $Id$
+ * @link       http://logging.apache.org/log4php
+ */
+
+class LoggerAppenderPDOTest extends PHPUnit_Framework_TestCase {
+        
+       public function testSimpleLogging() {
+               $event = new LoggerLoggingEvent("LoggerAppenderPDOTest", new 
Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
+
+               $dbname = 'appenders/pdotest.sqlite';
+               try {
+                       $database = new SQLiteDatabase($dbname);
+                       $database = null;
+                       
+                       $appender = new LoggerAppenderPDO("myname");
+                       $appender->setDSN('sqlite:'.$dbname);
+                       $appender->setCreateTable(true);
+                       $appender->activateOptions();
+                       $appender->append($event);
+                       
+                       
+                       $db = $appender->getDatabaseHandle();
+                       $q = "select * from log4php_log";       
+                       $error = "";
+                       if($result = $db->query($q, SQLITE_BOTH, $error)) {
+                               while($row = $result->fetch()) {
+                               self::assertEquals($row['1'], 'TEST');
+                               self::assertEquals($row['2'], 'ERROR');
+                               self::assertEquals($row['3'], 'testmessage');
+                               }
+                       } else {
+                               // todo propagate exception to phpunit
+                          self::assertTrue(false);
+                       }
+                       $appender->close();
+               } catch(Exception $e) {
+                       // todo propagate exception to phpunit
+                       self::assertTrue(false);
+               }
+               unlink($dbname);
+    }
+    
+}


Reply via email to