Completed
Push — master ( 0f9fc6 )
by Arjay
12:56
created

OracleBuilder::createBlueprint()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 2
dl 0
loc 7
ccs 0
cts 6
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Yajra\Oci8\Schema;
4
5
use Closure;
6
use Illuminate\Database\Connection;
7
use Illuminate\Database\Schema\Builder;
8
9
class OracleBuilder extends Builder
10
{
11
    /**
12
     * @var \Yajra\Oci8\Schema\OracleAutoIncrementHelper
13
     */
14
    public $helper;
15
16
    /**
17
     * @var \Yajra\Oci8\Schema\Comment
18
     */
19
    public $comment;
20
21
    /**
22
     * @param Connection $connection
23
     */
24
    public function __construct(Connection $connection)
25
    {
26
        parent::__construct($connection);
27
        $this->helper  = new OracleAutoIncrementHelper($connection);
28
        $this->comment = new Comment($connection);
29
    }
30
31
    /**
32
     * Create a new table on the schema.
33
     *
34
     * @param  string $table
35
     * @param  Closure $callback
36
     * @return \Illuminate\Database\Schema\Blueprint
37
     */
38 View Code Duplication
    public function create($table, Closure $callback)
39
    {
40
        $blueprint = $this->createBlueprint($table);
41
42
        $blueprint->create();
43
44
        $callback($blueprint);
45
46
        $this->build($blueprint);
47
48
        $this->comment->setComments($blueprint);
49
50
        $this->helper->createAutoIncrementObjects($blueprint, $table);
51
    }
52
53
    /**
54
     * Create a new command set with a Closure.
55
     *
56
     * @param  string $table
57
     * @param  Closure $callback
58
     * @return \Illuminate\Database\Schema\Blueprint
59
     */
60
    protected function createBlueprint($table, Closure $callback = null)
61
    {
62
        $blueprint = new OracleBlueprint($table, $callback);
63
        $blueprint->setTablePrefix($this->connection->getTablePrefix());
64
65
        return $blueprint;
66
    }
67
68
    /**
69
     * Changes an existing table on the schema.
70
     *
71
     * @param  string $table
72
     * @param  Closure $callback
73
     * @return \Illuminate\Database\Schema\Blueprint
74
     */
75 View Code Duplication
    public function table($table, Closure $callback)
76
    {
77
        $blueprint = $this->createBlueprint($table);
78
79
        $callback($blueprint);
80
81
        foreach ($blueprint->getCommands() as $command) {
82
            if ($command->get('name') == 'drop') {
83
                $this->helper->dropAutoIncrementObjects($table);
84
            }
85
        }
86
87
        $this->build($blueprint);
88
89
        $this->comment->setComments($blueprint);
90
    }
91
92
    /**
93
     * Drop a table from the schema.
94
     *
95
     * @param  string $table
96
     * @return \Illuminate\Database\Schema\Blueprint
97
     */
98
    public function drop($table)
99
    {
100
        $this->helper->dropAutoIncrementObjects($table);
101
        parent::drop($table);
102
    }
103
104
    /**
105
     * Drop all tables from the database.
106
     *
107
     * @return void
108
     */
109
    public function dropAllTables()
110
    {
111
        $this->connection->statement($this->grammar->compileDropAllTables());
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class Illuminate\Database\Schema\Grammars\Grammar as the method compileDropAllTables() does only exist in the following sub-classes of Illuminate\Database\Schema\Grammars\Grammar: Illuminate\Database\Schema\Grammars\MySqlGrammar, Illuminate\Database\Sche...rammars\PostgresGrammar, Illuminate\Database\Schema\Grammars\SQLiteGrammar, Illuminate\Database\Sche...ammars\SqlServerGrammar, Yajra\Oci8\Schema\Grammars\OracleGrammar. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
112
    }
113
114
    /**
115
     * Indicate that the table should be dropped if it exists.
116
     *
117
     * @param string $table
118
     * @return \Illuminate\Support\Fluent
119
     */
120
    public function dropIfExists($table)
121
    {
122
        $this->helper->dropAutoIncrementObjects($table);
123
        parent::dropIfExists($table);
124
    }
125
126
    /**
127
     * Determine if the given table exists.
128
     *
129
     * @param  string $table
130
     * @return bool
131
     */
132
    public function hasTable($table)
133
    {
134
        /** @var \Yajra\Oci8\Schema\Grammars\OracleGrammar $grammar */
135
        $grammar = $this->grammar;
136
        $sql     = $grammar->compileTableExists();
137
138
        $database = $this->connection->getConfig('username');
139
        if ($this->connection->getConfig('prefix_schema')) {
140
            $database = $this->connection->getConfig('prefix_schema');
141
        }
142
        $table = $this->connection->getTablePrefix() . $table;
143
144
        return count($this->connection->select($sql, [$database, $table])) > 0;
145
    }
146
147
    /**
148
     * Get the column listing for a given table.
149
     *
150
     * @param  string $table
151
     * @return array
152
     */
153
    public function getColumnListing($table)
154
    {
155
        $database = $this->connection->getConfig('username');
156
        $table    = $this->connection->getTablePrefix() . $table;
157
        /** @var \Yajra\Oci8\Schema\Grammars\OracleGrammar $grammar */
158
        $grammar = $this->grammar;
159
        $results = $this->connection->select($grammar->compileColumnExists($database, $table));
160
161
        return $this->connection->getPostProcessor()->processColumnListing($results);
162
    }
163
}
164