Completed
Push — master ( 85d2a2...f0e67d )
by Ivan
04:12
created

Driver::commit()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
namespace vakata\database\driver\mysql;
4
5
use \vakata\database\DBException;
6
use \vakata\database\DriverInterface;
7
use \vakata\database\DriverAbstract;
8
use \vakata\database\StatementInterface;
9
use \vakata\database\schema\Table;
10
use \vakata\database\schema\TableRelation;
11
use \vakata\collection\Collection;
12
13
class Driver extends DriverAbstract implements DriverInterface
14
{
15
    use Schema;
16
    
17
    protected $lnk = null;
18
19
    public function __construct(array $connection)
20
    {
21
        $this->connection = $connection;
22
        if (!isset($this->connection['port'])) {
23
            $this->connection['port'] = 3306;
24
        }
25
        if (!isset($this->connection['opts'])) {
26
            $this->connection['opts'] = [];
27
        }
28
        if (!isset($this->connection['opts']['charset'])) {
29
            $this->connection['opts']['charset'] = 'UTF8';
30
        }
31
    }
32
    public function __destruct()
33
    {
34
        $this->disconnect();
35
    }
36
    public function connect()
37
    {
38
        if ($this->lnk === null) {
39
            $this->lnk = new \mysqli(
40
                (isset($this->connection['opts']['persist']) && $this->connection['opts']['persist'] ? 'p:' : '') .
41
                    $this->connection['host'],
42
                $this->connection['user'],
43
                $this->connection['pass'],
44
                $this->connection['name'],
45
                isset($this->connection['opts']['socket']) ? null : $this->connection['port'],
46
                $this->connection['opts']['socket'] ?? null
47
            );
48
            if ($this->lnk->connect_errno) {
49
                throw new DBException('Connect error: '.$this->lnk->connect_errno);
50
            }
51
            if (!$this->lnk->set_charset($this->connection['opts']['charset'])) {
52
                throw new DBException('Charset error: '.$this->lnk->connect_errno);
53
            }
54
            if (isset($this->connection['opts']['timezone'])) {
55
                $this->lnk->query("SET time_zone = '".addslashes($this->connection['opts']['timezone'])."'");
56
            }
57
            if (isset($this->connection['opts']['sql_mode'])) {
58
                $this->lnk->query("SET sql_mode = '".addslashes($this->connection['opts']['sql_mode'])."'");
59
            }
60
        }
61
    }
62
    public function test() : bool
63
    {
64
        if ($this->lnk) {
65
            return true;
66
        }
67
        try {
68
            @$this->connect();
69
            return true;
70
        } catch (\Exception $e) {
71
            $this->lnk = null;
72
            return false;
73
        }
74
    }
75
    public function disconnect()
76
    {
77
        if ($this->lnk !== null && $this->lnk !== false) {
78
            $this->lnk->close();
79
        }
80
    }
81
    public function prepare(string $sql) : StatementInterface
82
    {
83
        $this->connect();
84
        $temp = $this->lnk->prepare($sql);
85
        if (!$temp) {
86
            throw new DBException('Could not prepare : '.$this->lnk->error.' <'.$sql.'>');
87
        }
88
        return new Statement($temp);
89
    }
90
    public function raw(string $sql)
91
    {
92
        return $this->lnk->query($sql);
93
    }
94
    public function begin() : bool
95
    {
96
        $this->connect();
97
        return $this->lnk->begin_transaction();
98
    }
99
    public function commit() : bool
100
    {
101
        $this->connect();
102
        return $this->lnk->commit();
103
    }
104
    public function rollback() : bool
105
    {
106
        $this->connect();
107
        return $this->lnk->rollback();
108
    }
109
}
110