1: <?php
2:
3: namespace Yajra\Oci8\Schema;
4:
5: use Illuminate\Database\Connection;
6: use Illuminate\Database\Schema\Blueprint;
7:
8: class OracleAutoIncrementHelper
9: {
10: 11: 12:
13: protected $connection;
14:
15: 16: 17:
18: protected $trigger;
19:
20: 21: 22:
23: protected $sequence;
24:
25: 26: 27:
28: public function __construct(Connection $connection)
29: {
30: $this->connection = $connection;
31: $this->sequence = new Sequence($connection);
32: $this->trigger = new Trigger($connection);
33: }
34:
35: 36: 37: 38: 39: 40: 41:
42: public function createAutoIncrementObjects(Blueprint $blueprint, $table)
43: {
44: $column = $this->getQualifiedAutoIncrementColumn($blueprint);
45:
46:
47: if (is_null($column)) {
48: return;
49: }
50:
51: $col = $column->name;
52: $start = isset($column->start) ? $column->start : 1;
53:
54:
55: $prefix = $this->connection->getTablePrefix();
56:
57:
58: $sequenceName = $this->createObjectName($prefix, $table, $col, 'seq');
59: $this->sequence->create($sequenceName, $start, $column->nocache);
60:
61:
62: $triggerName = $this->createObjectName($prefix, $table, $col, 'trg');
63: $this->trigger->autoIncrement($prefix . $table, $col, $triggerName, $sequenceName);
64: }
65:
66: 67: 68: 69: 70: 71:
72: public function getQualifiedAutoIncrementColumn(Blueprint $blueprint)
73: {
74: $columns = $blueprint->getColumns();
75:
76:
77: foreach ($columns as $column) {
78:
79: if ($column->autoIncrement) {
80: return $column;
81: }
82: }
83:
84: return null;
85: }
86:
87: 88: 89: 90: 91: 92: 93: 94: 95:
96: private function createObjectName($prefix, $table, $col, $type)
97: {
98:
99: return substr($prefix . $table . '_' . $col . '_' . $type, 0, 30);
100: }
101:
102: 103: 104: 105: 106: 107:
108: public function dropAutoIncrementObjects($table)
109: {
110:
111: $prefix = $this->connection->getTablePrefix();
112:
113: $col = $this->getPrimaryKey($prefix . $table);
114:
115: if (isset($col) and ! empty($col)) {
116:
117: $sequenceName = $this->createObjectName($prefix, $table, $col, 'seq');
118: $this->sequence->drop($sequenceName);
119:
120:
121: $triggerName = $this->createObjectName($prefix, $table, $col, 'trg');
122: $this->trigger->drop($triggerName);
123: }
124: }
125:
126: 127: 128: 129: 130: 131:
132: public function getPrimaryKey($table)
133: {
134: if (! $table) {
135: return '';
136: }
137:
138: $data = $this->connection->selectOne("
139: SELECT cols.column_name
140: FROM all_constraints cons, all_cons_columns cols
141: WHERE cols.table_name = upper('{$table}')
142: AND cons.constraint_type = 'P'
143: AND cons.constraint_name = cols.constraint_name
144: AND cons.owner = cols.owner
145: AND cols.position = 1
146: AND cons.owner = (select user from dual)
147: ORDER BY cols.table_name, cols.position
148: ");
149:
150: if (count($data)) {
151: return $data->column_name;
152: }
153:
154: return '';
155: }
156:
157: 158: 159:
160: public function getSequence()
161: {
162: return $this->sequence;
163: }
164:
165: 166: 167:
168: public function setSequence($sequence)
169: {
170: $this->sequence = $sequence;
171: }
172:
173: 174: 175:
176: public function getTrigger()
177: {
178: return $this->trigger;
179: }
180:
181: 182: 183:
184: public function setTrigger($trigger)
185: {
186: $this->trigger = $trigger;
187: }
188: }
189: