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

Benjamin Eberlei's avatar
Benjamin Eberlei committed
3
namespace Doctrine\DBAL\Driver\IBMDB2;
4

Steve Müller's avatar
Steve Müller committed
5
use Doctrine\DBAL\Driver\Connection;
6
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
7
use Doctrine\DBAL\ParameterType;
8
use stdClass;
9

10
use function assert;
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
use function db2_autocommit;
use function db2_commit;
use function db2_conn_error;
use function db2_conn_errormsg;
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;
use function db2_stmt_errormsg;
use function func_get_args;
26
use function is_bool;
27

Grégoire Paris's avatar
Grégoire Paris committed
28 29
use const DB2_AUTOCOMMIT_OFF;
use const DB2_AUTOCOMMIT_ON;
Steve Müller's avatar
Steve Müller committed
30

31
class DB2Connection implements Connection, ServerInfoAwareConnection
32
{
33
    /** @var resource */
34
    private $conn = null;
35

Benjamin Morel's avatar
Benjamin Morel committed
36
    /**
37 38 39 40
     * @param mixed[] $params
     * @param string  $username
     * @param string  $password
     * @param mixed[] $driverOptions
Benjamin Morel's avatar
Benjamin Morel committed
41
     *
42
     * @throws DB2Exception
Benjamin Morel's avatar
Benjamin Morel committed
43
     */
44
    public function __construct(array $params, $username, $password, $driverOptions = [])
45
    {
46
        $isPersistent = (isset($params['persistent']) && $params['persistent'] === true);
47

Possum's avatar
Possum committed
48
        if ($isPersistent) {
Sergei Morozov's avatar
Sergei Morozov committed
49
            $conn = db2_pconnect($params['dbname'], $username, $password, $driverOptions);
50
        } else {
Sergei Morozov's avatar
Sergei Morozov committed
51
            $conn = db2_connect($params['dbname'], $username, $password, $driverOptions);
52
        }
Sergei Morozov's avatar
Sergei Morozov committed
53 54

        if ($conn === false) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
55
            throw new DB2Exception(db2_conn_errormsg());
56
        }
Sergei Morozov's avatar
Sergei Morozov committed
57 58

        $this->conn = $conn;
59 60
    }

61 62 63 64 65
    /**
     * {@inheritdoc}
     */
    public function getServerVersion()
    {
66
        $serverInfo = db2_server_info($this->conn);
Grégoire Paris's avatar
Grégoire Paris committed
67
        assert($serverInfo instanceof stdClass);
68 69 70 71 72 73 74 75 76 77 78 79

        return $serverInfo->DBMS_VER;
    }

    /**
     * {@inheritdoc}
     */
    public function requiresQueryForServerVersion()
    {
        return false;
    }

Benjamin Morel's avatar
Benjamin Morel committed
80 81 82
    /**
     * {@inheritdoc}
     */
83
    public function prepare($sql)
84
    {
85
        $stmt = @db2_prepare($this->conn, $sql);
86
        if (! $stmt) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
87
            throw new DB2Exception(db2_stmt_errormsg());
88
        }
89

Benjamin Eberlei's avatar
Benjamin Eberlei committed
90
        return new DB2Statement($stmt);
91
    }
92

Benjamin Morel's avatar
Benjamin Morel committed
93 94 95
    /**
     * {@inheritdoc}
     */
96
    public function query()
97 98
    {
        $args = func_get_args();
99
        $sql  = $args[0];
100 101
        $stmt = $this->prepare($sql);
        $stmt->execute();
102

103 104 105
        return $stmt;
    }

Benjamin Morel's avatar
Benjamin Morel committed
106 107 108
    /**
     * {@inheritdoc}
     */
109
    public function quote($input, $type = ParameterType::STRING)
110 111
    {
        $input = db2_escape_string($input);
112

Sergei Morozov's avatar
Sergei Morozov committed
113
        if ($type === ParameterType::INTEGER) {
114 115
            return $input;
        }
Gabriel Caruso's avatar
Gabriel Caruso committed
116

117
        return "'" . $input . "'";
118 119
    }

Benjamin Morel's avatar
Benjamin Morel committed
120 121 122
    /**
     * {@inheritdoc}
     */
123
    public function exec($statement)
124
    {
125
        $stmt = @db2_exec($this->conn, $statement);
126

127
        if ($stmt === false) {
128 129
            throw new DB2Exception(db2_stmt_errormsg());
        }
130

131
        return db2_num_rows($stmt);
132 133
    }

Benjamin Morel's avatar
Benjamin Morel committed
134 135 136
    /**
     * {@inheritdoc}
     */
137
    public function lastInsertId($name = null)
138
    {
139
        return db2_last_insert_id($this->conn);
140 141
    }

Benjamin Morel's avatar
Benjamin Morel committed
142 143 144
    /**
     * {@inheritdoc}
     */
145
    public function beginTransaction()
146
    {
147 148 149 150
        $result = db2_autocommit($this->conn, DB2_AUTOCOMMIT_OFF);
        assert(is_bool($result));

        return $result;
151 152
    }

Benjamin Morel's avatar
Benjamin Morel committed
153 154 155
    /**
     * {@inheritdoc}
     */
156
    public function commit()
157
    {
158 159
        if (! db2_commit($this->conn)) {
            throw new DB2Exception(db2_conn_errormsg($this->conn));
160
        }
161 162 163 164 165

        $result = db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON);
        assert(is_bool($result));

        return $result;
166 167
    }

Benjamin Morel's avatar
Benjamin Morel committed
168 169 170
    /**
     * {@inheritdoc}
     */
171
    public function rollBack()
172
    {
173 174
        if (! db2_rollback($this->conn)) {
            throw new DB2Exception(db2_conn_errormsg($this->conn));
175
        }
176 177 178 179 180

        $result = db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON);
        assert(is_bool($result));

        return $result;
181 182
    }

Benjamin Morel's avatar
Benjamin Morel committed
183 184 185
    /**
     * {@inheritdoc}
     */
186
    public function errorCode()
187
    {
188
        return db2_conn_error($this->conn);
189 190
    }

Benjamin Morel's avatar
Benjamin Morel committed
191 192 193
    /**
     * {@inheritdoc}
     */
194
    public function errorInfo()
195
    {
196
        return [
197
            0 => db2_conn_errormsg($this->conn),
198
            1 => $this->errorCode(),
199
        ];
200
    }
201
}