From 6e8ef1fcfc262de81727267604240c33743a27fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 23 Nov 2021 22:53:31 +0100 Subject: [PATCH 1/2] Do not dump query twice on SQL exception --- docs/hooks.rst | 4 ++-- src/Persistence/Sql.php | 22 ++++++---------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/docs/hooks.rst b/docs/hooks.rst index fce50cdc3..0edf79638 100644 --- a/docs/hooks.rst +++ b/docs/hooks.rst @@ -244,10 +244,10 @@ Save information into auditLog about failure: Upgrade schema: - use Atk4\Data\Persistence\Sql\Exception as DsqlException; + use Atk4\Data\Persistence\Sql\Exception as SqlException; $m->onHook(Model::HOOK_ROLLBACK, function($m, $exception) { - if ($exception instanceof DsqlException) { + if ($exception instanceof SqlException) { $m->schema->upgrade(); $m->breakHook(false); // exception will not be thrown } diff --git a/src/Persistence/Sql.php b/src/Persistence/Sql.php index e24049f70..dde172bc1 100644 --- a/src/Persistence/Sql.php +++ b/src/Persistence/Sql.php @@ -10,7 +10,7 @@ use Atk4\Data\Model; use Atk4\Data\Persistence; use Atk4\Data\Persistence\Sql\Connection; -use Atk4\Data\Persistence\Sql\Exception as DsqlException; +use Atk4\Data\Persistence\Sql\Exception as SqlException; use Atk4\Data\Persistence\Sql\Expression; use Atk4\Data\Persistence\Sql\Query; use Doctrine\DBAL\Platforms\AbstractPlatform; @@ -529,10 +529,8 @@ public function tryLoad(Model $model, $id): ?array ->addMoreInfo('id', $noId ? null : $id); } $data = $this->typecastLoadRow($model, $rowsRaw[0]); - } catch (DsqlException $e) { + } catch (SqlException $e) { throw (new Exception('Unable to load due to query error', 0, $e)) - ->addMoreInfo('query', $query->getDebugQuery()) - ->addMoreInfo('message', $e->getMessage()) ->addMoreInfo('model', $model) ->addMoreInfo('scope', $model->scope()->toWords()); } @@ -565,10 +563,8 @@ public function insert(Model $model, array $data): string try { $model->hook(self::HOOK_BEFORE_INSERT_QUERY, [$insert]); $st = $insert->execute(); - } catch (DsqlException $e) { + } catch (SqlException $e) { throw (new Exception('Unable to execute insert query', 0, $e)) - ->addMoreInfo('query', $insert->getDebugQuery()) - ->addMoreInfo('message', $e->getMessage()) ->addMoreInfo('model', $model) ->addMoreInfo('scope', $model->getModel(true)->scope()->toWords()); } @@ -606,10 +602,8 @@ public function prepareIterator(Model $model): \Traversable try { return $export->getRowsIterator(); - } catch (DsqlException $e) { + } catch (SqlException $e) { throw (new Exception('Unable to execute iteration query', 0, $e)) - ->addMoreInfo('query', $export->getDebugQuery()) - ->addMoreInfo('message', $e->getMessage()) ->addMoreInfo('model', $model) ->addMoreInfo('scope', $model->scope()->toWords()); } @@ -639,10 +633,8 @@ public function update(Model $model, $id, array $data): void if ($data) { $st = $update->execute(); } - } catch (DsqlException $e) { + } catch (SqlException $e) { throw (new Exception('Unable to update due to query error', 0, $e)) - ->addMoreInfo('query', $update->getDebugQuery()) - ->addMoreInfo('message', $e->getMessage()) ->addMoreInfo('model', $model) ->addMoreInfo('scope', $model->getModel(true)->scope()->toWords()); } @@ -684,10 +676,8 @@ public function delete(Model $model, $id): void try { $delete->execute(); - } catch (DsqlException $e) { + } catch (SqlException $e) { throw (new Exception('Unable to delete due to query error', 0, $e)) - ->addMoreInfo('query', $delete->getDebugQuery()) - ->addMoreInfo('message', $e->getMessage()) ->addMoreInfo('model', $model) ->addMoreInfo('scope', $model->getModel(true)->scope()->toWords()); } From ce5aeba27bec02c204624f430821d6aae78d096e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Tue, 23 Nov 2021 23:00:19 +0100 Subject: [PATCH 2/2] improve local variable names --- src/Reference/HasOneSql.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Reference/HasOneSql.php b/src/Reference/HasOneSql.php index d2e98c62c..64fd47d61 100644 --- a/src/Reference/HasOneSql.php +++ b/src/Reference/HasOneSql.php @@ -4,7 +4,6 @@ namespace Atk4\Data\Reference; -use Atk4\Data\Field; use Atk4\Data\Field\SqlExpressionField; use Atk4\Data\Model; @@ -13,10 +12,10 @@ class HasOneSql extends HasOne /** * Creates expression which sub-selects a field inside related model. */ - public function addField(string $ourFieldName, string $theirFieldName = null, array $defaults = []): SqlExpressionField + public function addField(string $fieldName, string $theirFieldName = null, array $defaults = []): SqlExpressionField { if ($theirFieldName === null) { - $theirFieldName = $ourFieldName; + $theirFieldName = $fieldName; } $ourModel = $this->getOurModel(null); @@ -29,7 +28,7 @@ public function addField(string $ourFieldName, string $theirFieldName = null, ar $defaults['caption'] ??= $refModelField->caption; $defaults['ui'] ??= $refModelField->ui; - $fieldExpression = $ourModel->addExpression($ourFieldName, array_merge( + $fieldExpression = $ourModel->addExpression($fieldName, array_merge( [ function (Model $ourModel) use ($theirFieldName) { // remove order if we just select one field from hasOne model @@ -47,17 +46,17 @@ function (Model $ourModel) use ($theirFieldName) { )); // Will try to execute last - $this->onHookToOurModel($ourModel, Model::HOOK_BEFORE_SAVE, function (Model $ourModel) use ($ourFieldName, $theirFieldName) { - // if title field is changed, but reference ID field (our_field) + $this->onHookToOurModel($ourModel, Model::HOOK_BEFORE_SAVE, function (Model $ourModel) use ($fieldName, $theirFieldName) { + // if field is changed, but reference ID field (our_field) // is not changed, then update reference ID field value - if ($ourModel->isDirty($ourFieldName) && !$ourModel->isDirty($this->our_field)) { + if ($ourModel->isDirty($fieldName) && !$ourModel->isDirty($this->our_field)) { $theirModel = $this->createTheirModel(); - $theirModel->addCondition($theirFieldName, $ourModel->get($ourFieldName)); + $theirModel->addCondition($theirFieldName, $ourModel->get($fieldName)); $ourModel->set($this->getOurFieldName(), $theirModel->action('field', [$theirModel->id_field])); - $ourModel->_unset($ourFieldName); + $ourModel->_unset($fieldName); } - }, [], 21); + }, [], 20); return $fieldExpression; }