DB2Connection.php 3.55 KB
Newer Older
1 2
<?php

Michael Moravec's avatar
Michael Moravec committed
3 4
declare(strict_types=0);

Benjamin Eberlei's avatar
Benjamin Eberlei committed
5
namespace Doctrine\DBAL\Driver\IBMDB2;
6

7
use Doctrine\DBAL\Driver\ResultStatement;
8
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
9
use Doctrine\DBAL\Driver\Statement as DriverStatement;
10
use stdClass;
11 12 13 14 15 16 17 18 19 20 21 22 23
use const DB2_AUTOCOMMIT_OFF;
use const DB2_AUTOCOMMIT_ON;
use function db2_autocommit;
use function db2_commit;
use function db2_connect;
use function db2_escape_string;
use function db2_exec;
use function db2_last_insert_id;
use function db2_num_rows;
use function db2_pconnect;
use function db2_prepare;
use function db2_rollback;
use function db2_server_info;
Steve Müller's avatar
Steve Müller committed
24

25
final class DB2Connection implements ServerInfoAwareConnection
26
{
27
    /** @var resource */
28
    private $conn;
29

Benjamin Morel's avatar
Benjamin Morel committed
30
    /**
31 32
     * @param array<string, mixed> $params
     * @param array<string, mixed> $driverOptions
Benjamin Morel's avatar
Benjamin Morel committed
33
     *
34
     * @throws DB2Exception
Benjamin Morel's avatar
Benjamin Morel committed
35
     */
36
    public function __construct(array $params, string $username, string $password, array $driverOptions = [])
37
    {
38
        if (isset($params['persistent']) && $params['persistent'] === true) {
Sergei Morozov's avatar
Sergei Morozov committed
39
            $conn = db2_pconnect($params['dbname'], $username, $password, $driverOptions);
40
        } else {
Sergei Morozov's avatar
Sergei Morozov committed
41
            $conn = db2_connect($params['dbname'], $username, $password, $driverOptions);
42
        }
Sergei Morozov's avatar
Sergei Morozov committed
43 44

        if ($conn === false) {
45
            throw DB2Exception::fromConnectionError();
46
        }
Sergei Morozov's avatar
Sergei Morozov committed
47 48

        $this->conn = $conn;
49 50
    }

51 52 53
    /**
     * {@inheritdoc}
     */
54
    public function getServerVersion() : string
55
    {
56
        /** @var stdClass $serverInfo */
57
        $serverInfo = db2_server_info($this->conn);
58 59 60 61

        return $serverInfo->DBMS_VER;
    }

Benjamin Morel's avatar
Benjamin Morel committed
62 63 64
    /**
     * {@inheritdoc}
     */
65
    public function prepare(string $sql) : DriverStatement
66
    {
67
        $stmt = @db2_prepare($this->conn, $sql);
68
        if (! $stmt) {
69
            throw DB2Exception::fromStatementError();
70
        }
71

Benjamin Eberlei's avatar
Benjamin Eberlei committed
72
        return new DB2Statement($stmt);
73
    }
74

Benjamin Morel's avatar
Benjamin Morel committed
75 76 77
    /**
     * {@inheritdoc}
     */
78
    public function query(string $sql) : ResultStatement
79 80 81
    {
        $stmt = $this->prepare($sql);
        $stmt->execute();
82

83 84 85
        return $stmt;
    }

Benjamin Morel's avatar
Benjamin Morel committed
86 87 88
    /**
     * {@inheritdoc}
     */
89
    public function quote(string $input) : string
90
    {
91
        return "'" . db2_escape_string($input) . "'";
92 93
    }

Benjamin Morel's avatar
Benjamin Morel committed
94 95 96
    /**
     * {@inheritdoc}
     */
97
    public function exec(string $statement) : int
98
    {
99
        $stmt = @db2_exec($this->conn, $statement);
100

101
        if ($stmt === false) {
102
            throw DB2Exception::fromStatementError();
103
        }
104

105
        return db2_num_rows($stmt);
106 107
    }

Benjamin Morel's avatar
Benjamin Morel committed
108 109 110
    /**
     * {@inheritdoc}
     */
111
    public function lastInsertId(?string $name = null) : string
112
    {
113
        return db2_last_insert_id($this->conn);
114 115
    }

Benjamin Morel's avatar
Benjamin Morel committed
116 117 118
    /**
     * {@inheritdoc}
     */
119
    public function beginTransaction() : void
120
    {
121
        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_OFF)) {
122
            throw DB2Exception::fromConnectionError($this->conn);
123
        }
124 125
    }

Benjamin Morel's avatar
Benjamin Morel committed
126 127 128
    /**
     * {@inheritdoc}
     */
129
    public function commit() : void
130
    {
131
        if (! db2_commit($this->conn)) {
132
            throw DB2Exception::fromConnectionError($this->conn);
133
        }
134 135

        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON)) {
136
            throw DB2Exception::fromConnectionError($this->conn);
137
        }
138 139
    }

Benjamin Morel's avatar
Benjamin Morel committed
140 141 142
    /**
     * {@inheritdoc}
     */
143
    public function rollBack() : void
144
    {
145
        if (! db2_rollback($this->conn)) {
146
            throw DB2Exception::fromConnectionError($this->conn);
147
        }
148 149

        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON)) {
150
            throw DB2Exception::fromConnectionError($this->conn);
151
        }
152
    }
153
}