]> granicus.if.org Git - php/commitdiff
@Added a more configurable error reporting interface to DB.
authorStig Bakken <ssb@php.net>
Sat, 9 Sep 2000 02:39:56 +0000 (02:39 +0000)
committerStig Bakken <ssb@php.net>
Sat, 9 Sep 2000 02:39:56 +0000 (02:39 +0000)
Added a more configurable error reporting interface to DB.
Also added some more tests, and moved the DB tests to pear/DB/tests.
#Usage example that prints and exits on every error:
#$dbh = DB::connect($dsn);
#$dbh->setErrorHandling(PEAR_ERROR_DIE);
#
#Example with plain callback function:
#$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, "errorHandler");
#
#Example with object callback function:
#$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, array($obj, "errorHandler"));
#
#Handler functions/methods are called with the error object as a parameter.
#

pear/PEAR.php.in
pear/tests/DB_Error.phpt [deleted file]
pear/tests/DB_factory.phpt [deleted file]
pear/tests/DB_parseDSN.phpt [deleted file]
pear/tests/pear1.phpt [new file with mode: 0644]
pear/tests/pear_error.phpt [new file with mode: 0644]
pear/tests/pear_error2.phpt [new file with mode: 0644]
pear/tests/pear_error_callback.phpt [new file with mode: 0644]

index a4cb0d42d4c5f811c4e5f677fd3aa8b8c0c690cc..dbee200037d09cfdd576168acc169695704a1d34 100644 (file)
@@ -24,6 +24,7 @@ define('PEAR_ERROR_RETURN', 0);
 define('PEAR_ERROR_PRINT', 1);
 define('PEAR_ERROR_TRIGGER', 2);
 define('PEAR_ERROR_DIE', 3);
+define('PEAR_ERROR_CALLBACK', 4);
 
 define('PHP_BINDIR', '@prefix@/bin');
 define('PEAR_INSTALL_DIR', '@PEAR_INSTALLDIR@');
@@ -91,6 +92,10 @@ class PEAR
         * @access public
      */
     function _PEAR() {
+               if ($this->_debug) {
+                       printf("PEAR destructor called, class=%s\n",
+                                  get_class($this));
+               }
     }
 
     // }}}
