Completed
Push — master ( 139495...379c29 )
by Freek
01:28
created

UuidServiceProvider::optimizeUuids()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 0
1
<?php
2
3
namespace Spatie\BinaryUuid;
4
5
use Exception;
6
use Illuminate\Database\Connection;
7
use Illuminate\Support\ServiceProvider;
8
use Illuminate\Database\Schema\Grammars\Grammar;
9
use Illuminate\Database\Query\Grammars\MySqlGrammar as IlluminateMySqlGrammar;
10
use Illuminate\Database\Query\Grammars\SQLiteGrammar as IlluminateSQLiteGrammar;
11
use Ramsey\Uuid\Codec\OrderedTimeCodec;
12
use Ramsey\Uuid\Uuid;
13
use Ramsey\Uuid\UuidFactory;
14
15
class UuidServiceProvider extends ServiceProvider
16
{
17
    public function boot()
18
    {
19
        /** @var \Illuminate\Database\Connection $connection */
20
        $connection = app('db')->connection();
21
22
        $connection->setSchemaGrammar($this->createGrammarFromConnection($connection));
23
24
        $this->optimizeUuids();
25
    }
26
27
    protected function createGrammarFromConnection(Connection $connection): Grammar
28
    {
29
        $queryGrammar = $connection->getQueryGrammar();
30
31
        $queryGrammarClass = get_class($queryGrammar);
32
33
        if (! in_array($queryGrammarClass, [
34
            IlluminateMySqlGrammar::class,
35
            IlluminateSQLiteGrammar::class,
36
        ])) {
37
            throw new Exception("There current grammar `$queryGrammarClass` doesn't support binary uuids. Only  MySql and SQLite connections are supported.");
38
        }
39
40
        if ($queryGrammar instanceof IlluminateSQLiteGrammar) {
41
            return new SQLiteGrammar();
42
        }
43
44
        return new MySqlGrammar();
45
    }
46
47
    protected function optimizeUuids()
48
    {
49
        $factory = new UuidFactory();
50
51
        $codec = new OrderedTimeCodec($factory->getUuidBuilder());
52
53
        $factory->setCodec($codec);
54
55
        Uuid::setFactory($factory);
56
    }
57
}
58