Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions packages/database/src/Enums/DatabaseTextLength.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

declare(strict_types=1);

namespace Tempest\Database\Enums;

enum DatabaseTextLength: int
{
case TINY = 255;
case DEFAULT = 65535;
case MEDIUM = 16777215;
case LONG = 4294967295;

public static function fromLength(int $length): self
{
return match (true) {
$length <= DatabaseTextLength::TINY => DatabaseTextLength::TINY,
$length <= DatabaseTextLength::DEFAULT => DatabaseTextLength::DEFAULT,
$length <= DatabaseTextLength::MEDIUM => DatabaseTextLength::MEDIUM,
$length <= DatabaseTextLength::LONG => DatabaseTextLength::LONG,
default => DatabaseTextLength::DEFAULT,
};
}

public function toString(): string
{
return match ($this) {
DatabaseTextLength::TINY => 'TINYTEXT',
DatabaseTextLength::DEFAULT => 'TEXT',
DatabaseTextLength::MEDIUM => 'MEDIUMTEXT',
DatabaseTextLength::LONG => 'LONGTEXT',
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use BackedEnum;
use Tempest\Database\Builder\TableDefinition;
use Tempest\Database\Config\DatabaseDialect;
use Tempest\Database\Enums\DatabaseTextLength;
use Tempest\Database\HasTrailingStatements;
use Tempest\Database\QueryStatement;
use Tempest\Support\Json;
Expand Down Expand Up @@ -143,12 +144,13 @@ public function foreignKey(string $local, string $foreign, OnDelete $onDelete =
/**
* Adds a `TEXT` column to the table.
*/
public function text(string $name, bool $nullable = false, ?string $default = null): self
public function text(string $name, bool $nullable = false, int|DatabaseTextLength $length = DatabaseTextLength::DEFAULT, ?string $default = null): self
{
$this->statements[] = new TextStatement(
name: $name,
nullable: $nullable,
default: $default,
length: $length,
);

return $this;
Expand Down
14 changes: 13 additions & 1 deletion packages/database/src/QueryStatements/TextStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,25 @@
namespace Tempest\Database\QueryStatements;

use Tempest\Database\Config\DatabaseDialect;
use Tempest\Database\Enums\DatabaseTextLength;
use Tempest\Database\QueryStatement;

final readonly class TextStatement implements QueryStatement
{
public function __construct(
private string $name,
private bool $nullable = false,
private int|DatabaseTextLength $length = DatabaseTextLength::DEFAULT,
private ?string $default = null,
) {}

public function compile(DatabaseDialect $dialect): string
{
return match ($dialect) {
DatabaseDialect::MYSQL => sprintf(
'`%s` TEXT %s',
'`%s` %s %s',
$this->name,
$this->getSQLTypeDeclaration($this->length),
$this->nullable ? '' : 'NOT NULL',
),
default => sprintf(
Expand All @@ -31,4 +34,13 @@ public function compile(DatabaseDialect $dialect): string
),
};
}

private function getSQLTypeDeclaration(int|DatabaseTextLength $length): string
{
if ($length instanceof DatabaseTextLength) {
return $length->toString();
}

return DatabaseTextLength::fromLength($length)->toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Tempest\Database\Config\DatabaseDialect;
use Tempest\Database\Database;
use Tempest\Database\DialectWasNotSupported;
use Tempest\Database\Enums\DatabaseTextLength;
use Tempest\Database\Exceptions\DefaultValueWasInvalid;
use Tempest\Database\Exceptions\ValueWasInvalid;
use Tempest\Database\MigratesUp;
Expand Down Expand Up @@ -235,6 +236,35 @@ public function test_string_method_with_custom_parameters(): void
$this->assertSame($varcharStatement, $stringStatement);
}

public function test_text_with_length_limit(): void
{
$tinyText = new CreateTableStatement('test-table')
->text('content', false, DatabaseTextLength::TINY, null)
->compile(dialect: DatabaseDialect::MYSQL);
$mediumText = new CreateTableStatement('test-table')
->text('content', false, DatabaseTextLength::DEFAULT)
->compile(dialect: DatabaseDialect::MYSQL);
$text = new CreateTableStatement('test-table')
->text('content', false, DatabaseTextLength::MEDIUM)
->compile(dialect: DatabaseDialect::MYSQL);
$longText = new CreateTableStatement('test-table')
->text('content', false, DatabaseTextLength::LONG)
->compile(dialect: DatabaseDialect::MYSQL);
$default = new CreateTableStatement('test-table')
->text('content', false)
->compile(dialect: DatabaseDialect::MYSQL);
$value = new CreateTableStatement('test-table')
->text('content', false, 180)
->compile(dialect: DatabaseDialect::MYSQL);

$this->assertStringContainsString('TINYTEXT', $tinyText);
$this->assertStringContainsString('MEDIUMTEXT', $mediumText);
$this->assertStringContainsString('TEXT', $text);
$this->assertStringContainsString('LONGTEXT', $longText);
$this->assertStringContainsString('TEXT', $default);
$this->assertStringContainsString('TINYTEXT', $value);
}

public function test_object_field(): void
{
$migration = new class() implements MigratesUp {
Expand Down