From e0ec140661e520ad7e14ae45086693c4043190e9 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Tue, 25 Feb 2025 14:09:41 +0000 Subject: [PATCH] - Sqlite now handles concurrency with transactions --- src/Adapter/SQLite.php | 1 + src/Common/PdoObject.php | 6 ++---- src/Common/PdoObject/SqlPdoObject.php | 11 +++++++---- src/Common/PdoObject/SqlitePdoObject.php | 13 +++++++++++++ src/SearchRequest/Attribute/SearchParameter.php | 2 +- src/SearchRequest/SearchRequestFromRequestTrait.php | 3 ++- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/Adapter/SQLite.php b/src/Adapter/SQLite.php index 7433c58..b8ce40f 100644 --- a/src/Adapter/SQLite.php +++ b/src/Adapter/SQLite.php @@ -27,6 +27,7 @@ class SQLite implements AdapterInterface, MigrateInterface, SqlAdapterInterface public function connect() : PdoObject { try { + #$pdo = new PdoObject($this->buildDataSourceName(), null, null); $pdo = new PdoObject\SqlitePdoObject($this->buildDataSourceName(), null, null); $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); diff --git a/src/Common/PdoObject.php b/src/Common/PdoObject.php index e1989fb..b05ed96 100644 --- a/src/Common/PdoObject.php +++ b/src/Common/PdoObject.php @@ -56,7 +56,7 @@ class PdoObject extends PDO { } } catch (\Throwable $e) { - throw new \PdoException($e->getMessage() . " `$sql` with data:" . json_encode($parameters)); + throw new \PdoException($e->getMessage() . " `$sql` with data:" . json_encode($parameters), (int) $e->getCode(), $e); } return null; @@ -83,7 +83,7 @@ class PdoObject extends PDO { $this->lastInsertId = null; try { - if ( ! $this->inTransaction() ) { + if (! $this->inTransaction()) { $this->beginTransaction(); } @@ -113,8 +113,6 @@ class PdoObject extends PDO { catch (\Throwable $e) { throw $e; } - - return null; } protected function bindVariables(PDOStatement $statement, array &$parameters) : void diff --git a/src/Common/PdoObject/SqlPdoObject.php b/src/Common/PdoObject/SqlPdoObject.php index 2c4919a..0ab3e06 100644 --- a/src/Common/PdoObject/SqlPdoObject.php +++ b/src/Common/PdoObject/SqlPdoObject.php @@ -12,7 +12,7 @@ class SqlPdoObject extends \Ulmus\Common\PdoObject return $this->openTransaction(); } - return $this->exec('SAVEPOINT transaction_'.$this->openedTransaction) !== false; + return $this->exec("SAVEPOINT transaction_{$this->openedTransaction}") !== false; } public function commit() : bool @@ -21,16 +21,19 @@ class SqlPdoObject extends \Ulmus\Common\PdoObject return parent::commit(); } - return false; + return $this->exec("RELEASE SAVEPOINT transaction_{$this->openedTransaction}") !== false; } public function rollback() : bool { - if (0 !== $this->openedTransaction) { + if ($this->openedTransaction > 1) { return $this->exec('ROLLBACK TO transaction_' . $this->openedTransaction--) !== false; } + elseif ($this->openedTransaction-- === 1) { + return parent::rollback(); + } - return parent::rollback(); + return false; } protected function openTransaction() : bool diff --git a/src/Common/PdoObject/SqlitePdoObject.php b/src/Common/PdoObject/SqlitePdoObject.php index 616d187..9502878 100644 --- a/src/Common/PdoObject/SqlitePdoObject.php +++ b/src/Common/PdoObject/SqlitePdoObject.php @@ -17,6 +17,19 @@ class SqlitePdoObject extends SqlPdoObject return $this->exec("COMMIT") !== false; } + return $this->exec("RELEASE SAVEPOINT transaction_{$this->openedTransaction}") !== false; + } + + public function rollback() : bool + { + if ($this->openedTransaction > 1) { + return $this->exec('ROLLBACK TO transaction_' . $this->openedTransaction--) !== false; + } + elseif ($this->openedTransaction-- === 1) { + # We must do it manually since opening a transaction manually stucks PDO into thinking we've got no transaction opened + return $this->exec('ROLLBACK') !== false; + } + return false; } diff --git a/src/SearchRequest/Attribute/SearchParameter.php b/src/SearchRequest/Attribute/SearchParameter.php index ebcf943..5c2eafe 100644 --- a/src/SearchRequest/Attribute/SearchParameter.php +++ b/src/SearchRequest/Attribute/SearchParameter.php @@ -20,6 +20,6 @@ abstract class SearchParameter { public function getParameters() : array { - return array_filter((array) $this->parameter); + return array_filter((array) ( $this->parameter ?? [] )); } } \ No newline at end of file diff --git a/src/SearchRequest/SearchRequestFromRequestTrait.php b/src/SearchRequest/SearchRequestFromRequestTrait.php index a4f8f5f..35f0f19 100644 --- a/src/SearchRequest/SearchRequestFromRequestTrait.php +++ b/src/SearchRequest/SearchRequestFromRequestTrait.php @@ -76,7 +76,8 @@ trait SearchRequestFromRequestTrait case $attribute instanceof SearchManual: if ($attribute->toggle) { $this->$propertyName = !empty($value); - } elseif ($value !== null) { + } + elseif ($value !== null) { foreach ($property->getTypes() as $type) { $enum = $type->type;