Browse Source

Pass query and pdoexception as constructor args to QueryException.

ADmad 2 years ago
parent
commit
0591687af0

+ 6 - 11
src/Database/Driver.php

@@ -258,10 +258,7 @@ abstract class Driver
         try {
             return $this->getPdo()->exec($sql);
         } catch (PDOException $e) {
-            $e = new QueryException($e->getMessage(), (int)$e->getCode(), $e);
-            $e->setQuery($sql);
-
-            throw $e;
+            throw new QueryException($sql, $e);
         }
     }
 
@@ -367,16 +364,14 @@ abstract class Driver
         StatementInterface $statement,
         ?array $params = null
     ): QueryException {
-        $e = new QueryException($exception->getMessage(), (int)$exception->getCode(), $exception);
         $loggedQuery = new LoggedQuery();
         $loggedQuery->setContext([
             'query' => $statement->queryString(),
             'driver' => $this,
             'params' => $params ?? $statement->getBoundParams(),
         ]);
-        $e->setQuery($loggedQuery);
 
-        return $e;
+        return new QueryException($loggedQuery, $exception);
     }
 
     /**
@@ -390,10 +385,10 @@ abstract class Driver
         try {
             $statement = $this->getPdo()->prepare($query instanceof Query ? $query->sql() : $query);
         } catch (PDOException $e) {
-            $exception = new QueryException($e->getMessage(), (int)$e->getCode(), $e);
-            $exception->setQuery($query instanceof Query ? $query->sql() : $query);
-
-            throw $exception;
+            throw new QueryException(
+                $query instanceof Query ? $query->sql() : $query,
+                $e
+            );
         }
 
         $typeMap = null;

+ 4 - 10
src/Database/Exception/QueryException.php

@@ -21,17 +21,15 @@ use PDOException;
 
 class QueryException extends PDOException
 {
-    protected LoggedQuery|string|null $query = null;
-
     /**
-     * Set the query that caused this exception.
+     * Constructor
      *
      * @param \Cake\Database\Log\LoggedQuery|string $query
-     * @return void
+     * @param \PDOException $previous
      */
-    public function setQuery(LoggedQuery|string $query): void
+    public function __construct(protected LoggedQuery|string $query, PDOException $previous)
     {
-        $this->query = $query;
+        parent::__construct($previous->getMessage(), (int)$previous->getCode(), $previous);
     }
 
     /**
@@ -41,10 +39,6 @@ class QueryException extends PDOException
      */
     public function getQueryString(): string
     {
-        if ($this->query === null) {
-            return '';
-        }
-
         if ($this->query instanceof LoggedQuery) {
             return (string)$this->query;
         }

+ 3 - 2
tests/TestCase/Error/Renderer/WebExceptionRendererTest.php

@@ -46,6 +46,7 @@ use Cake\View\Exception\MissingLayoutException;
 use Cake\View\Exception\MissingTemplateException;
 use Exception;
 use OutOfBoundsException;
+use PDOException;
 use RuntimeException;
 use TestApp\Controller\Admin\ErrorController as PrefixErrorController;
 use TestApp\Error\Exception\MissingWidgetThing;
@@ -950,14 +951,14 @@ class WebExceptionRendererTest extends TestCase
      */
     public function testPDOException(): void
     {
-        $exception = new QueryException();
         $loggedQuery = new LoggedQuery();
         $loggedQuery->setContext([
             'query' => 'SELECT * from poo_query < 5 and :seven',
             'driver' => $this->getMockBuilder(Driver::class)->getMock(),
             'params' => ['seven' => 7],
         ]);
-        $exception->setQuery($loggedQuery);
+        $pdoException = $this->getMockBuilder(PDOException::class)->getMock();
+        $exception = new QueryException($loggedQuery, $pdoException);
 
         $ExceptionRenderer = new WebExceptionRenderer($exception);
         $response = $ExceptionRenderer->render();

+ 3 - 2
tests/TestCase/View/ViewTest.php

@@ -35,6 +35,7 @@ use Error;
 use Exception;
 use InvalidArgumentException;
 use LogicException;
+use PDOException;
 use RuntimeException;
 use TestApp\Controller\ThemePostsController;
 use TestApp\Controller\ViewPostsController;
@@ -1087,8 +1088,8 @@ class ViewTest extends TestCase
      */
     public function testRenderUsingLayoutArgument(): void
     {
-        $error = new QueryException();
-        $error->setQuery('this is sql string');
+        $pdoException = $this->getMockBuilder(PDOException::class)->getMock();
+        $error = new QueryException('this is sql string', $pdoException);
         $exceptions = [$error];
         $message = 'it works';
         $trace = $error->getTrace();