5
5
namespace Yiisoft \Db \Oracle \Column ;
6
6
7
7
use Yiisoft \Db \Constant \ColumnType ;
8
+ use Yiisoft \Db \Constant \ReferentialAction ;
8
9
use Yiisoft \Db \QueryBuilder \AbstractColumnDefinitionBuilder ;
9
- use Yiisoft \Db \Schema \Column \ColumnSchemaInterface ;
10
+ use Yiisoft \Db \Schema \Column \ColumnInterface ;
10
11
11
12
use function ceil ;
12
13
use function log10 ;
@@ -16,8 +17,6 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder
16
17
{
17
18
protected const AUTO_INCREMENT_KEYWORD = 'GENERATED BY DEFAULT AS IDENTITY ' ;
18
19
19
- protected const GENERATE_UUID_EXPRESSION = 'sys_guid() ' ;
20
-
21
20
protected const TYPES_WITH_SIZE = [
22
21
'char ' ,
23
22
'nchar ' ,
@@ -37,7 +36,7 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder
37
36
'number ' ,
38
37
];
39
38
40
- public function build (ColumnSchemaInterface $ column ): string
39
+ public function build (ColumnInterface $ column ): string
41
40
{
42
41
return $ this ->buildType ($ column )
43
42
. $ this ->buildAutoIncrement ($ column )
@@ -53,8 +52,8 @@ public function build(ColumnSchemaInterface $column): string
53
52
protected function buildOnDelete (string $ onDelete ): string
54
53
{
55
54
return match ($ onDelete = strtoupper ($ onDelete )) {
56
- ' CASCADE ' ,
57
- ' SET NULL ' => " ON DELETE $ onDelete " ,
55
+ ReferentialAction:: CASCADE ,
56
+ ReferentialAction:: SET_NULL => " ON DELETE $ onDelete " ,
58
57
default => '' ,
59
58
};
60
59
}
@@ -64,39 +63,53 @@ protected function buildOnUpdate(string $onUpdate): string
64
63
return '' ;
65
64
}
66
65
67
- protected function getDbType (ColumnSchemaInterface $ column ): string
66
+ protected function getDbType (ColumnInterface $ column ): string
68
67
{
68
+ $ dbType = $ column ->getDbType ();
69
69
$ size = $ column ->getSize ();
70
+ $ scale = $ column ->getScale ();
70
71
71
72
/** @psalm-suppress DocblockTypeContradiction */
72
- return $ column ->getDbType () ?? match ($ column ->getType ()) {
73
- ColumnType::BOOLEAN => 'number(1) ' ,
74
- ColumnType::BIT => match (true ) {
75
- $ size === null => 'number(38) ' ,
76
- $ size <= 126 => 'number( ' . ceil (log10 (2 ** $ size )) . ') ' ,
77
- default => 'raw( ' . ceil ($ size / 8 ) . ') ' ,
73
+ return match ($ dbType ) {
74
+ default => $ dbType ,
75
+ null => match ($ column ->getType ()) {
76
+ ColumnType::BOOLEAN => 'number(1) ' ,
77
+ ColumnType::BIT => match (true ) {
78
+ $ size === null => 'number(38) ' ,
79
+ $ size <= 126 => 'number( ' . ceil (log10 (2 ** $ size )) . ') ' ,
80
+ default => 'raw( ' . ceil ($ size / 8 ) . ') ' ,
81
+ },
82
+ ColumnType::TINYINT => 'number( ' . ($ size ?? 3 ) . ') ' ,
83
+ ColumnType::SMALLINT => 'number( ' . ($ size ?? 5 ) . ') ' ,
84
+ ColumnType::INTEGER => 'number( ' . ($ size ?? 10 ) . ') ' ,
85
+ ColumnType::BIGINT => 'number( ' . ($ size ?? 20 ) . ') ' ,
86
+ ColumnType::FLOAT => 'binary_float ' ,
87
+ ColumnType::DOUBLE => 'binary_double ' ,
88
+ ColumnType::DECIMAL => 'number( ' . ($ size ?? 10 ) . ', ' . ($ scale ?? 0 ) . ') ' ,
89
+ ColumnType::MONEY => 'number( ' . ($ size ?? 19 ) . ', ' . ($ scale ?? 4 ) . ') ' ,
90
+ ColumnType::CHAR => 'char ' ,
91
+ ColumnType::STRING => 'varchar2( ' . ($ size ?? 255 ) . ') ' ,
92
+ ColumnType::TEXT => 'clob ' ,
93
+ ColumnType::BINARY => 'blob ' ,
94
+ ColumnType::UUID => 'raw(16) ' ,
95
+ ColumnType::DATETIME => 'timestamp ' ,
96
+ ColumnType::TIMESTAMP => 'timestamp ' ,
97
+ ColumnType::DATE => 'date ' ,
98
+ ColumnType::TIME => 'interval day(0) to second ' ,
99
+ ColumnType::ARRAY => 'clob ' ,
100
+ ColumnType::STRUCTURED => 'clob ' ,
101
+ ColumnType::JSON => 'clob ' ,
102
+ default => 'varchar2 ' ,
78
103
},
79
- ColumnType::TINYINT => 'number( ' . ($ size ?? 3 ) . ') ' ,
80
- ColumnType::SMALLINT => 'number( ' . ($ size ?? 5 ) . ') ' ,
81
- ColumnType::INTEGER => 'number( ' . ($ size ?? 10 ) . ') ' ,
82
- ColumnType::BIGINT => 'number( ' . ($ size ?? 20 ) . ') ' ,
83
- ColumnType::FLOAT => 'binary_float ' ,
84
- ColumnType::DOUBLE => 'binary_double ' ,
85
- ColumnType::DECIMAL => 'number( ' . ($ size ?? 10 ) . ', ' . ($ column ->getScale () ?? 0 ) . ') ' ,
86
- ColumnType::MONEY => 'number( ' . ($ size ?? 19 ) . ', ' . ($ column ->getScale () ?? 4 ) . ') ' ,
87
- ColumnType::CHAR => 'char ' ,
88
- ColumnType::STRING => 'varchar2( ' . ($ size ?? 255 ) . ') ' ,
89
- ColumnType::TEXT => 'clob ' ,
90
- ColumnType::BINARY => 'blob ' ,
91
- ColumnType::UUID => 'raw(16) ' ,
92
- ColumnType::DATETIME => 'timestamp ' ,
93
- ColumnType::TIMESTAMP => 'timestamp ' ,
94
- ColumnType::DATE => 'date ' ,
95
- ColumnType::TIME => 'interval day(0) to second ' ,
96
- ColumnType::ARRAY => 'clob ' ,
97
- ColumnType::STRUCTURED => 'clob ' ,
98
- ColumnType::JSON => 'clob ' ,
99
- default => 'varchar2 ' ,
104
+ 'timestamp with time zone ' => 'timestamp ' . ($ size !== null ? "( $ size) " : '' ) . ' with time zone ' ,
105
+ 'timestamp with local time zone ' => 'timestamp ' . ($ size !== null ? "( $ size) " : '' ) . ' with local time zone ' ,
106
+ 'interval day to second ' => 'interval day ' . ($ scale !== null ? "( $ scale) " : '' ) . ' to second ' . ($ size !== null ? "( $ size) " : '' ),
107
+ 'interval year to month ' => 'interval year ' . ($ scale !== null ? "( $ scale) " : '' ) . ' to month ' ,
100
108
};
101
109
}
110
+
111
+ protected function getDefaultUuidExpression (): string
112
+ {
113
+ return 'sys_guid() ' ;
114
+ }
102
115
}
0 commit comments