r2836 Added EntityNotFoundException to spotEntity()
authorDenis Yeldandi <dyeldandi@gmail.com>
Wed, 10 Jun 2009 16:35:57 +0000 (16:35 +0000)
committerDenis Yeldandi <dyeldandi@gmail.com>
Wed, 10 Jun 2009 16:35:57 +0000 (16:35 +0000)
inc/database.php
inc/exceptions.php [new file with mode: 0644]
inc/functions.php
inc/init.php
inc/interface.php

index 203d706..024441c 100644 (file)
@@ -350,7 +350,10 @@ function spotEntity ($realm, $id)
        global $entityCache;
        if (isset ($entityCache['complete'][$realm]))
        // Emphasize the absence of record, if listCells() has already been called.
-               return (isset ($entityCache['complete'][$realm][$id])) ? $entityCache['complete'][$realm][$id] : NULL;
+               if (isset ($entityCache['complete'][$realm][$id]))
+                       return $entityCache['complete'][$realm][$id];
+               else
+                       throw new EntityNotFoundException ($realm, $id);
        elseif (isset ($entityCache['partial'][$realm][$id]))
                return $entityCache['partial'][$realm][$id];
        global $SQLSchema;
@@ -394,7 +397,7 @@ function spotEntity ($realm, $id)
                        );
        unset ($result);
        if (!isset ($ret['realm'])) // no rows were returned
-               return NULL;
+               throw new EntityNotFoundException ($realm, $id);
        $ret['etags'] = getExplicitTagsOnly ($ret['etags']);
        $ret['itags'] = getImplicitTags ($ret['etags']);
        $ret['atags'] = generateEntityAutoTags ($ret);
diff --git a/inc/exceptions.php b/inc/exceptions.php
new file mode 100644 (file)
index 0000000..01ff2b9
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+class EntityNotFoundException extends Exception {
+       private $entity;
+       private $id;
+       function __construct($entity, $id)
+       {
+               parent::__construct ("Object '$entity'#'$id' does not exist");
+               $this->entity = $entity;
+               $this->id = $id;
+       }
+       function getEntity()
+       {
+               return $this->entity;
+       }
+       function getId()
+       {
+               return $this->id;
+       }
+}
index 045c0ac..43ad54d 100644 (file)
@@ -1100,17 +1100,7 @@ function fixContext ()
                assertUIntArg ($page[$pageno]['bypass'], __FUNCTION__);
                $target_realm = $etype_by_pageno[$pageno];
                $target_id = $_REQUEST[$page[$pageno]['bypass']];
-               if (NULL === ($target = spotEntity ($target_realm, $target_id)))
-               {
-                       showError
-                               (
-                                       "The record you are requesting isn't in the database (any more)\n" .
-                                       "realm: '${target_realm}'\n" .
-                                       "id: '${target_id}'",
-                                       __FUNCTION__
-                               );
-                       die;
-               }
+               $target = spotEntity ($target_realm, $target_id);
                $target_given_tags = $target['etags'];
                // Don't reset autochain, because auth procedures could push stuff there in.
                // Another important point is to ignore 'user' realm, so we don't infuse effective
index a6ceaf7..2821f27 100644 (file)
@@ -23,6 +23,7 @@ if (substr ($root, -1) != '/')
        $root .= '/';
 
 // This is the first thing we need to do.
+require_once 'inc/exceptions.php';
 require_once 'inc/config.php';
 
 // What we need first is database and interface functions.
index a27b5af..47c88e9 100644 (file)
@@ -6020,38 +6020,60 @@ function dynamic_title_decoder ($path_position)
 
 function dumpArray($arr)
 {
-        echo '<table class="exceptionParametersDump">';
-        foreach($arr as $key=>$value)
-        {
-                echo "<tr><th>$key</th><td>$value</td></tr>";
-        }
-        echo '</table>';
+       echo '<table class="exceptionParametersDump">';
+       foreach($arr as $key=>$value)
+       {
+               echo "<tr><th>$key</th><td>$value</td></tr>";
+       }
+       echo '</table>';
 }
 
-function printException($e)
+function print404($e)
 {
-        header("HTTP/1.1 500 Internal Server Error");
-        echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n";
-        echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";
-        echo "<head><title> Exception </title>\n";
-        echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
-        echo "<link rel=stylesheet type='text/css' href=pi.css />\n";
-        echo "<link rel=icon href='" . getFaviconURL() . "' type='image/x-icon' />";
-        echo '</head> <body>';
-        echo '<h2>Uncaught exception: '.get_class($e).'</h2><code>'.$e->getMessage().'</code> (<code>'.$e->getCode().'</code>)';
-        echo '<p>at file <code>'.$e->getFile().'</code>, line <code>'.$e->getLine().'</code></p><pre>';
-        print_r($e->getTrace());
-        echo '</pre>';
-        echo '<h2>Parameters:</h2>';
-        echo '<h3>GET</h3>';
-        dumpArray($_GET);
-        echo '<h3>POST</h3>';
-        dumpArray($_POST);
-        echo '<h3>COOKIE</h3>';
-        dumpArray($_COOKIE);
-        echo '</body></html>';
+       header("HTTP/1.1 404 Not Found");
+       echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n";
+       echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";
+       echo "<head><title> Exception </title>\n";
+       echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+       echo "<link rel=stylesheet type='text/css' href=pi.css />\n";
+       echo "<link rel=icon href='" . getFaviconURL() . "' type='image/x-icon' />";
+       echo '</head> <body>';
+       echo '<h2>Object: '.$e->getEntity().'#'.$e->getId().' not found</h2>';
+       echo '</body></html>';
 
 }
 
+function printGenericException($e)
+{
+       header("HTTP/1.1 500 Internal Server Error");
+       echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n";
+       echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";
+       echo "<head><title> Exception </title>\n";
+       echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+       echo "<link rel=stylesheet type='text/css' href=pi.css />\n";
+       echo "<link rel=icon href='" . getFaviconURL() . "' type='image/x-icon' />";
+       echo '</head> <body>';
+       echo '<h2>Uncaught exception: '.get_class($e).'</h2><code>'.$e->getMessage().'</code> (<code>'.$e->getCode().'</code>)';
+       echo '<p>at file <code>'.$e->getFile().'</code>, line <code>'.$e->getLine().'</code></p><pre>';
+       print_r($e->getTrace());
+       echo '</pre>';
+       echo '<h2>Parameters:</h2>';
+       echo '<h3>GET</h3>';
+       dumpArray($_GET);
+       echo '<h3>POST</h3>';
+       dumpArray($_POST);
+       echo '<h3>COOKIE</h3>';
+       dumpArray($_COOKIE);
+       echo '</body></html>';
+
+}
+
+function printException($e)
+{
+       if (get_class($e) == 'EntityNotFoundException')
+               print404($e);
+       else
+               printGenericException($e);
+}
 
 ?>