r3766 process.php: catch E_DB_CONSTRAINT exception locally to put its message into...
authorDenis Ovsienko <infrastation@yandex.ru>
Tue, 8 Jun 2010 11:13:12 +0000 (11:13 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 8 Jun 2010 11:13:12 +0000 (11:13 +0000)
usePreparedInsertBlade(): detect constraint violation error
usePreparedDeleteBlade(): idem
printException(): add handling og E_DB_CONSTRAINT code

inc/config.php
inc/database.php
inc/exceptions.php
inc/interface.php
process.php

index 18677586670a0700ffe07cd88fba38715b9434e3..f04da3072201f0fd15fa0889fa8c3d57727b8a0f 100644 (file)
@@ -57,6 +57,7 @@ define ('E_NOT_AUTHENTICATED', 4);
 define ('E_NOT_AUTHORIZED', 5);
 define ('E_MISCONFIGURED', 6);
 define ('E_GW_FAILURE', 7);
+define ('E_DB_CONSTRAINT', 8);
 define ('VLAN_MIN_ID', 1);
 define ('VLAN_MAX_ID', 4094);
 define ('VLAN_DFL_ID', 1);
index 59aad04b846d1958f6cafb6b77201892169ae2b8..0cc7e750403664c5e5e9eafdfd214b4c6c961d63 100644 (file)
@@ -2175,9 +2175,30 @@ function usePreparedInsertBlade ($tablename, $columns)
        // Now the query should be as follows:
        // INSERT INTO table (c1, c2, c3) VALUES (?, ?, ?)
        $prepared = $dbxlink->prepare ($query);
-       if (!$prepared->execute (array_values ($columns)))
-               return FALSE;
-       return $prepared->rowCount() == 1;
+       try
+       {
+               if (!$prepared->execute (array_values ($columns)))
+                       return FALSE;
+               return $prepared->rowCount() == 1;
+       }
+       catch (PDOException $e)
+       {
+               if ($e->getCode() != 23000)
+                       throw $e;
+               switch ($e->errorInfo[1])
+               {
+               case 1062:
+                       $text = 'such record already exists';
+                       break;
+               case 1452:
+                       $text = 'foreign key violation';
+                       break;
+               default:
+                       $text = 'unknown error code ' . $e->errorInfo[1];
+                       break;
+               }
+               throw new Exception ($text, E_DB_CONSTRAINT);
+       }
 }
 
 // This swiss-knife blade deletes one record from the specified table
@@ -2200,9 +2221,27 @@ function usePreparedDeleteBlade ($tablename, $columns, $conjunction = 'AND')
                $conj = $conjunction;
        }
        $prepared = $dbxlink->prepare ($query);
-       if (!$prepared->execute (array_values ($columns)))
-               return FALSE;
-       return $prepared->rowCount(); // FALSE !== 0
+       try
+       {
+               if (!$prepared->execute (array_values ($columns)))
+                       return FALSE;
+               return $prepared->rowCount(); // FALSE !== 0
+       }
+       catch (PDOException $e)
+       {
+               if ($e->getCode() != 23000)
+                       throw $e;
+               switch ($e->errorInfo[1])
+               {
+               case 1451:
+                       $text = 'foreign key violation';
+                       break;
+               default:
+                       $text = 'unknown error code ' . $e->errorInfo[1];
+                       break;
+               }
+               throw new Exception ($text, E_DB_CONSTRAINT);
+       }
 }
 
 function useSelectBlade ($query)
index 0926991a19d4c4086fd8034a2011c4e2daf479f9..d47332d5c27ac4a845dbf6424204978d0613e0a4 100644 (file)
@@ -206,6 +206,7 @@ function printException($e)
                        header ('WWW-Authenticate: Basic realm="' . getConfigVar ('enterprise') . ' RackTables access"');
                        header ("HTTP/1.1 401 Unauthorized");
                case E_MISCONFIGURED:
+               case E_DB_CONSTRAINT:
                        header ('Content-Type: text/html; charset=UTF-8');
                        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";
@@ -213,11 +214,13 @@ function printException($e)
                        (
                                E_NOT_AUTHENTICATED => 'Not authenticated',
                                E_MISCONFIGURED => 'Configuration error',
+                               E_DB_CONSTRAINT => 'Constraint violation',
                        );
                        $msgbody = array
                        (
                                E_NOT_AUTHENTICATED => '<h2>This system requires authentication. You should use a username and a password.</h2>',
                                E_MISCONFIGURED => '<h2>Configuration error</h2><br>' . $e->getMessage(),
+                               E_DB_CONSTRAINT => '<h2>Constraint violation</h2><br>' . $e->getMessage(),
                        );
                        echo '<head><title>' . $msgheader[$e->getCode()] . '</title>';
                        echo '</head><body>' . $msgbody[$e->getCode()] . '</body></html>';
index 2ba5a646ed276b7c0753cb667a8b94261fd65aed..748e6e3477d600671d1ea76213a0e7c8235ea6e3 100644 (file)
@@ -1582,7 +1582,7 @@ function showMessageOrError ()
                                105 => array ('code' => 'error', 'format' => 'default VLAN cannot be changed'),
 // ...
 // ...
-// ...
+                               108 => array ('code' => 'error', 'format' => 'Constraint error: %s'),
                                109 => array ('code' => 'error', 'format' => 'Update failed!'),
                                110 => array ('code' => 'error', 'format' => 'Supplement failed!'),
                                111 => array ('code' => 'error', 'format' => 'Reduction failed!'),
index 5a75b0b5923559e1409ec575b85fa78ac5281726..d3e2bb524c92e843b0135d70738e7d57d8085887 100644 (file)
@@ -33,7 +33,10 @@ ob_end_flush();
 catch (Exception $e)
 {
        ob_end_clean();
-       printException($e);
+       if ($e->getCode() == E_DB_CONSTRAINT)
+               header ('Location: ' . buildWideRedirectURL (oneLiner (108, array ($e->getMessage()))));
+       else
+               printException($e);
 }
 
 ?>