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:
9: class OracleProcessor extends Processor
10: {
11: 12: 13: 14: 15: 16: 17: 18: 19:
20: public function processInsertGetId(Builder $query, $sql, $values, $sequence = null)
21: {
22: $id = 0;
23: $parameter = 0;
24: $statement = $this->prepareStatement($query, $sql);
25: $values = $this->incrementBySequence($values, $sequence);
26: $parameter = $this->bindValues($values, $statement, $parameter);
27: $statement->bindParam($parameter, $id, PDO::PARAM_INT, 10);
28: $statement->execute();
29:
30: return (int) $id;
31: }
32:
33: 34: 35: 36: 37: 38: 39:
40: private function prepareStatement(Builder $query, $sql)
41: {
42: $pdo = $query->getConnection()->getPdo();
43:
44: return $pdo->prepare($sql);
45: }
46:
47: 48: 49: 50: 51: 52: 53:
54: protected function incrementBySequence(array $values, $sequence)
55: {
56: $builder = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 5)[4]['object'];
57: $builderArgs = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 5)[3]['args'];
58:
59: if (! isset($builderArgs[1][0][$sequence])) {
60: if (method_exists($builder, 'getModel')) {
61: $model = $builder->getModel();
62: if ($model->sequence && $model->incrementing) {
63: $values[] = (int) $model->getConnection()->getSequence()->nextValue($model->sequence);
64: }
65: }
66: }
67:
68: return $values;
69: }
70:
71: 72: 73: 74: 75: 76: 77: 78:
79: private function bindValues(&$values, $statement, $parameter)
80: {
81: $count = count($values);
82: for ($i = 0; $i < $count; $i++) {
83: if (is_object($values[$i])) {
84: $values[$i] = (string) $values[$i];
85: }
86: $type = $this->getPdoType($values[$i]);
87: $statement->bindParam($parameter, $values[$i], $type);
88: $parameter++;
89: }
90:
91: return $parameter;
92: }
93:
94: 95: 96: 97: 98: 99:
100: private function getPdoType($value)
101: {
102: if (is_int($value)) {
103: return PDO::PARAM_INT;
104: } elseif (is_bool($value)) {
105: return PDO::PARAM_BOOL;
106: } elseif (is_null($value)) {
107: return PDO::PARAM_NULL;
108: } else {
109: return PDO::PARAM_STR;
110: }
111: }
112:
113: 114: 115: 116: 117: 118: 119: 120: 121:
122: public function saveLob(Builder $query, $sql, array $values, array $binaries)
123: {
124: $id = 0;
125: $parameter = 0;
126: $statement = $this->prepareStatement($query, $sql);
127:
128: $parameter = $this->bindValues($values, $statement, $parameter);
129:
130: $countBinary = count($binaries);
131: for ($i = 0; $i < $countBinary; $i++) {
132: $statement->bindParam($parameter, $binaries[$i], PDO::PARAM_LOB, -1);
133: $parameter++;
134: }
135:
136:
137: $statement->bindParam($parameter, $id, PDO::PARAM_INT, 10);
138:
139: if (! $statement->execute()) {
140: return false;
141: }
142:
143: return (int) $id;
144: }
145:
146: 147: 148: 149: 150: 151:
152: public function processColumnListing($results)
153: {
154: $mapping = function ($r) {
155: $r = (object) $r;
156:
157: return $r->column_name;
158: };
159:
160: return array_map($mapping, $results);
161: }
162: }
163: