Completed
Push — 3.0 ( 57899a...004249 )
by Arjay
04:13
created

OracleProcessor::processInsertGetId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 2 Features 0
Metric Value
c 8
b 2
f 0
dl 0
loc 12
rs 9.4286
cc 1
eloc 8
nc 1
nop 4
1
<?php
2
3
namespace yajra\Oci8\Query\Processors;
4
5
use Illuminate\Database\Query\Builder;
6
use Illuminate\Database\Query\Processors\Processor;
7
use PDO;
8
use PDOStatement;
9
10
class OracleProcessor extends Processor
11
{
12
    /**
13
     * Process an "insert get ID" query.
14
     *
15
     * @param  Builder $query
16
     * @param  string $sql
17
     * @param  array $values
18
     * @param  string $sequence
19
     * @return int
20
     */
21
    public function processInsertGetId(Builder $query, $sql, $values, $sequence = null)
22
    {
23
        $id        = 0;
24
        $parameter = 0;
25
        $statement = $this->prepareStatement($query, $sql);
26
27
        $parameter = $this->bindValues($values, $statement, $parameter);
28
        $statement->bindParam($parameter, $id, PDO::PARAM_INT, 10);
29
        $statement->execute();
30
31
        return (int) $id;
32
    }
33
34
    /**
35
     * Get prepared statement.
36
     *
37
     * @param Builder $query
38
     * @param string $sql
39
     * @return \PDOStatement | \Yajra\Pdo\Oci8
40
     */
41
    private function prepareStatement(Builder $query, $sql)
42
    {
43
        $pdo = $query->getConnection()->getPdo();
44
45
        return $pdo->prepare($sql);
46
    }
47
48
    /**
49
     * Bind values to PDO statement.
50
     *
51
     * @param array $values
52
     * @param \PDOStatement $statement
53
     * @param int $parameter
54
     * @return int
55
     */
56
    private function bindValues(&$values, $statement, $parameter)
57
    {
58
        $count = count($values);
59
        for ($i = 0; $i < $count; $i++) {
60
            $type = $this->getPdoType($values[$i]);
61
            $statement->bindParam($parameter, $values[$i], $type);
62
            $parameter++;
63
        }
64
65
        return $parameter;
66
    }
67
68
    /**
69
     * Get PDO Type depending on value.
70
     *
71
     * @param mixed $value
72
     * @return int
73
     */
74
    private function getPdoType($value)
75
    {
76
        if (is_int($value)) {
77
            return PDO::PARAM_INT;
78
        } elseif (is_bool($value)) {
79
            return PDO::PARAM_BOOL;
80
        } elseif (is_null($value)) {
81
            return PDO::PARAM_NULL;
82
        } else {
83
            return PDO::PARAM_STR;
84
        }
85
    }
86
87
    /**
88
     * Save Query with Blob returning primary key value.
89
     *
90
     * @param  Builder $query
91
     * @param  string $sql
92
     * @param  array $values
93
     * @param  array $binaries
94
     * @return int
95
     */
96
    public function saveLob(Builder $query, $sql, array $values, array $binaries)
97
    {
98
        $id        = 0;
99
        $parameter = 0;
100
        $statement = $this->prepareStatement($query, $sql);
101
102
        $parameter = $this->bindValues($values, $statement, $parameter);
103
104
        $countBinary = count($binaries);
105
        for ($i = 0; $i < $countBinary; $i++) {
106
            $statement->bindParam($parameter, $binaries[$i], PDO::PARAM_LOB, -1);
107
            $parameter++;
108
        }
109
110
        // bind output param for the returning clause.
111
        $statement->bindParam($parameter, $id, PDO::PARAM_INT, 10);
112
113
        if (! $statement->execute()) {
114
            return false;
115
        }
116
117
        return (int) $id;
118
    }
119
}
120
121