refine delivery of rack thumb images
authorDenis Ovsienko <denis@ovsienko.info>
Tue, 6 Jun 2017 10:27:54 +0000 (11:27 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Tue, 6 Jun 2017 10:27:54 +0000 (11:27 +0100)
A read-only RackTables instance would display an error image instead of
the thumbnail image for any rack that has invalidated thumbnail cache.
This change makes it deliver the thumbnail even if the attempted cache
update failed because of insufficient database permissions.

* RTDBTableAccessDenied: a new exception class
* convertPDOException(): add a respective case block for the error code
* dispatchMiniRackThumbRequest(): use the above for its REPLACE and
  update the comment

ChangeLog
wwwroot/inc/database.php
wwwroot/inc/exceptions.php
wwwroot/inc/solutions.php

index 8fc77abd231ad4dcde2e64b2caebd08c39ab6e3d..8299d3932c2599462ed3cf99b4feb48b35732698 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
        update: display MySQL warnings in debug mode
        update: better display objects that have no common name
        update: highlight RackCode syntax in the Permissions viewer too
+       update: refine delivery of rack thumb images
 0.20.13 2017-05-12
        update: fix performance for pages with images (GH#190 by Michael A. Mikhailov)
        update: improve SNMP support for Brocade devices (GH#180 by Chris Jones)
index f412a3e41050c93994764e77cef184bc0e1ebf8a..8dd4342464dfdc8c7ff420a8ee7ef86198cf20b7 100644 (file)
@@ -3891,6 +3891,8 @@ function convertPDOException ($e)
        case 'HY000-1205':
                $text = 'lock wait timeout';
                break;
+       case '42000-1142':
+               return new RTDBTableAccessDenied ($e->getMessage());
        default:
                return $e;
        }
index a26a70c74fe960d42f0899fb349c4e93d5b75b50..de890cbbdcd5eead8ea768cbd92753dfabdb11d2 100644 (file)
@@ -220,6 +220,19 @@ class RTDatabaseError extends RackTablesError
        }
 }
 
+// This specifically means the error condition that happens when the database user
+// does not have the privileges to execute the query. The code that catches this
+// exception class has to interpret what it actually means based on the query it
+// was trying to execute. If not specifically expected, the exception will end up
+// in the same catch blocks as RTDatabaseError.
+class RTDBTableAccessDenied extends RTDatabaseError
+{
+       public function dispatch()
+       {
+               RackTablesError::genHTMLPage ('Database table access denied', '<h2>Database table access denied</h2><br>' . $this->message);
+       }
+};
+
 // gateway failure is a common case of a "soft" error, some functions do catch this
 class RTGatewayError extends RackTablesError
 {
index c50a0eeb472e9341aecee00bf0fd7c0b639ea7e1..cceeb72e64388a659519d9e7ca55e6ffb8dc783d 100644 (file)
@@ -139,8 +139,10 @@ function createTrueColorOrThrow ($context, $width, $height)
        return $img;
 }
 
-# Generate a complete HTTP response for a 1:1 minirack image, use and update
-# SQL cache where appropriate.
+// Generate a complete HTTP response for a 1:1 minirack image, use and update
+// SQL cache where appropriate. Suppress SQL cache update failures caused by
+// insufficient database privileges as that likely means a connection that is
+// read-only on purpose.
 function dispatchMiniRackThumbRequest ($rack_id)
 {
        if (NULL !== ($thumbcache = loadThumbCache ($rack_id)))
@@ -154,11 +156,18 @@ function dispatchMiniRackThumbRequest ($rack_id)
        $capture = ob_get_clean();
        header ('Content-Type: image/png');
        echo $capture;
-       usePreparedExecuteBlade
-       (
-               'REPLACE INTO RackThumbnail SET rack_id=?, thumb_data=?',
-               array ($rack_id, base64_encode ($capture))
-       );
+       try
+       {
+               usePreparedExecuteBlade
+               (
+                       'REPLACE INTO RackThumbnail SET rack_id=?, thumb_data=?',
+                       array ($rack_id, base64_encode ($capture))
+               );
+       }
+       catch (RTDBTableAccessDenied $e)
+       {
+               // keep going
+       }
 }
 
 # Generate a binary PNG image for a rack contents.