-
-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathColumnFactory.php
More file actions
94 lines (83 loc) · 3.17 KB
/
ColumnFactory.php
File metadata and controls
94 lines (83 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
declare(strict_types=1);
namespace Yiisoft\Db\Sqlite\Column;
use Yiisoft\Db\Constant\ColumnType;
use Yiisoft\Db\Schema\Column\AbstractColumnFactory;
use Yiisoft\Db\Schema\Column\ColumnInterface;
use Yiisoft\Db\Syntax\ColumnDefinitionParserInterface;
use function str_replace;
use function substr;
final class ColumnFactory extends AbstractColumnFactory
{
/**
* Mapping from physical column types (keys) to abstract column types (values).
*
* @var string[]
* @psalm-var array<string, ColumnType::*>
*/
protected const TYPE_MAP = [
'bool' => ColumnType::BOOLEAN,
'boolean' => ColumnType::BOOLEAN,
'bit' => ColumnType::BIT,
'tinyint' => ColumnType::TINYINT,
'smallint' => ColumnType::SMALLINT,
'mediumint' => ColumnType::INTEGER,
'int' => ColumnType::INTEGER,
'integer' => ColumnType::INTEGER,
'bigint' => ColumnType::BIGINT,
'float' => ColumnType::FLOAT,
'real' => ColumnType::FLOAT,
'double' => ColumnType::DOUBLE,
'decimal' => ColumnType::DECIMAL,
'numeric' => ColumnType::DECIMAL,
'char' => ColumnType::CHAR,
'varchar' => ColumnType::STRING,
'enum' => ColumnType::STRING,
'tinytext' => ColumnType::TEXT,
'mediumtext' => ColumnType::TEXT,
'longtext' => ColumnType::TEXT,
'text' => ColumnType::TEXT,
'blob' => ColumnType::BINARY,
'year' => ColumnType::SMALLINT,
'date' => ColumnType::DATE,
'time' => ColumnType::TIME,
'timetz' => ColumnType::TIMETZ,
'datetime' => ColumnType::DATETIME,
'datetimetz' => ColumnType::DATETIMETZ,
'timestamp' => ColumnType::TIMESTAMP,
'json' => ColumnType::JSON,
];
public function fromPseudoType(string $pseudoType, array $info = []): ColumnInterface
{
// SQLite doesn't support unsigned types
return parent::fromPseudoType($pseudoType, $info)->unsigned(false);
}
protected function getType(string $dbType, array $info = []): string
{
return match ($dbType) {
'bit', 'tinyint' => isset($info['size']) && $info['size'] === 1
? ColumnType::BOOLEAN
: parent::getType($dbType, $info),
'text' => match ($info['defaultValueRaw'] ?? null) {
'CURRENT_TIMESTAMP' => ColumnType::DATETIMETZ,
'CURRENT_DATE' => ColumnType::DATE,
'CURRENT_TIME' => ColumnType::TIMETZ,
default => parent::getType($dbType, $info),
},
default => parent::getType($dbType, $info),
};
}
protected function normalizeNotNullDefaultValue(string $defaultValue, ColumnInterface $column): mixed
{
if ($defaultValue[0] === '"' && $defaultValue[-1] === '"') {
$value = substr($defaultValue, 1, -1);
$value = str_replace('""', '"', $value);
return $column->phpTypecast($value);
}
return parent::normalizeNotNullDefaultValue($defaultValue, $column);
}
protected function columnDefinitionParser(): ColumnDefinitionParserInterface
{
return new ColumnDefinitionParser();
}
}