Completed
Push — master ( 8155ff...9fff48 )
by Changwan
03:00
created

Configuration::createPdo()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 0
dl 0
loc 18
ccs 10
cts 10
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
namespace Wandu\Database;
3
4
use PDO;
5
6
class Configuration
7
{
8
    const DRIVER_MYSQL = 'mysql';
9
    
10
    /** @var string */
11
    protected $driver = 'mysql';
12
    
13
    /** @var string */
14
    protected $host = 'localhost';
15
16
    /** @var int */
17
    protected $port = 4403;
18
19
    /** @var string */
20
    protected $username = 'root';
21
22
    /** @var string */
23
    protected $password = '';
24
25
    /** @var string */
26
    protected $database = null;
27
28
    /** @var string */
29
    protected $charset;
30
31
    /** @var string */
32
    protected $collation;
33
34
    /** @var string */
35
    protected $prefix = '';
36
37
    /** @var string */
38
    protected $timezone;
39
40
    /** @var array */
41
    protected $options = [
42
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
43
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
44
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
45
        PDO::ATTR_STRINGIFY_FETCHES => false,
46
        PDO::ATTR_EMULATE_PREPARES => false,
47
    ];
48
49
    /**
50
     * @param array $settings
51
     */
52 20
    public function __construct(array $settings = [])
53
    {
54 20
        foreach ($settings as $name => $setting) {
55 20
            $this->{$name} = $setting;
56
        }
57 20
    }
58
59
    /**
60
     * @return string
61
     */
62 20
    public function getDriver()
63
    {
64 20
        return $this->driver;
65
    }
66
67
    /**
68
     * @return string
69
     */
70 16
    public function getPrefix(): string
71
    {
72 16
        return $this->prefix;
73
    }
74
    
75
    /**
76
     * @return \PDO
77
     */
78 19
    public function createPdo()
79
    {
80 19
        $pdo = new PDO(
81 19
            "{$this->driver}:host={$this->host};port={$this->port};dbname={$this->database}",
82 19
            $this->username,
83 19
            $this->password,
84 19
            $this->options + [
85 19
                PDO::ATTR_CASE => PDO::CASE_NATURAL,
86
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
87
                PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
88
                PDO::ATTR_STRINGIFY_FETCHES => false,
89
                PDO::ATTR_EMULATE_PREPARES => false,
90
            ]
91
        );
92 19
        $this->applyCharset($pdo);
93 19
        $this->applyTimezone($pdo);
94 19
        return $pdo;
95
    }
96
97
    /**
98
     * @param \PDO $pdo
99
     */
100 19
    protected function applyCharset(PDO $pdo)
101
    {
102 19
        if ($this->charset) {
103 19
            $names = "SET NAMES '{$this->charset}'";
104 19
            if ($this->collation) {
105 19
                $names .= " COLLATE '{$this->collation}'";
106
            }
107 19
            $pdo->prepare($names)->execute();
108
        }
109 19
    }
110
111
    /**
112
     * @param \PDO $pdo
113
     */
114 19
    protected function applyTimezone(PDO $pdo)
115
    {
116 19
        if ($this->timezone) {
117 1
            $pdo->prepare("SET time_zone='{$this->timezone}'")->execute();
118
        }
119 19
    }
120
}
121