Skip to content

Commit fde6ece

Browse files
staabmclxmstaab
andauthored
de-duplicate reflector Error logic (#287)
Co-authored-by: Markus Staab <[email protected]>
1 parent d60db80 commit fde6ece

File tree

3 files changed

+37
-20
lines changed

3 files changed

+37
-20
lines changed

src/Error.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use staabm\PHPStanDba\QueryReflection\MysqliQueryReflector;
66
use staabm\PHPStanDba\QueryReflection\PdoQueryReflector;
7+
use staabm\PHPStanDba\QueryReflection\QuerySimulation;
78

89
/**
910
* @phpstan-type ErrorCodes value-of<MysqliQueryReflector::MYSQL_ERROR_CODES>|value-of<PDOQueryReflector::PDO_ERROR_CODES>
@@ -47,6 +48,38 @@ public function asRuleMessage(): string
4748
return 'Query error: '.$this->getMessage().' ('.$this->getCode().').';
4849
}
4950

51+
/**
52+
* @param ErrorCodes $code
53+
*/
54+
public static function forSyntaxError(\Throwable $exception, $code, string $queryString): self
55+
{
56+
$message = $exception->getMessage();
57+
58+
// make error string consistent across mysql/mariadb
59+
$message = str_replace(' MySQL server', ' MySQL/MariaDB server', $message);
60+
$message = str_replace(' MariaDB server', ' MySQL/MariaDB server', $message);
61+
62+
// to ease debugging, print the error we simulated
63+
$simulatedQuery = QuerySimulation::simulate($queryString);
64+
$message = $message."\n\nSimulated query: ".$simulatedQuery;
65+
66+
return new self($message, $code);
67+
}
68+
69+
/**
70+
* @param ErrorCodes $code
71+
*/
72+
public static function forException(\Throwable $exception, $code): self
73+
{
74+
$message = $exception->getMessage();
75+
76+
// make error string consistent across mysql/mariadb
77+
$message = str_replace(' MySQL server', ' MySQL/MariaDB server', $message);
78+
$message = str_replace(' MariaDB server', ' MySQL/MariaDB server', $message);
79+
80+
return new self($message, $code);
81+
}
82+
5083
/**
5184
* @param array{message: string, code: ErrorCodes} $array
5285
*/

src/QueryReflection/MysqliQueryReflector.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,14 @@ public function validateQueryString(string $queryString): ?Error
5858
$e = $result;
5959

6060
if (\in_array($e->getCode(), self::MYSQL_ERROR_CODES, true)) {
61-
$message = $e->getMessage();
62-
63-
// make error string consistent across mysql/mariadb
64-
$message = str_replace(' MySQL server', ' MySQL/MariaDB server', $message);
65-
$message = str_replace(' MariaDB server', ' MySQL/MariaDB server', $message);
66-
67-
// to ease debugging, print the error we simulated
6861
if (
6962
self::MYSQL_SYNTAX_ERROR_CODE === $e->getCode()
7063
&& QueryReflection::getRuntimeConfiguration()->isDebugEnabled()
7164
) {
72-
$simulatedQuery = QuerySimulation::simulate($queryString);
73-
$message = $message."\n\nSimulated query: ".$simulatedQuery;
65+
return Error::forSyntaxError($e, $e->getCode(), $queryString);
7466
}
7567

76-
return new Error($message, $e->getCode());
68+
return Error::forException($e, $e->getCode());
7769
}
7870

7971
return null;

src/QueryReflection/PdoQueryReflector.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,14 @@ public function validateQueryString(string $queryString): ?Error
7676

7777
$e = $result;
7878
if (\in_array($e->getCode(), self::PDO_ERROR_CODES, true)) {
79-
$message = $e->getMessage();
80-
81-
// make error string consistent across mysql/mariadb
82-
$message = str_replace(' MySQL server', ' MySQL/MariaDB server', $message);
83-
$message = str_replace(' MariaDB server', ' MySQL/MariaDB server', $message);
84-
85-
// to ease debugging, print the error we simulated
8679
if (
8780
\in_array($e->getCode(), self::PDO_SYNTAX_ERROR_CODES, true)
8881
&& QueryReflection::getRuntimeConfiguration()->isDebugEnabled()
8982
) {
90-
$simulatedQuery = QuerySimulation::simulate($queryString);
91-
$message = $message."\n\nSimulated query: '".$simulatedQuery."' Failed.";
83+
return Error::forSyntaxError($e, $e->getCode(), $queryString);
9284
}
9385

94-
return new Error($message, $e->getCode());
86+
return Error::forException($e, $e->getCode());
9587
}
9688

9789
return null;

0 commit comments

Comments
 (0)