Completed
Pull Request — master (#21)
by Michal
02:30
created

MySqlDatabaseForm   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 3
dl 0
loc 60
ccs 0
cts 40
cp 0
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B addFieldsToForm() 0 24 3
B submit() 0 22 5
1
<?php
2
3
namespace UniMan\Drivers\Mysql\Forms;
4
5
use Nette\Application\UI\Form;
6
use Nette\Utils\ArrayHash;
7
use PDO;
8
use UniMan\Core\Forms\DatabaseForm\DatabaseFormInterface;
9
10
class MySqlDatabaseForm implements DatabaseFormInterface
11
{
12
    private $pdo;
13
14
    private $database;
15
16
    public function __construct(PDO $pdo, $database)
17
    {
18
        $this->pdo = $pdo;
19
        $this->database = $database;
20
    }
21
22
    public function addFieldsToForm(Form $form)
23
    {
24
        $form->addText('name', 'Name')
25
            ->setRequired();
26
27
        $characterSets = $this->pdo->query('SELECT CHARACTER_SET_NAME, CONCAT(CHARACTER_SET_NAME, " (", DESCRIPTION, ")") FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME')->fetchAll(PDO::FETCH_KEY_PAIR);
28
        $form->addSelect('charset', 'Character set', $characterSets)
29
            ->setPrompt('Default character set');
30
31
        $collations = [];
32
        foreach ($this->pdo->query('SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLLATIONS ORDER BY COLLATION_NAME')->fetchAll(PDO::FETCH_ASSOC) as $collation) {
33
            $collations[$collation['CHARACTER_SET_NAME']][$collation['COLLATION_NAME']] = $collation['COLLATION_NAME'];
34
        }
35
        ksort($collations);
36
37
        $form->addSelect('collation', 'Collation', $collations)
38
            ->setPrompt('Default collation');
39
40
        if ($this->database) {
41
            $form['name']->setDisabled();
42
            $defaults = $this->pdo->query("SELECT `SCHEMA_NAME` AS `name`, `DEFAULT_CHARACTER_SET_NAME` AS `charset`, `DEFAULT_COLLATION_NAME` AS `collation` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` = '{$this->database}'")->fetch(PDO::FETCH_ASSOC);
43
            $form->setDefaults($defaults);
44
        }
45
    }
46
47
    public function submit(Form $form, ArrayHash $values)
48
    {
49
        if ($this->database) {
50
            $query = 'ALTER DATABASE ' . $this->database;
51
        } else {
52
            $query = 'CREATE DATABASE ' . $values['name'];
53
        }
54
        if ($values['charset']) {
55
            $query .= ' CHARACTER SET ' . $values['charset'];
56
            if ($values['collation']) {
57
                $query .= ' COLLATE ' . $values['collation'];
58
            }
59
        }
60
61
        $statement = $this->pdo->prepare($query);
62
        $res = $statement->execute();
63
        if ($res === false) {
64
            $form->addError($statement->errorInfo()[2]);
65
            return;
66
        }
67
        return $res;
68
    }
69
}
70