-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
DB2Connection.php
127 lines (104 loc) · 3.28 KB
/
DB2Connection.php
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
<?php
declare(strict_types=0);
namespace Doctrine\DBAL\Driver\IBMDB2;
use Doctrine\DBAL\Driver\ResultStatement;
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use stdClass;
use function assert;
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;
use const DB2_AUTOCOMMIT_OFF;
use const DB2_AUTOCOMMIT_ON;
final class DB2Connection implements ServerInfoAwareConnection
{
/** @var resource */
private $conn;
/**
* @param array<string, mixed> $params
* @param array<string, mixed> $driverOptions
*
* @throws DB2Exception
*/
public function __construct(array $params, string $username, string $password, array $driverOptions = [])
{
if (isset($params['persistent']) && $params['persistent'] === true) {
$conn = db2_pconnect($params['dbname'], $username, $password, $driverOptions);
} else {
$conn = db2_connect($params['dbname'], $username, $password, $driverOptions);
}
if ($conn === false) {
throw DB2Exception::fromConnectionError();
}
$this->conn = $conn;
}
public function getServerVersion() : string
{
$serverInfo = db2_server_info($this->conn);
assert($serverInfo instanceof stdClass);
return $serverInfo->DBMS_VER;
}
public function prepare(string $sql) : DriverStatement
{
$stmt = @db2_prepare($this->conn, $sql);
if ($stmt === false) {
throw DB2Exception::fromStatementError();
}
return new DB2Statement($stmt);
}
public function query(string $sql) : ResultStatement
{
$stmt = $this->prepare($sql);
$stmt->execute();
return $stmt;
}
public function quote(string $input) : string
{
return "'" . db2_escape_string($input) . "'";
}
public function exec(string $statement) : int
{
$stmt = @db2_exec($this->conn, $statement);
if ($stmt === false) {
throw DB2Exception::fromStatementError();
}
return db2_num_rows($stmt);
}
public function lastInsertId(?string $name = null) : string
{
return db2_last_insert_id($this->conn);
}
public function beginTransaction() : void
{
if (db2_autocommit($this->conn, DB2_AUTOCOMMIT_OFF) !== true) {
throw DB2Exception::fromConnectionError($this->conn);
}
}
public function commit() : void
{
if (! db2_commit($this->conn)) {
throw DB2Exception::fromConnectionError($this->conn);
}
if (db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON) !== true) {
throw DB2Exception::fromConnectionError($this->conn);
}
}
public function rollBack() : void
{
if (! db2_rollback($this->conn)) {
throw DB2Exception::fromConnectionError($this->conn);
}
if (db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON) !== true) {
throw DB2Exception::fromConnectionError($this->conn);
}
}
}