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

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

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

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

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

52
    public function getServerVersion() : string
53
    {
54
        $serverInfo = db2_server_info($this->conn);
55
        assert($serverInfo instanceof stdClass);
56 57 58 59

        return $serverInfo->DBMS_VER;
    }

60
    public function prepare(string $sql) : DriverStatement
61
    {
62
        $stmt = @db2_prepare($this->conn, $sql);
63
        if (! $stmt) {
64
            throw DB2Exception::fromStatementError();
65
        }
66

Benjamin Eberlei's avatar
Benjamin Eberlei committed
67
        return new DB2Statement($stmt);
68
    }
69

70
    public function query(string $sql) : ResultStatement
71 72 73
    {
        $stmt = $this->prepare($sql);
        $stmt->execute();
74

75 76 77
        return $stmt;
    }

78
    public function quote(string $input) : string
79
    {
80
        return "'" . db2_escape_string($input) . "'";
81 82
    }

83
    public function exec(string $statement) : int
84
    {
85
        $stmt = @db2_exec($this->conn, $statement);
86

87
        if ($stmt === false) {
88
            throw DB2Exception::fromStatementError();
89
        }
90

91
        return db2_num_rows($stmt);
92 93
    }

94
    public function lastInsertId(?string $name = null) : string
95
    {
96
        return db2_last_insert_id($this->conn);
97 98
    }

99
    public function beginTransaction() : void
100
    {
101
        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_OFF)) {
102
            throw DB2Exception::fromConnectionError($this->conn);
103
        }
104 105
    }

106
    public function commit() : void
107
    {
108
        if (! db2_commit($this->conn)) {
109
            throw DB2Exception::fromConnectionError($this->conn);
110
        }
111 112

        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON)) {
113
            throw DB2Exception::fromConnectionError($this->conn);
114
        }
115 116
    }

117
    public function rollBack() : void
118
    {
119
        if (! db2_rollback($this->conn)) {
120
            throw DB2Exception::fromConnectionError($this->conn);
121
        }
122 123

        if (! db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON)) {
124
            throw DB2Exception::fromConnectionError($this->conn);
125
        }
126
    }
127
}