OracleAutoIncrementHelper   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 188
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 188
ccs 0
cts 81
cp 0
rs 10
c 0
b 0
f 0
wmc 18
lcom 1
cbo 4

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A createAutoIncrementObjects() 0 23 3
A getQualifiedAutoIncrementColumn() 0 14 3
A createObjectName() 0 5 1
A dropAutoIncrementObjects() 0 17 3
A getSequence() 0 4 1
A setSequence() 0 4 1
A getTrigger() 0 4 1
A setTrigger() 0 4 1
A getPrimaryKey() 0 23 3
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
     * @var \Illuminate\Database\Connection
12
     */
13
    protected $connection;
14
15
    /**
16
     * @var \Yajra\Oci8\Schema\Trigger
17
     */
18
    protected $trigger;
19
20
    /**
21
     * @var \Yajra\Oci8\Schema\Sequence
22
     */
23
    protected $sequence;
24
25
    /**
26
     * @param \Illuminate\Database\Connection $connection
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
     * create sequence and trigger for autoIncrement support
37
     *
38
     * @param  Blueprint $blueprint
39
     * @param  string $table
40
     * @return null
41
     */
42
    public function createAutoIncrementObjects(Blueprint $blueprint, $table)
43
    {
44
        $column = $this->getQualifiedAutoIncrementColumn($blueprint);
45
46
        // return if no qualified AI column
47
        if (is_null($column)) {
48
            return;
49
        }
50
51
        $col   = $column->name;
52
        $start = isset($column->start) ? $column->start : 1;
53
54
        // get table prefix
55
        $prefix = $this->connection->getTablePrefix();
56
57
        // create sequence for auto increment
58
        $sequenceName = $this->createObjectName($prefix, $table, $col, 'seq');
59
        $this->sequence->create($sequenceName, $start, $column->nocache);
60
61
        // create trigger for auto increment work around
62
        $triggerName = $this->createObjectName($prefix, $table, $col, 'trg');
63
        $this->trigger->autoIncrement($prefix . $table, $col, $triggerName, $sequenceName);
64
    }
65
66
    /**
67
     * Get qualified autoincrement column.
68
     *
69
     * @param  Blueprint $blueprint
70
     * @return \Illuminate\Support\Fluent|null
71
     */
72
    public function getQualifiedAutoIncrementColumn(Blueprint $blueprint)
73
    {
74
        $columns = $blueprint->getColumns();
75
76
        // search for primary key / autoIncrement column
77
        foreach ($columns as $column) {
78
            // if column is autoIncrement set the primary col name
79
            if ($column->autoIncrement) {
80
                return $column;
81
            }
82
        }
83
84
        return null;
85
    }
86
87
    /**
88
     * Create an object name that limits to 30 chars.
89
     *
90
     * @param  string $prefix
91
     * @param  string $table
92
     * @param  string $col
93
     * @param  string $type
94
     * @return string
95
     */
96
    private function createObjectName($prefix, $table, $col, $type)
97
    {
98
        // max object name length is 30 chars
99
        return substr($prefix . $table . '_' . $col . '_' . $type, 0, 30);
100
    }
101
102
    /**
103
     * Drop sequence and triggers if exists, autoincrement objects.
104
     *
105
     * @param  string $table
106
     * @return null
107
     */
108
    public function dropAutoIncrementObjects($table)
109
    {
110
        // drop sequence and trigger object
111
        $prefix = $this->connection->getTablePrefix();
112
        // get the actual primary column name from table
113
        $col = $this->getPrimaryKey($prefix . $table);
114
        // if primary key col is set, drop auto increment objects
115
        if (isset($col) && ! empty($col)) {
116
            // drop sequence for auto increment
117
            $sequenceName = $this->createObjectName($prefix, $table, $col, 'seq');
118
            $this->sequence->drop($sequenceName);
119
120
            // drop trigger for auto increment work around
121
            $triggerName = $this->createObjectName($prefix, $table, $col, 'trg');
122
            $this->trigger->drop($triggerName);
123
        }
124
    }
125
126
    /**
127
     * Get table's primary key.
128
     *
129
     * @param  string $table
130
     * @return string
131
     */
132
    public function getPrimaryKey($table)
133
    {
134
        if (! $table) {
135
            return '';
136
        }
137
138
        $sql  = "SELECT cols.column_name
139
            FROM all_constraints cons, all_cons_columns cols
140
            WHERE upper(cols.table_name) = upper('{$table}')
141
                AND cons.constraint_type = 'P'
142
                AND cons.constraint_name = cols.constraint_name
143
                AND cons.owner = cols.owner
144
                AND cols.position = 1
145
                AND cons.owner = (select user from dual)
146
            ORDER BY cols.table_name, cols.position";
147
        $data = $this->connection->selectOne($sql);
148
149
        if (count($data)) {
150
            return $data->column_name;
151
        }
152
153
        return '';
154
    }
155
156
    /**
157
     * Get sequence instance.
158
     *
159
     * @return Sequence
160
     */
161
    public function getSequence()
162
    {
163
        return $this->sequence;
164
    }
165
166
    /**
167
     * Set sequence instance.
168
     *
169
     * @param Sequence $sequence
170
     */
171
    public function setSequence($sequence)
172
    {
173
        $this->sequence = $sequence;
174
    }
175
176
    /**
177
     * Get trigger instance.
178
     *
179
     * @return Trigger
180
     */
181
    public function getTrigger()
182
    {
183
        return $this->trigger;
184
    }
185
186
    /**
187
     * Set the trigger instance.
188
     *
189
     * @param Trigger $trigger
190
     */
191
    public function setTrigger($trigger)
192
    {
193
        $this->trigger = $trigger;
194
    }
195
}
196