summaryrefslogtreecommitdiff
path: root/vendor/doctrine/dbal/src/Driver/IBMDB2/Connection.php
blob: 2c8783b2896276552ad50c27eaf3c658a0e0e9ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php

declare(strict_types=1);

namespace Doctrine\DBAL\Driver\IBMDB2;

use Doctrine\DBAL\Driver\Connection as ConnectionInterface;
use Doctrine\DBAL\Driver\Exception\NoIdentityValue;
use Doctrine\DBAL\Driver\IBMDB2\Exception\ConnectionError;
use Doctrine\DBAL\Driver\IBMDB2\Exception\PrepareFailed;
use Doctrine\DBAL\Driver\IBMDB2\Exception\StatementError;
use stdClass;

use function assert;
use function db2_autocommit;
use function db2_commit;
use function db2_escape_string;
use function db2_exec;
use function db2_last_insert_id;
use function db2_num_rows;
use function db2_prepare;
use function db2_rollback;
use function db2_server_info;
use function error_get_last;

use const DB2_AUTOCOMMIT_OFF;
use const DB2_AUTOCOMMIT_ON;

final class Connection implements ConnectionInterface
{
    /**
     * @internal The connection can be only instantiated by its driver.
     *
     * @param resource $connection
     */
    public function __construct(private readonly mixed $connection)
    {
    }

    public function getServerVersion(): string
    {
        $serverInfo = db2_server_info($this->connection);
        assert($serverInfo instanceof stdClass);

        return $serverInfo->DBMS_VER;
    }

    public function prepare(string $sql): Statement
    {
        $stmt = @db2_prepare($this->connection, $sql);

        if ($stmt === false) {
            throw PrepareFailed::new(error_get_last());
        }

        return new Statement($stmt);
    }

    public function query(string $sql): Result
    {
        return $this->prepare($sql)->execute();
    }

    public function quote(string $value): string
    {
        return "'" . db2_escape_string($value) . "'";
    }

    public function exec(string $sql): int|string
    {
        $stmt = @db2_exec($this->connection, $sql);

        if ($stmt === false) {
            throw StatementError::new();
        }

        $numRows = db2_num_rows($stmt);

        if ($numRows === false) {
            throw StatementError::new();
        }

        return $numRows;
    }

    public function lastInsertId(): string
    {
        $lastInsertId = db2_last_insert_id($this->connection);

        if ($lastInsertId === null) {
            throw NoIdentityValue::new();
        }

        return $lastInsertId;
    }

    public function beginTransaction(): void
    {
        if (db2_autocommit($this->connection, DB2_AUTOCOMMIT_OFF) !== true) {
            throw ConnectionError::new($this->connection);
        }
    }

    public function commit(): void
    {
        if (! db2_commit($this->connection)) {
            throw ConnectionError::new($this->connection);
        }

        if (db2_autocommit($this->connection, DB2_AUTOCOMMIT_ON) !== true) {
            throw ConnectionError::new($this->connection);
        }
    }

    public function rollBack(): void
    {
        if (! db2_rollback($this->connection)) {
            throw ConnectionError::new($this->connection);
        }

        if (db2_autocommit($this->connection, DB2_AUTOCOMMIT_ON) !== true) {
            throw ConnectionError::new($this->connection);
        }
    }

    /** @return resource */
    public function getNativeConnection()
    {
        return $this->connection;
    }
}