DB2Connection.php 4.2 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 const DB2_AUTOCOMMIT_OFF;
use const DB2_AUTOCOMMIT_ON;
11
use function assert;
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
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;
27
use function is_bool;
Steve Müller's avatar
Steve Müller committed
28

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

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

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

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

        $this->conn = $conn;
57 58
    }

59 60 61 62 63
    /**
     * {@inheritdoc}
     */
    public function getServerVersion()
    {
64
        /** @var stdClass $serverInfo */
65
        $serverInfo = db2_server_info($this->conn);
66 67 68 69 70 71 72 73 74 75 76 77

        return $serverInfo->DBMS_VER;
    }

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

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

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

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

101 102 103
        return $stmt;
    }

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

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

115
        return "'" . $input . "'";
116 117
    }

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

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

129
        return db2_num_rows($stmt);
130 131
    }

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

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

        return $result;
149 150
    }

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

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

        return $result;
164 165
    }

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

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

        return $result;
179 180
    }

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

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