DB2Connection.php 4.41 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php
/*
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
Benjamin Eberlei's avatar
Benjamin Eberlei committed
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
Benjamin Morel's avatar
Benjamin Morel committed
18
 */
19

Benjamin Eberlei's avatar
Benjamin Eberlei committed
20
namespace Doctrine\DBAL\Driver\IBMDB2;
21

Steve Müller's avatar
Steve Müller committed
22
use Doctrine\DBAL\Driver\Connection;
23
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
24
use Doctrine\DBAL\ParameterType;
Steve Müller's avatar
Steve Müller committed
25

26
class DB2Connection implements Connection, ServerInfoAwareConnection
27
{
Benjamin Morel's avatar
Benjamin Morel committed
28 29 30
    /**
     * @var resource
     */
31 32
    private $_conn = null;

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

Possum's avatar
Possum committed
45
        if ($isPersistent) {
46
            $this->_conn = db2_pconnect($params['dbname'], $username, $password, $driverOptions);
47
        } else {
48
            $this->_conn = db2_connect($params['dbname'], $username, $password, $driverOptions);
49
        }
50
        if ( ! $this->_conn) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
51
            throw new DB2Exception(db2_conn_errormsg());
52 53 54
        }
    }

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    /**
     * {@inheritdoc}
     */
    public function getServerVersion()
    {
        $serverInfo = db2_server_info($this->_conn);

        return $serverInfo->DBMS_VER;
    }

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

Benjamin Morel's avatar
Benjamin Morel committed
73 74 75
    /**
     * {@inheritdoc}
     */
76
    public function prepare($sql)
77 78
    {
        $stmt = @db2_prepare($this->_conn, $sql);
79
        if ( ! $stmt) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
80
            throw new DB2Exception(db2_stmt_errormsg());
81
        }
82

Benjamin Eberlei's avatar
Benjamin Eberlei committed
83
        return new DB2Statement($stmt);
84
    }
85

Benjamin Morel's avatar
Benjamin Morel committed
86 87 88
    /**
     * {@inheritdoc}
     */
89
    public function query()
90 91 92 93 94
    {
        $args = func_get_args();
        $sql = $args[0];
        $stmt = $this->prepare($sql);
        $stmt->execute();
95

96 97 98
        return $stmt;
    }

Benjamin Morel's avatar
Benjamin Morel committed
99 100 101
    /**
     * {@inheritdoc}
     */
102
    public function quote($input, $type = ParameterType::STRING)
103 104
    {
        $input = db2_escape_string($input);
105

Sergei Morozov's avatar
Sergei Morozov committed
106
        if ($type === ParameterType::INTEGER) {
107 108
            return $input;
        }
Gabriel Caruso's avatar
Gabriel Caruso committed
109 110

        return "'".$input."'";
111 112
    }

Benjamin Morel's avatar
Benjamin Morel committed
113 114 115
    /**
     * {@inheritdoc}
     */
116
    public function exec($statement)
117
    {
118 119 120 121 122
        $stmt = @db2_exec($this->_conn, $statement);

        if (false === $stmt) {
            throw new DB2Exception(db2_stmt_errormsg());
        }
123

124
        return db2_num_rows($stmt);
125 126
    }

Benjamin Morel's avatar
Benjamin Morel committed
127 128 129
    /**
     * {@inheritdoc}
     */
130
    public function lastInsertId($name = null)
131
    {
132
        return db2_last_insert_id($this->_conn);
133 134
    }

Benjamin Morel's avatar
Benjamin Morel committed
135 136 137
    /**
     * {@inheritdoc}
     */
138
    public function beginTransaction()
139 140 141 142
    {
        db2_autocommit($this->_conn, DB2_AUTOCOMMIT_OFF);
    }

Benjamin Morel's avatar
Benjamin Morel committed
143 144 145
    /**
     * {@inheritdoc}
     */
146
    public function commit()
147 148
    {
        if (!db2_commit($this->_conn)) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
149
            throw new DB2Exception(db2_conn_errormsg($this->_conn));
150 151 152 153
        }
        db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON);
    }

Benjamin Morel's avatar
Benjamin Morel committed
154 155 156
    /**
     * {@inheritdoc}
     */
157
    public function rollBack()
158 159
    {
        if (!db2_rollback($this->_conn)) {
Benjamin Eberlei's avatar
Benjamin Eberlei committed
160
            throw new DB2Exception(db2_conn_errormsg($this->_conn));
161 162 163 164
        }
        db2_autocommit($this->_conn, DB2_AUTOCOMMIT_ON);
    }

Benjamin Morel's avatar
Benjamin Morel committed
165 166 167
    /**
     * {@inheritdoc}
     */
168
    public function errorCode()
169 170 171 172
    {
        return db2_conn_error($this->_conn);
    }

Benjamin Morel's avatar
Benjamin Morel committed
173 174 175
    /**
     * {@inheritdoc}
     */
176
    public function errorInfo()
177
    {
178
        return [
179 180
            0 => db2_conn_errormsg($this->_conn),
            1 => $this->errorCode(),
181
        ];
182
    }
183
}