-
Notifications
You must be signed in to change notification settings - Fork 55
Unique Exception #733
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Unique Exception #733
Changes from all commits
f87ec3d
726868a
bbd9f4f
c9daebf
e4412d7
53e1a2e
07f9850
231d53e
2b59a27
22648b0
6c651e7
ce620a6
6a9c42a
968fff6
eda18d6
7ce3ae6
a163eb3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,6 +13,7 @@ | |
| use Utopia\Database\Exception\Timeout as TimeoutException; | ||
| use Utopia\Database\Exception\Transaction as TransactionException; | ||
| use Utopia\Database\Exception\Truncate as TruncateException; | ||
| use Utopia\Database\Exception\Unique as UniqueException; | ||
| use Utopia\Database\Helpers\ID; | ||
| use Utopia\Database\Query; | ||
|
|
||
|
|
@@ -1916,7 +1917,16 @@ protected function processException(PDOException $e): \Exception | |
|
|
||
| // Duplicate row | ||
| if ($e->getCode() === '23505' && isset($e->errorInfo[1]) && $e->errorInfo[1] === 7) { | ||
| return new DuplicateException('Document already exists', $e->getCode(), $e); | ||
| if (preg_match('/Key \(([^)]+)\)=\(.+\) already exists/', $e->getMessage(), $matches)) { | ||
| $columns = array_map('trim', explode(',', $matches[1])); | ||
| sort($columns); | ||
| $target = $this->sharedTables ? ['_tenant', '_uid'] : ['_uid']; | ||
| if ($columns == $target) { | ||
| return new DuplicateException('Document already exists', $e->getCode(), $e); | ||
| } | ||
| } | ||
|
|
||
| return new UniqueException('Unique index violation', $e->getCode(), $e); | ||
| } | ||
|
Comment on lines
1919
to
1930
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
If |
||
|
|
||
| // Data is too big for column resize | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -8,11 +8,11 @@ | |||||||||||||
| use Utopia\Database\Database; | ||||||||||||||
| use Utopia\Database\Document; | ||||||||||||||
| use Utopia\Database\Exception as DatabaseException; | ||||||||||||||
| use Utopia\Database\Exception\Duplicate; | ||||||||||||||
| use Utopia\Database\Exception\Duplicate as DuplicateException; | ||||||||||||||
| use Utopia\Database\Exception\NotFound as NotFoundException; | ||||||||||||||
| use Utopia\Database\Exception\Timeout as TimeoutException; | ||||||||||||||
| use Utopia\Database\Exception\Transaction as TransactionException; | ||||||||||||||
| use Utopia\Database\Exception\Unique as UniqueException; | ||||||||||||||
| use Utopia\Database\Helpers\ID; | ||||||||||||||
|
|
||||||||||||||
| /** | ||||||||||||||
|
|
@@ -517,7 +517,7 @@ public function deleteIndex(string $collection, string $id): bool | |||||||||||||
| * @return Document | ||||||||||||||
| * @throws Exception | ||||||||||||||
| * @throws PDOException | ||||||||||||||
| * @throws Duplicate | ||||||||||||||
| * @throws UniqueException | ||||||||||||||
| */ | ||||||||||||||
| public function createDocument(Document $collection, Document $document): Document | ||||||||||||||
| { | ||||||||||||||
|
|
@@ -619,10 +619,7 @@ public function createDocument(Document $collection, Document $document): Docume | |||||||||||||
| $stmtPermissions->execute(); | ||||||||||||||
| } | ||||||||||||||
| } catch (PDOException $e) { | ||||||||||||||
| throw match ($e->getCode()) { | ||||||||||||||
| "1062", "23000" => new Duplicate('Duplicated document: ' . $e->getMessage()), | ||||||||||||||
| default => $e, | ||||||||||||||
| }; | ||||||||||||||
| throw $this->processException($e); | ||||||||||||||
| } | ||||||||||||||
|
|
||||||||||||||
|
|
||||||||||||||
|
|
@@ -639,7 +636,7 @@ public function createDocument(Document $collection, Document $document): Docume | |||||||||||||
| * @return Document | ||||||||||||||
| * @throws Exception | ||||||||||||||
| * @throws PDOException | ||||||||||||||
| * @throws Duplicate | ||||||||||||||
| * @throws UniqueException | ||||||||||||||
| */ | ||||||||||||||
| public function updateDocument(Document $collection, string $id, Document $document, bool $skipPermissions): Document | ||||||||||||||
| { | ||||||||||||||
|
|
@@ -841,11 +838,7 @@ public function updateDocument(Document $collection, string $id, Document $docum | |||||||||||||
| $stmtAddPermissions->execute(); | ||||||||||||||
| } | ||||||||||||||
| } catch (PDOException $e) { | ||||||||||||||
| throw match ($e->getCode()) { | ||||||||||||||
| '1062', | ||||||||||||||
| '23000' => new Duplicate('Duplicated document: ' . $e->getMessage()), | ||||||||||||||
| default => $e, | ||||||||||||||
| }; | ||||||||||||||
| throw $this->processException($e); | ||||||||||||||
| } | ||||||||||||||
|
|
||||||||||||||
| return $document; | ||||||||||||||
|
|
@@ -1248,9 +1241,21 @@ protected function processException(PDOException $e): \Exception | |||||||||||||
| return new TimeoutException('Query timed out', $e->getCode(), $e); | ||||||||||||||
| } | ||||||||||||||
|
|
||||||||||||||
| // Duplicate | ||||||||||||||
| if ($e->getCode() === 'HY000' && isset($e->errorInfo[1]) && $e->errorInfo[1] === 1) { | ||||||||||||||
| return new DuplicateException('Document already exists', $e->getCode(), $e); | ||||||||||||||
| // Duplicate row | ||||||||||||||
| if ($e->getCode() === '23000' && ($e->errorInfo[1] ?? null) === 19) { | ||||||||||||||
| $msg = $e->errorInfo[2] ?? $e->getMessage(); | ||||||||||||||
|
|
||||||||||||||
| // Match all table.column pairs (handles commas & spaces) | ||||||||||||||
| if (preg_match_all('/\b([^.]+)\.([^\s,]+)/', $msg, $matches, PREG_SET_ORDER)) { | ||||||||||||||
| $columns = array_map(fn ($m) => $m[2], $matches); | ||||||||||||||
| sort($columns); | ||||||||||||||
|
|
||||||||||||||
| if ($columns === ['_tenant', '_uid'] || in_array('_uid', $columns)) { | ||||||||||||||
| return new DuplicateException('Document already exists', $e->getCode(), $e); | ||||||||||||||
| } | ||||||||||||||
|
Comment on lines
+1253
to
+1255
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||
| } | ||||||||||||||
|
|
||||||||||||||
| return new UniqueException('Unique index violation', $e->getCode(), $e); | ||||||||||||||
| } | ||||||||||||||
|
|
||||||||||||||
| return $e; | ||||||||||||||
|
|
||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,9 @@ | ||||||
| <?php | ||||||
|
|
||||||
| namespace Utopia\Database\Exception; | ||||||
|
|
||||||
| use Utopia\Database\Exception; | ||||||
|
|
||||||
| class Unique extends Exception | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
It also preserves backward compatibility: existing catch blocks for
Suggested change
with |
||||||
| { | ||||||
| } | ||||||
Uh oh!
There was an error while loading. Please reload this page.