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