From 761e0401b060e87c126a4fdd780a9afbb7dbff31 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Mon, 12 May 2025 15:11:00 +0000 Subject: [PATCH] - Fixed SQLite truncate, added AdapterProxy autoloading --- src/Container/AdapterProxy.php | 17 ++++++++- src/EntityCollection.php | 15 +++++++- src/EntityTrait.php | 4 +-- src/Query/Sqlite/Truncate.php | 28 +++++++++++++++ src/QueryBuilder/Sql/SqliteQueryBuilder.php | 38 +++++++++++++++++++++ src/QueryBuilder/SqlQueryBuilder.php | 2 +- src/Repository.php | 7 +++- 7 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 src/Query/Sqlite/Truncate.php diff --git a/src/Container/AdapterProxy.php b/src/Container/AdapterProxy.php index 31aff87..9754ab9 100644 --- a/src/Container/AdapterProxy.php +++ b/src/Container/AdapterProxy.php @@ -2,12 +2,27 @@ namespace Ulmus\Container; +use Ulmus\ConnectionAdapter; + class AdapterProxy { public array $connections = []; public function __construct(...$arguments) { - $this->connections = $arguments; + $this->push(array_filter($arguments)); + } + + public function push(array|ConnectionAdapter $connection) : void + { + foreach((array) $connection as $adapter) { + foreach($this->connections as $existing) { + if ($adapter === $existing) { + continue 2; + } + } + + $this->connections[] = $adapter; + } } } \ No newline at end of file diff --git a/src/EntityCollection.php b/src/EntityCollection.php index a159184..6ebc2fc 100644 --- a/src/EntityCollection.php +++ b/src/EntityCollection.php @@ -343,7 +343,20 @@ class EntityCollection extends \ArrayObject implements \JsonSerializable { $list[] = $entity instanceof \JsonSerializable ? $entity->jsonSerialize() : $entity->toArray($includeRelations); } - return $list; + return $this->utf8ize($list, "UTF-8", "UTF-8"); + } + + protected function utf8ize(mixed $content) { + if (is_array($content)) { + foreach ($content as $key => $value) { + $content[$key] = $this->utf8ize($value); + } + } + elseif (is_string($content)) { + return mb_convert_encoding($content, "UTF-8", "UTF-8"); + } + + return $content; } public function fromArray(array $datasets, ? string /*stringable*/ $entityClass = null) : self diff --git a/src/EntityTrait.php b/src/EntityTrait.php index 4503287..43282ce 100644 --- a/src/EntityTrait.php +++ b/src/EntityTrait.php @@ -43,12 +43,12 @@ trait EntityTrait { #[Ignore] public function initializeEntity(iterable|null $dataset = null) : void { + $this->datasetHandler = new DatasetHandler(static::resolveEntity(), $this->entityStrictFieldsDeclaration); + if ($dataset) { $this->fromArray($dataset); } - $this->datasetHandler = new DatasetHandler(static::resolveEntity(), $this->entityStrictFieldsDeclaration); - $this->resetVirtualProperties(); } diff --git a/src/Query/Sqlite/Truncate.php b/src/Query/Sqlite/Truncate.php new file mode 100644 index 0000000..e0e2957 --- /dev/null +++ b/src/Query/Sqlite/Truncate.php @@ -0,0 +1,28 @@ +table = $tableName; + + return $this; + } + + public function render() : string + { + return $this->renderSegments([ + static::SQL_TOKEN, $this->table, + ]); + } +} diff --git a/src/QueryBuilder/Sql/SqliteQueryBuilder.php b/src/QueryBuilder/Sql/SqliteQueryBuilder.php index fe7cf5c..e4f595d 100644 --- a/src/QueryBuilder/Sql/SqliteQueryBuilder.php +++ b/src/QueryBuilder/Sql/SqliteQueryBuilder.php @@ -3,6 +3,7 @@ namespace Ulmus\QueryBuilder\Sql; use Ulmus\Query; +use Ulmus\Adapter\AdapterInterface; # Soon to extends SqlQueryBuilder class SqliteQueryBuilder extends MysqlQueryBuilder @@ -38,4 +39,41 @@ class SqliteQueryBuilder extends MysqlQueryBuilder return $this; } + + + public function insert(array $fieldlist, string $table, ? string $alias = null, ? string $database = null, ? string $schema = null, bool $replace = false) : self + { + return parent::insert($fieldlist, $table, $alias, null, null, $replace); + } + + public function update(string $table, ? string $alias = null, ? string $database = null, ? string $schema = null) : self + { + return parent::update($table, $alias, null, null); + } + + public function create(AdapterInterface $adapter, array $fieldlist, string $table, ? string $database = null, ? string $schema = null) : self + { + return parent::create($adapter, $fieldlist, $table, null, null); + } + + public function alter(AdapterInterface $adapter, array $fieldlist, string $table, ? string $database = null, ? string $schema = null) : self + { + return parent::alter($adapter, $fieldlist, $table, null, null); + } + + public function from(string $table, ? string $alias = null, ? string $database = null, ? string $schema = null) : self + { + return parent::from($table, $alias, null, null); + } + + public function truncate(string $table, ? string $alias = null, ? string $database = null, ? string $schema = null) : self + { + $truncate = new Query\Sqlite\Truncate($this); + + $this->push($truncate); + + $truncate->set($table); + + return $this; + } } diff --git a/src/QueryBuilder/SqlQueryBuilder.php b/src/QueryBuilder/SqlQueryBuilder.php index 4c28eb4..8387f55 100644 --- a/src/QueryBuilder/SqlQueryBuilder.php +++ b/src/QueryBuilder/SqlQueryBuilder.php @@ -5,7 +5,7 @@ namespace Ulmus\QueryBuilder; use Ulmus\Query\QueryFragmentInterface; # TODO -> Extract from MysqlQueryBuilder to build an ISO/IEC 9075:2023 compatible layer for a basic SQL QueryBuilder -class SqlQueryBuilder implements QueryBuilderInterface +abstract class SqlQueryBuilder implements QueryBuilderInterface { protected string $rendered; diff --git a/src/Repository.php b/src/Repository.php index 2d28929..8355046 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -216,7 +216,12 @@ class Repository implements RepositoryInterface } else { if ( $primaryKeyDefinition === null ) { - throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass)); + if ( null !== $compoundKeyFields = Ulmus::resolveEntity($this->entityClass)->getCompoundKeyFields() ) { + throw new \Exception("TO DO!"); + } + else { + throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass)); + } } $diff = $fieldsAndValue ?? $this->generateWritableDataset($entity);