]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Handle DB_DataObject errors better
authorEvan Prodromou <evan@controlyourself.ca>
Wed, 11 Feb 2009 19:45:06 +0000 (14:45 -0500)
committerEvan Prodromou <evan@controlyourself.ca>
Wed, 11 Feb 2009 19:45:06 +0000 (14:45 -0500)
We try to handle DB_DataObject errors a little bit better. Previously,
they just spit out a cryptic string to the browser with a suggestion
to turn on debugging (not a good idea!). So, we catch the error, write
the full error message to the log, and then tell users that the can
contact the admins if they need to.

index.php
lib/dberroraction.php [new file with mode: 0644]
lib/htmloutputter.php

index 717b17361d2f7f60c343cf9c9f3ad3e33b11632c..4db0e7555bed2be542e79197fe499903091a1a3d 100644 (file)
--- a/index.php
+++ b/index.php
@@ -25,7 +25,8 @@ require_once INSTALLDIR . '/lib/common.php';
 $user = null;
 $action = null;
 
-function getPath($req) {
+function getPath($req)
+{
     if (common_config('site', 'fancy')) {
         return $req['p'];
     } else if ($_SERVER['PATH_INFO']) {
@@ -35,10 +36,30 @@ function getPath($req) {
     }
 }
 
-function main() {
+function handleError($error)
+{
+    common_log(LOG_ERR, "PEAR error: " . $error->getMessage());
+    $msg = sprintf(_('The database for %s isn\'t responding correctly, '.
+                     'so the site won\'t work properly. '.
+                     'The site admins probably know about the problem, '.
+                     'but you can contact them at %s to make sure. '.
+                     'Otherwise, wait a few minutes and try again.'),
+                   common_config('site', 'name'),
+                   common_config('site', 'email'));
+
+    $dac = new DBErrorAction($msg, 500);
+    $dac->showPage();
+    exit(-1);
+}
 
+function main()
+{
     global $user, $action;
 
+    // For database errors
+
+    PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
+
     // XXX: we need a little more structure in this script
 
     // get and cache current user
diff --git a/lib/dberroraction.php b/lib/dberroraction.php
new file mode 100644 (file)
index 0000000..0dc9249
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * DB error action.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @author   Zach Copley <zach@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ *
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/servererroraction.php';
+
+/**
+ * Class for displaying DB Errors
+ *
+ * This only occurs if there's been a DB_DataObject_Error that's
+ * reported through PEAR, so we try to avoid doing anything that connects
+ * to the DB, so we don't trigger it again.
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://laconi.ca/
+ */
+
+class DBErrorAction extends ServerErrorAction
+{
+    function __construct($message='Error', $code=500)
+    {
+        parent::__construct($message, $code);
+    }
+
+    function title()
+    {
+        return _('Database error');
+    }
+
+    function getLanguage()
+    {
+        // Don't try to figure out user's language; just show the page
+        return common_config('site', 'language');
+    }
+
+    function showPrimaryNav()
+    {
+        // don't show primary nav
+    }
+}
index e2319b1fdc2a10bc54851c194d6b165c84888f20..45e61d2fc6b32137ca2f875a24e2a1679f7fe9b6 100644 (file)
@@ -108,22 +108,26 @@ class HTMLOutputter extends XMLOutputter
         }
 
         header('Content-Type: '.$type);
-        
+
         $this->extraHeaders();
 
         $this->startXML('html',
                         '-//W3C//DTD XHTML 1.0 Strict//EN',
                         'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
 
-        // FIXME: correct language for interface
-
-        $language = common_language();
+        $language = $this->getLanguage();
 
         $this->elementStart('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
                                           'xml:lang' => $language,
                                           'lang' => $language));
     }
 
+    function getLanguage()
+    {
+        // FIXME: correct language for interface
+        return common_language();
+    }
+
     /**
     *  Ends an HTML document
     *
@@ -134,7 +138,7 @@ class HTMLOutputter extends XMLOutputter
         $this->elementEnd('html');
         $this->endXML();
     }
-    
+
     /**
     *  To specify additional HTTP headers for the action
     *