Completed
Push — master ( 3f7c7b...59875d )
by Michal
02:57
created

MySqlHeaderManager   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 139
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 50.64%

Importance

Changes 0
Metric Value
wmc 22
lcom 1
cbo 2
dl 0
loc 139
rs 10
c 0
b 0
f 0
ccs 39
cts 77
cp 0.5064

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A databasesHeaders() 0 22 1
B isNumeric() 0 19 6
A getDecimals() 0 12 4
B tablesHeaders() 0 49 6
B itemsHeaders() 0 23 4
1
<?php
2
3
namespace UniMan\Drivers\MySql;
4
5
use UniMan\Core\Column;
6
use UniMan\Core\ListingHeaders\HeaderManagerInterface;
7
8
class MySqlHeaderManager implements HeaderManagerInterface
9
{
10
    private $dataManager;
11
12 6
    public function __construct(MySqlDataManager $dataManager)
13
    {
14 6
        $this->dataManager = $dataManager;
15 6
    }
16
17 2
    public function databasesHeaders()
18
    {
19 2
        $columns = [];
20 2
        $columns[] = (new Column('database', 'mysql.headers.databases.database'))
21 2
            ->setSortable(true);
22
23 2
        $columns[] = (new Column('charset', 'mysql.headers.databases.charset'))
24 2
            ->setSortable(true);
25
26 2
        $columns[] = (new Column('collation', 'mysql.headers.databases.collation'))
27 2
            ->setSortable(true);
28
29 2
        $columns[] = (new Column('tables_count', 'mysql.headers.databases.tables'))
30 2
            ->setSortable(true)
31 2
            ->setNumeric(true);
32
33 2
        $columns[] = (new Column('size', 'mysql.headers.databases.size'))
34 2
            ->setSortable(true)
35 2
            ->setNumeric(true)
36 2
            ->setSize(true);
37 2
        return $columns;
38
    }
39
40 2
    public function tablesHeaders()
41
    {
42
        $tableFields = [
43 2
            'table' => [],
44
            'engine' => [],
45
            'collation' => [],
46
            'data_length' => ['is_numeric' => true, 'is_size' => true],
47
            'index_length' => ['is_numeric' => true, 'is_size' => true],
48
            'data_free' => ['is_numeric' => true, 'is_size' => true],
49
            'autoincrement' => ['is_numeric' => true],
50
            'rows' => ['is_numeric' => true],
51
        ];
52 2
        $tableColumns = [];
53 2
        foreach ($tableFields as $key => $settings) {
54 2
            $column = (new Column($key, 'mysql.headers.tables.' . $key))
55 2
                ->setSortable(true);
56 2
            if (isset($settings['is_numeric'])) {
57 2
                $column->setNumeric($settings['is_numeric']);
58
            }
59 2
            if (isset($settings['is_size'])) {
60 2
                $column->setSize($settings['is_size']);
61
            }
62 2
            $tableColumns[] = $column;
63
        }
64
65
        $viewFields = [
66 2
            'view' => [],
67
            'check_option' => [],
68
            'is_updatable' => [],
69
            'definer' => [],
70
            'security_type' => [],
71
            'character_set' => [],
72
            'collation' => [],
73
        ];
74 2
        $viewColumns = [];
75 2
        foreach ($viewFields as $key => $settings) {
76 2
            $column = (new Column($key, 'mysql.headers.views.' . $key))
77 2
                ->setSortable(true);
78 2
            if (isset($settings['is_numeric'])) {
79
                $column->setNumeric($settings['is_numeric']);
80
            }
81 2
            $viewColumns[] = $column;
82
        }
83
84
        return [
85 2
            MySqlDriver::TYPE_TABLE => $tableColumns,
86 2
            MySqlDriver::TYPE_VIEW => $viewColumns,
87
        ];
88
    }
89
90
    public function itemsHeaders($type, $table)
91
    {
92
        $columns = [];
93
        foreach ($this->dataManager->getColumns($type, $table) as $column => $definition) {
94
            $col = (new Column($column, $column))
95
                ->setSortable(true)
96
                ->setFilterable(true)
97
                ->setNumeric($this->isNumeric($definition))
98
                ->setDecimals($this->getDecimals($definition))
99
                ->setInfo($definition['Comment']);
100
            if ($definition['key_info'] && $definition['key_info']['REFERENCED_TABLE_NAME']) {
101
                $col->setExternal(
102
                    $definition['key_info']['REFERENCED_TABLE_SCHEMA'],
103
                    $definition['key_info']['REFERENCED_TABLE_NAME'],
104
                    function ($value) {
105
                        return md5($value);
106
                    }
107
                );
108
            }
109
            $columns[] = $col;
110
        }
111
        return $columns;
112
    }
113
114
    private function isNumeric(array $definition)
115
    {
116
        if ($definition['key_info']) {
117
            return false;
118
        }
119
        if (strpos($definition['Type'], 'int') !== false) {
120
            return true;
121
        }
122
        if (strpos($definition['Type'], 'float') !== false) {
123
            return true;
124
        }
125
        if (strpos($definition['Type'], 'double') !== false) {
126
            return true;
127
        }
128
        if (strpos($definition['Type'], 'decimal') !== false) {
129
            return true;
130
        }
131
        return false;
132
    }
133
134
    private function getDecimals(array $column)
135
    {
136
        if (!$this->isNumeric($column)) {
137
            return 0;
138
        }
139
        if (strpos($column['Type'], ',') === false) {
140
            return 0;
141
        }
142
        $pattern = '/(.*?)\((.*?),(.*?)\)/';
143
        preg_match($pattern, $column['Type'], $match);
144
        return isset($match[3]) ? $match[3] : 0;
145
    }
146
}
147