packages/ztd-query-mysql/src/Schema/MySqlColumnTypeMapper.php
1<?php
2
3declare(strict_types=1);
4
5namespace ZtdQuery\Platform\MySql\Schema;
6
7use ZtdQuery\Schema\ColumnDeclaration;
8use ZtdQuery\Schema\ColumnTypeFamily;
9
10/**
11 * Implements the My Sql Column Type Mapper contract for MySQL.
12 */
13final class MySqlColumnTypeMapper
14{
15 /**
16 * Map for the supplied MySQL input.
17 */
18 public function map(string $nativeType): ColumnDeclaration
19 {
20 $normalized = strtoupper(trim($nativeType));
21 $baseType = substr($normalized, 0, strcspn($normalized, "( \t\r\n"));
22
23 $family = match ($baseType) {
24 'INT', 'INTEGER', 'TINY', 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'BIGINT',
25 'LONG', 'LONGLONG', 'SHORT', 'INT24', 'YEAR', 'BIT' => ColumnTypeFamily::INTEGER,
26 'FLOAT' => ColumnTypeFamily::FLOAT,
27 'DOUBLE', 'REAL' => ColumnTypeFamily::DOUBLE,
28 'DECIMAL', 'NEWDECIMAL', 'NUMERIC' => ColumnTypeFamily::DECIMAL,
29 'CHAR', 'VARCHAR', 'VAR_STRING', 'STRING', 'ENUM', 'SET' => ColumnTypeFamily::STRING,
30 'TEXT', 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT' => ColumnTypeFamily::TEXT,
31 'BOOL', 'BOOLEAN' => ColumnTypeFamily::BOOLEAN,
32 'DATE', 'NEWDATE' => ColumnTypeFamily::DATE,
33 'TIME', 'TIME2' => ColumnTypeFamily::TIME,
34 'DATETIME', 'DATETIME2' => ColumnTypeFamily::DATETIME,
35 'TIMESTAMP', 'TIMESTAMP2' => ColumnTypeFamily::TIMESTAMP,
36 'BINARY', 'VARBINARY', 'BLOB', 'TINYBLOB', 'MEDIUMBLOB', 'LONGBLOB',
37 'TINY_BLOB', 'MEDIUM_BLOB', 'LONG_BLOB', 'VECTOR'
38 => ColumnTypeFamily::BINARY,
39 'JSON' => ColumnTypeFamily::JSON,
40 default => ColumnTypeFamily::UNKNOWN,
41 };
42
43 return new ColumnDeclaration($family, $nativeType);
44 }
45}
46