Compare commits
	
		
			2 Commits
		
	
	
		
			3c5aa51850
			...
			eb6434bb72
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| eb6434bb72 | |||
| 2ad52aba85 | 
@ -29,4 +29,5 @@ interface AdapterInterface {
 | 
			
		||||
    public function queryBuilderClass() : string;
 | 
			
		||||
    public function tableSyntax() : array;
 | 
			
		||||
    public function whitelistAttributes(array &$parameters) : void;
 | 
			
		||||
    public function generateAlterColumn(FieldDefinition $definition, array $field) : string|\Stringable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -100,4 +100,22 @@ trait DefaultAdapterTrait
 | 
			
		||||
    {
 | 
			
		||||
        $parameters = array_intersect_key($parameters, array_flip(static::ALLOWED_ATTRIBUTES));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function generateAlterColumn(FieldDefinition $definition, array $field) : string|\Stringable
 | 
			
		||||
    {
 | 
			
		||||
        if ($field['previous']) {
 | 
			
		||||
            $position = sprintf('AFTER %s', $adapter->escapeIdentifier($field['previous']['field'], AdapterInterface::IDENTIFIER_FIELD));
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $position = "FIRST";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return implode(" ", [
 | 
			
		||||
            strtoupper($field['action']),
 | 
			
		||||
            $this->escapeIdentifier($definition->getSqlName(), AdapterInterface::IDENTIFIER_FIELD),
 | 
			
		||||
            $definition->getSqlType(),
 | 
			
		||||
            $definition->getSqlParams(),
 | 
			
		||||
            $position,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -203,4 +203,14 @@ class SQLite implements AdapterInterface {
 | 
			
		||||
        $pdo->sqliteCreateFunction('month', fn($date) => ( new \DateTime($date) )->format('m'), 1);
 | 
			
		||||
        $pdo->sqliteCreateFunction('year', fn($date) => ( new \DateTime($date) )->format('Y'), 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function generateAlterColumn(FieldDefinition $definition, array $field) : string|\Stringable
 | 
			
		||||
    {
 | 
			
		||||
        return implode(" ", [
 | 
			
		||||
            strtoupper($field['action']),
 | 
			
		||||
            $this->escapeIdentifier($definition->getSqlName(), static::IDENTIFIER_FIELD),
 | 
			
		||||
            $definition->getSqlType(),
 | 
			
		||||
            $definition->getSqlParams(),
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,8 @@
 | 
			
		||||
 | 
			
		||||
namespace Ulmus\Attribute\Property\Field;
 | 
			
		||||
 | 
			
		||||
use Ulmus\Attribute\Attribute;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Since we need consistancy between the declaration of our ID and FK fields, it
 | 
			
		||||
 * was decided to extend the PK class instead of Field for this case.
 | 
			
		||||
@ -20,5 +22,8 @@ class ForeignKey extends PrimaryKey {
 | 
			
		||||
        public bool $nullable = false,
 | 
			
		||||
        public mixed $default = null,
 | 
			
		||||
        public bool $readonly = false,
 | 
			
		||||
    ) {}
 | 
			
		||||
        public null|array|string|\Stringable $references = null,
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->references = Attribute::handleArrayField($this->references);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -62,6 +62,13 @@ class EntityField implements WhereRawParameter
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function generateAlterColumn(AdapterInterface $adapter, array $field) : string
 | 
			
		||||
    {
 | 
			
		||||
        $definition = new FieldDefinition($adapter, $field['definition']);
 | 
			
		||||
 | 
			
		||||
        return $adapter->generateAlterColumn($definition, $field);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function isObjectType($type) : bool
 | 
			
		||||
    {
 | 
			
		||||
        # @Should be fixed with isBuiltIn() instead, it won't be correct based only on name
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@
 | 
			
		||||
namespace Ulmus\Entity\Sqlite;
 | 
			
		||||
 | 
			
		||||
use Ulmus\EntityCollection;
 | 
			
		||||
 | 
			
		||||
use Ulmus\{Attribute\Obj\Table};
 | 
			
		||||
use Ulmus\Query\{From, Select};
 | 
			
		||||
use Ulmus\{Attribute\Obj\Table, Repository};
 | 
			
		||||
use Ulmus\Attribute\Property\{Field, Filter, FilterJoin, Relation, Join, Virtual, Where};
 | 
			
		||||
 | 
			
		||||
#[Table(name: "sqlite_master")]
 | 
			
		||||
@ -27,6 +27,12 @@ class Schema
 | 
			
		||||
    #[Field]
 | 
			
		||||
    public ? string $sql;
 | 
			
		||||
 | 
			
		||||
    #[Relation("oneToMany", key: "tableName", foreignKey: "tableName", entity: Column::class)]
 | 
			
		||||
    ##[Relation("oneToMany", key: "tableName", foreignKey: "tableName", entity: Column::class)]
 | 
			
		||||
    #[Virtual(method: "filterColumns")]
 | 
			
		||||
    public EntityCollection $columns;
 | 
			
		||||
 | 
			
		||||
    public function filterColumns() : EntityCollection
 | 
			
		||||
    {
 | 
			
		||||
        return ( new Repository\SqliteRepository(Column::class) )->pragma('table_info', $this->tableName)->collectionFromQuery();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -5,6 +5,7 @@ namespace Ulmus\Entity\Sqlite;
 | 
			
		||||
use Ulmus\ConnectionAdapter;
 | 
			
		||||
use Ulmus\Repository;
 | 
			
		||||
 | 
			
		||||
#[\Ulmus\Attribute\Obj\Table(name: "sqlite_master")]
 | 
			
		||||
class Table extends Schema
 | 
			
		||||
{
 | 
			
		||||
    public static function repository(string $alias = Repository::DEFAULT_ALIAS, ConnectionAdapter $adapter = null): Repository
 | 
			
		||||
 | 
			
		||||
@ -35,8 +35,8 @@ class Alter extends Fragment {
 | 
			
		||||
 | 
			
		||||
    public function renderFields() : string
 | 
			
		||||
    {
 | 
			
		||||
        return "(" . PHP_EOL . implode("," . PHP_EOL, array_map(function($field) {
 | 
			
		||||
        return PHP_EOL . implode("," . PHP_EOL, array_map(function($field) {
 | 
			
		||||
            return "    " . EntityField::generateAlterColumn($this->adapter, $field);
 | 
			
		||||
        }, $this->fieldList)) . PHP_EOL . ")";
 | 
			
		||||
        }, $this->fieldList));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -392,7 +392,7 @@ class QueryBuilder implements Query\QueryBuilderInterface
 | 
			
		||||
 | 
			
		||||
    public function alter(Adapter\AdapterInterface $adapter, array $fieldlist, string $table, ? string $database = null, ? string $schema = null) : self
 | 
			
		||||
    {
 | 
			
		||||
        if ( null === $this->getFragment(Query\Create::class) ) {
 | 
			
		||||
        if ( null === $this->getFragment(Query\Alter::class) ) {
 | 
			
		||||
            if ( $schema ) {
 | 
			
		||||
                $table = "$schema.$table";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -51,7 +51,7 @@ class Repository
 | 
			
		||||
 | 
			
		||||
    public function loadOne() : ? object
 | 
			
		||||
    {
 | 
			
		||||
        return $this->limit(1)->selectSqlQuery()->collectionFromQuery()[0];
 | 
			
		||||
        return $this->limit(1)->selectSqlQuery()->collectionFromQuery()[0] ?? null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function loadOneFromField($field, $value) : ? object
 | 
			
		||||
@ -301,6 +301,11 @@ class Repository
 | 
			
		||||
        return $this->createSqlQuery()->runQuery();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function alterTable(array $fields)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->alterSqlQuery($fields)->runQuery();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function listTables(? string $database = null)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->showTablesSqlQuery($database)->runQuery();
 | 
			
		||||
@ -953,10 +958,9 @@ class Repository
 | 
			
		||||
    public function alterSqlQuery(array $fields) : self
 | 
			
		||||
    {
 | 
			
		||||
        if ( null === $this->queryBuilder->getFragment(Query\Alter::class) ) {
 | 
			
		||||
            $this->queryBuilder->create($this->adapter->adapter(), $this->escapeFieldList($this->entityResolver->fieldList(EntityResolver::KEY_ENTITY_NAME, true)), $this->escapeTable($this->entityResolver->tableName()), $this->entityResolver->schemaName());
 | 
			
		||||
            $this->queryBuilder->alter($this->adapter->adapter(), $fields, $this->escapeTable($this->entityResolver->tableName()), $this->entityResolver->schemaName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ use Ulmus\{ConnectionAdapter, QueryBuilder, Repository, Query, Ulmus, Entity};
 | 
			
		||||
 | 
			
		||||
class SqliteRepository extends Repository {
 | 
			
		||||
 | 
			
		||||
    public function pragma(/*object|Stringable*/ $pragma, $argument = null, bool $callable = false) : self
 | 
			
		||||
    public function pragma(\Stringable|string $pragma, $argument = null, bool $callable = false) : self
 | 
			
		||||
    {
 | 
			
		||||
        $this->queryBuilder->pragma($pragma, $argument, $callable);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user