db

Форк
0
/
SQLServer.php 
115 строк · 3.2 Кб
1
<?php
2

3
namespace Upside\Db\Schema\Compiler;
4

5
use Upside\Db\Schema\AlterTable;
6
use Upside\Db\Schema\BaseColumn;
7
use Upside\Db\Schema\Compiler;
8
use Upside\Db\Schema\CreateTable;
9

10
class SQLServer extends Compiler
11
{
12
    protected string $wrapper = '[%s]';
13

14
    /** @var string[] */
15
    protected array $modifiers = ['nullable', 'default', 'autoincrement'];
16
    protected string $autoincrement = 'IDENTITY';
17

18
    protected function handle_type_integer(BaseColumn $column): string
19
    {
20
        return match ($column->get('size', 'normal')) {
21
            'tiny' => 'TINYINT',
22
            'small' => 'SMALLINT',
23
            'medium' => 'INTEGER',
24
            'big' => 'BIGINT',
25
            default => 'INTEGER',
26
        };
27
    }
28

29
    protected function handle_type_decimal(BaseColumn $column): string
30
    {
31
        if (null !== $l = $column->get('length')) {
32
            if (null === $p = $column->get('precision')) {
33
                return 'DECIMAL (' . $this->value($l) . ')';
34
            }
35

36
            return 'DECIMAL (' . $this->value($l) . ', ' . $this->value($p) . ')';
37
        }
38

39
        return 'DECIMAL';
40
    }
41

42
    protected function handle_type_boolean(BaseColumn $column): string
43
    {
44
        return 'BIT';
45
    }
46

47
    protected function handle_type_string(BaseColumn $column): string
48
    {
49
        return 'NVARCHAR(' . $this->value($column->get('length', 255)) . ')';
50
    }
51

52
    protected function handle_type_fixed(BaseColumn $column): string
53
    {
54
        return 'NCHAR(' . $this->value($column->get('length', 255)) . ')';
55
    }
56

57
    protected function handle_type_text(BaseColumn $column): string
58
    {
59
        return 'NVARCHAR(max)';
60
    }
61

62
    protected function handle_type_binary(BaseColumn $column): string
63
    {
64
        return 'VARBINARY(max)';
65
    }
66

67
    protected function handle_type_timestamp(BaseColumn $column): string
68
    {
69
        return 'DATETIME';
70
    }
71

72
    protected function handle_rename_column(AlterTable $table, $data): string
73
    {
74
        /** @var BaseColumn $column */
75
        $column = $data['column'];
76

77
        return 'sp_rename ' . $this->wrap($table->get_table_name()) . '.' . $this->wrap($data['from']) . ', '
78
            . $this->wrap($column->get_name()) . ', COLUMN';
79
    }
80

81
    protected function handle_engine(CreateTable $schema): string
82
    {
83
        return '';
84
    }
85

86
    public function rename_table(string $current, string $new): array
87
    {
88
        return [
89
            'sql' => 'sp_rename ' . $this->wrap($current) . ', ' . $this->wrap($new),
90
            'params' => [],
91
        ];
92
    }
93

94
    public function current_database(string $dsn): array
95
    {
96
        return [
97
            'sql' => 'SELECT SCHEMA_NAME()',
98
            'params' => [],
99
        ];
100
    }
101

102
    public function get_columns(string $database, string $table): array
103
    {
104
        $sql = 'SELECT ' . $this->wrap('column_name') . ' AS ' . $this->wrap('name')
105
            . ', ' . $this->wrap('data_type') . ' AS ' . $this->wrap('type')
106
            . ' FROM ' . $this->wrap('information_schema') . '.' . $this->wrap('columns')
107
            . ' WHERE ' . $this->wrap('table_schema') . ' = ? AND ' . $this->wrap('table_name') . ' = ? '
108
            . ' ORDER BY ' . $this->wrap('ordinal_position') . ' ASC';
109

110
        return [
111
            'sql' => $sql,
112
            'params' => [$database, $table],
113
        ];
114
    }
115
}
116

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.