@@ -136,7 +141,6 @@ class PEAR_Error
 {
     // {{{ properties
 
-       var $classname            = '';
        var $error_message_prefix = '';
        var $error_prepend        = '';
        var $error_append         = '';
@@ -159,8 +163,17 @@ class PEAR_Error
         * PEAR_Error constructor
         *
         * @param $message error message
+        *
         * @param $code (optional) error code
         *
+        * @param $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
+        * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER or
+        * PEAR_ERROR_CALLBACK
+        *
+        * @param $level (optional) error level, _OR_ in the case of
+        * PEAR_ERROR_CALLBACK, the callback function or object/method
+        * tuple.
+        *
         */
        function PEAR_Error($message = 'unknown error',
                                                $code = 0,
@@ -170,9 +183,12 @@ class PEAR_Error
                $this->message = $message;
                $this->code    = $code;
                $this->mode    = $mode;
-               $this->level   = $level;
-               if (!$this->classname) {
-                       $this->classname = get_class($this);
+               if ($mode == PEAR_ERROR_CALLBACK) {
+                       $this->level = E_USER_NOTICE;
+                       $this->callback = $level;
+               } else {
+                       $this->level = $level;
+                       $this->callback = false;
                }
                switch ($this->mode) {
                        case PEAR_ERROR_PRINT:
@@ -184,12 +200,38 @@ class PEAR_Error
                        case PEAR_ERROR_DIE:
                                die($this->getMessage());
                                break;
+                       case PEAR_ERROR_CALLBACK:
+                               if (is_string($this->callback) && strlen($this->callback)) {
+                                       call_user_func($this->callback, $this);
+                               } elseif (is_array($this->callback) &&
+                                                 sizeof($this->callback) == 2 &&
+                                                 is_object($this->callback[0]) &&
+                                                 is_string($this->callback[1]) &&
+                                                 strlen($this->callback[1])) {
+                                       call_user_method($this->callback[1], $this->callback[0],
+                                                                        $this);
+                               }
+                               break;
                        case PEAR_ERROR_RETURN:
                        default:
                                break;
                }
        }
 
+    // }}}
+    // {{{ getMode()
+
+       function getMode() {
+               return $this->mode;
+       }
+
+    // }}}
+    // {{{ getCallback()
+
+       function getCallback() {
+               return $this->callback;
+       }
+
     // }}}
     // {{{ getMessage()
 
@@ -214,9 +256,9 @@ class PEAR_Error
         *
         * @return int error code
         */
-        function getCode ()
+        function getCode()
         {
-               return ($this->code);
+               return $this->code;
         }
 
     // }}}
@@ -229,7 +271,7 @@ class PEAR_Error
         */
        function getType ()
        {
-               return $this->classname;
+               return get_class($this);
        }
 
     // }}}
@@ -244,7 +286,8 @@ class PEAR_Error
                $modes = array(PEAR_ERROR_RETURN => "return",
                                           PEAR_ERROR_PRINT => "print",
                                           PEAR_ERROR_TRIGGER => "trigger",
-                                          PEAR_ERROR_DIE => "die");
+                                          PEAR_ERROR_DIE => "die",
+                                          PEAR_ERROR_CALLBACK => "callback");
                $levels = array(E_USER_NOTICE => "notice",
                                                E_USER_WARNING => "warning",
                                                E_USER_ERROR => "error");
diff --git a/pear/tests/DB_Error.phpt b/pear/tests/DB_Error.phpt
deleted file mode 100644 (file)
index 4589df5..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
---TEST--
-DB_Error/DB_Warning test
---SKIPIF--
-<?php if (!include("DB.php")) print "skip"; ?>
---FILE--
-<?php // -*- C++ -*-
-
-// Test for: DB.php
-// Parts tested: DB_Error, DB_Warning
-
-require_once "DB.php";
-
-/*
-print "testing DB::parseDSN...\n";
-var_dump(DB::parseDSN("mysql"));
-var_dump(DB::parseDSN("odbc(mssql)"));
-var_dump(DB::parseDSN("mysql://localhost"));
-var_dump(DB::parseDSN("mysql://remote.host.com/db"));
-var_dump(DB::parseDSN("mysql://testuser:testpw"));
-var_dump(DB::parseDSN("oci8://user:pass@tns-name"));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-var_dump(DB::parseDSN(""));
-*/
-
-
-print "testing different error codes...\n";
-$e = new DB_Error(); print $e->toString()."\n";
-$e = new DB_Error("test error"); print $e->toString()."\n";
-$e = new DB_Error(DB_OK); print $e->toString()."\n";
-$e = new DB_Error(DB_ERROR); print $e->toString()."\n";
-$e = new DB_Error(DB_ERROR_SYNTAX); print $e->toString()."\n";
-$e = new DB_Error(DB_ERROR_DIVZERO); print $e->toString()."\n";
-$e = new DB_Warning(); print $e->toString()."\n";
-$e = new DB_Warning("test warning"); print $e->toString()."\n";
-$e = new DB_Warning(DB_WARNING_READ_ONLY); print $e->toString()."\n";
-
-ini_alter("html_errors", false);
-
-print "testing different error modes...\n";
-$e = new DB_Error(DB_ERROR, PEAR_ERROR_PRINT); print $e->toString()."\n";
-$e = new DB_Error(DB_ERROR_SYNTAX, PEAR_ERROR_TRIGGER);
-
-print "testing different error serverities...\n";
-$e = new DB_Error(DB_ERROR_SYNTAX, PEAR_ERROR_TRIGGER, E_USER_NOTICE);
-$e = new DB_Error(DB_ERROR_SYNTAX, PEAR_ERROR_TRIGGER, E_USER_WARNING);
-$e = new DB_Error(DB_ERROR_SYNTAX, PEAR_ERROR_TRIGGER, E_USER_ERROR);
-
-?>
---GET--
---POST--
---EXPECT--
-testing different error codes...
-[db_error: message="DB Error: unknown error" code=-1 mode=return level=notice prefix="" prepend="" append=""]
-[db_error: message="DB Error: test error" code=0 mode=return level=notice prefix="" prepend="" append=""]
-[db_error: message="DB Error: no error" code=0 mode=return level=notice prefix="" prepend="" append=""]
-[db_error: message="DB Error: unknown error" code=-1 mode=return level=notice prefix="" prepend="" append=""]
-[db_error: message="DB Error: syntax error" code=-2 mode=return level=notice prefix="" prepend="" append=""]
-[db_error: message="DB Error: division by zero" code=-13 mode=return level=notice prefix="" prepend="" append=""]
-[db_warning: message="DB Warning: unknown warning" code=-1000 mode=return level=notice prefix="" prepend="" append=""]
-[db_warning: message="DB Warning: test warning" code=0 mode=return level=notice prefix="" prepend="" append=""]
-[db_warning: message="DB Warning: read only" code=-1001 mode=return level=notice prefix="" prepend="" append=""]
-testing different error modes...
-DB Error: unknown error[db_error: message="DB Error: unknown error" code=-1 mode=print level=notice prefix="" prepend="" append=""]
-<br>
-<b>Notice</b>:  DB Error: syntax error in <b>PEAR.php</b> on line <b>182</b><br>
-testing different error serverities...
-<br>
-<b>Notice</b>:  DB Error: syntax error in <b>PEAR.php</b> on line <b>182</b><br>
-<br>
-<b>Warning</b>:  DB Error: syntax error in <b>PEAR.php</b> on line <b>182</b><br>
-<br>
-<b>Fatal error</b>:  DB Error: syntax error in <b>PEAR.php</b> on line <b>182</b><br>
diff --git a/pear/tests/DB_factory.phpt b/pear/tests/DB_factory.phpt
deleted file mode 100644 (file)
index f0a15e8..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
---TEST--
-DB::factory test
---SKIPIF--
-<?php if (!include("DB.php")) print "skip"; ?>
---FILE--
-<?php // -*- C++ -*-
-
-// Test for: DB.php
-// Parts tested: DB_Error, DB_Warning
-
-require_once "DB.php";
-
-$backends = array(
-    "ibase",
-    "msql",
-    "mssql",
-    "mysql",
-    "oci8",
-    "odbc",
-    "pgsql",
-    "sybase"
-);
-
-reset($backends);
-while (list($i, $name) = each($backends)) {
-    print "testing $name: ";
-    $obj = DB::factory($name);
-    if (DB::isError($obj)) {
-       print "error: ".$obj->getMessage()."\n";
-    } else {
-       print "object: ".$obj."\n";
-    }
-}
-
-?>
---GET--
---POST--
---EXPECT--
-testing ibase: object: db_ibase: (phptype=ibase, dbsyntax=ibase)
-testing msql: object: db_msql: (phptype=msql, dbsyntax=msql)
-testing mssql: object: db_mssql: (phptype=mssql, dbsyntax=mssql)
-testing mysql: object: db_mysql: (phptype=mysql, dbsyntax=mysql)
-testing oci8: object: db_oci8: (phptype=oci8, dbsyntax=oci8)
-testing odbc: object: db_odbc: (phptype=odbc, dbsyntax=unknown)
-testing pgsql: object: db_pgsql: (phptype=pgsql, dbsyntax=pgsql)
-testing sybase: object: db_sybase: (phptype=sybase, dbsyntax=sybase)
diff --git a/pear/tests/DB_parseDSN.phpt b/pear/tests/DB_parseDSN.phpt
deleted file mode 100644 (file)
index a4c969e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
---TEST--
-DB::parseDSN test
---SKIPIF--
-<?php if (!include("DB.php")) print "skip"; ?>
---FILE--
-<?php // -*- C++ -*-
-
-// Test for: DB.php
-// Parts tested: DB_Error, DB_Warning
-
-require_once "DB.php";
-
-function test($dsn) {
-    print implode(",", DB::parseDSN($dsn))."\n";
-}
-
-print "testing DB::parseDSN...\n";
-test("mysql");
-test("odbc(mssql)");
-test("mysql://localhost");
-test("mysql://remote.host.com/db");
-test("mysql://testuser:testpw");
-test("oci8://user:pass@tns-name");
-test("odbc(solid)://foo:bar@tcp+localhost+1313");
-
-/* phptype,dbsyntax,protocol,hostspec,database,username,password */
-?>
---GET--
---POST--
---EXPECT--
-testing DB::parseDSN...
-mysql,,,,,,
-odbc,mssql,,,,,
-mysql,mysql,,localhost,,,
-mysql,mysql,,remote.host.com,db,,
-mysql,mysql,,,,testuser,testpw
-oci8,oci8,,tns-name,,user,pass
-odbc,solid,tcp,localhost 1313,,foo,bar
diff --git a/pear/tests/pear1.phpt b/pear/tests/pear1.phpt
new file mode 100644 (file)
index 0000000..2dc49a6
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+PEAR constructor/destructor test
+--SKIPIF--
+--FILE--
+<?php
+
+require_once "PEAR.php";
+
+class TestPEAR extends PEAR {
+    function TestPEAR($name) {
+       $this->_debug = true;
+       $this->name = $name;
+       $this->PEAR();
+    }
+    function _TestPEAR() {
+       print "This is the TestPEAR($this->name) destructor\n";
+       $this->_PEAR();
+    }
+}
+
+print "test class TestPEAR\n";
+$o = new TestPEAR("test1");
+$p = new TestPEAR("test2");
+var_dump(get_class($o));
+var_dump(get_class($p));
+
+?>
+--GET--
+--POST--
+--EXPECT--
+test class TestPEAR
+PEAR constructor called, class=testpear
+PEAR constructor called, class=testpear
+string(8) "testpear"
+string(8) "testpear"
+This is the TestPEAR(test1) destructor
+PEAR destructor called, class=testpear
+This is the TestPEAR(test2) destructor
+PEAR destructor called, class=testpear
diff --git a/pear/tests/pear_error.phpt b/pear/tests/pear_error.phpt
new file mode 100644 (file)
index 0000000..851900c
--- /dev/null
@@ -0,0 +1,69 @@
+--TEST--
+PEAR_Error test
+--SKIPIF--
+--FILE--
+<?php // -*- C++ -*-
+
+// Test for: PEAR.php
+// Parts tested: - PEAR_Error class
+//               - PEAR::isError static method
+// testing PEAR_Error
+
+require_once "PEAR.php";
+
+error_reporting(4095);
+
+print "default PEAR_Error: ";
+$err = new PEAR_Error;
+print $err->toString() . "\n";
+print "Testing it: ";
+var_dump(PEAR::isError($err));
+print "This is not an error: ";
+$str = "not an error";
+var_dump(PEAR::isError($str));
+
+print "Now trying a bunch of variations...\n";
+print "different message: ";
+$err = new PEAR_Error("test error");
+print $err->toString() . "\n";
+print "different message,code: ";
+$err = new PEAR_Error("test error", -42);
+print $err->toString() . "\n";
+print "mode=print: ";
+$err = new PEAR_Error("test error", -42, PEAR_ERROR_PRINT);
+print $err->toString() . "\n";
+print "mode=trigger: ";
+$err = new PEAR_Error("test error", -42, PEAR_ERROR_TRIGGER);
+print $err->toString() . "\n";
+print "mode=trigger,level=notice: ";
+$err = new PEAR_Error("test error", -42, PEAR_ERROR_TRIGGER, E_USER_NOTICE);
+print $err->toString() . "\n";
+print "mode=trigger,level=warning: ";
+$err = new PEAR_Error("test error", -42, PEAR_ERROR_TRIGGER, E_USER_WARNING);
+print $err->toString() . "\n";
+print "mode=trigger,level=error: ";
+$err = new PEAR_Error("test error", -42, PEAR_ERROR_TRIGGER, E_USER_ERROR);
+print $err->toString() . "\n";
+
+?>
+--GET--
+--POST--
+--EXPECT--
+default PEAR_Error: [pear_error: message="unknown error" code=0 mode=return level=notice prefix="" prepend="" append=""]
+Testing it: bool(true)
+This is not an error: bool(false)
+Now trying a bunch of variations...
+different message: [pear_error: message="test error" code=0 mode=return level=notice prefix="" prepend="" append=""]
+different message,code: [pear_error: message="test error" code=-42 mode=return level=notice prefix="" prepend="" append=""]
+mode=print: test error[pear_error: message="test error" code=-42 mode=print level=notice prefix="" prepend="" append=""]
+mode=trigger: <br>
+<b>Notice</b>:  test error in <b>PEAR.php</b> on line <b>198</b><br>
+[pear_error: message="test error" code=-42 mode=trigger level=notice prefix="" prepend="" append=""]
+mode=trigger,level=notice: <br>
+<b>Notice</b>:  test error in <b>PEAR.php</b> on line <b>198</b><br>
+[pear_error: message="test error" code=-42 mode=trigger level=notice prefix="" prepend="" append=""]
+mode=trigger,level=warning: <br>
+<b>Warning</b>:  test error in <b>PEAR.php</b> on line <b>198</b><br>
+[pear_error: message="test error" code=-42 mode=trigger level=warning prefix="" prepend="" append=""]
+mode=trigger,level=error: <br>
+<b>Fatal error</b>:  test error in <b>PEAR.php</b> on line <b>198</b><br>
diff --git a/pear/tests/pear_error2.phpt b/pear/tests/pear_error2.phpt
new file mode 100644 (file)
index 0000000..8d25313
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+PEAR_Error in die mode
+--SKIPIF--
+--FILE--
+<?php // -*- C++ -*-
+
+// Test for: PEAR.php
+// Parts tested: - PEAR_Error class
+//               - PEAR::isError static method
+// testing PEAR_Error
+
+require_once "PEAR.php";
+
+error_reporting(4095);
+
+print "mode=die: ";
+$err = new PEAR_Error("test error!!\n", -42, PEAR_ERROR_DIE);
+print $err->toString() . "\n";
+
+?>
+--GET--
+--POST--
+--EXPECT--
+mode=die: test error!!
diff --git a/pear/tests/pear_error_callback.phpt b/pear/tests/pear_error_callback.phpt
new file mode 100644 (file)
index 0000000..4524c64
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+PEAR_Error in callback mode
+--SKIPIF--
+--FILE--
+<?php
+
+require_once "PEAR.php";
+
+function error_function($obj) {
+    print "this is error_function reporting: ";
+    print $obj->toString();
+    print "\n";
+}
+class myclass {
+    function error_method($obj) {
+       print "this is myclass::error_method reporting: ";
+       print $obj->toString();
+       print "\n";
+    }
+}
+$obj = new myclass;
+new PEAR_Error("errortest1", 0, PEAR_ERROR_CALLBACK, "error_function");
+new PEAR_Error("errortest2", 0, PEAR_ERROR_CALLBACK,
+              array(&$obj, "error_method"));
+
+
+?>
+--GET--
+--POST--
+--EXPECT--
+this is error_function reporting: [pear_error: message="errortest1" code=0 mode=callback level=notice prefix="" prepend="" append=""]
+this is myclass::error_method reporting: [pear_error: message="errortest2" code=0 mode=callback level=notice prefix="" prepend="" append=""]