Completed
Push — master ( 25571a...608c0a )
by Freek
01:54
created

DbDumperFactory::createFromConnection()   B

Complexity

Conditions 6
Paths 32

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 32
nop 1
dl 0
loc 35
rs 8.7377
c 0
b 0
f 0
1
<?php
2
3
namespace Spatie\Backup\Tasks\Backup;
4
5
use Spatie\DbDumper\DbDumper;
6
use Spatie\DbDumper\Databases\MySql;
7
use Spatie\DbDumper\Databases\Sqlite;
8
use Spatie\DbDumper\Databases\MongoDb;
9
use Spatie\DbDumper\Databases\PostgreSql;
10
use Spatie\Backup\Exceptions\CannotCreateDbDumper;
11
12
class DbDumperFactory
13
{
14
    public static function createFromConnection(string $dbConnectionName): DbDumper
15
    {
16
        $dbConfig = config("database.connections.{$dbConnectionName}");
17
18
        if (isset($dbConfig['read'])) {
19
            $dbConfig = array_except(
20
                array_merge($dbConfig, $dbConfig['read']),
21
                ['read', 'write']
22
            );
23
        }
24
25
        $dbDumper = static::forDriver($dbConfig['driver'])
26
            ->setHost(array_first(array_wrap($dbConfig['host'] ?? '')))
27
            ->setDbName($dbConfig['database'])
28
            ->setUserName($dbConfig['username'] ?? '')
29
            ->setPassword($dbConfig['password'] ?? '');
30
31
        if ($dbDumper instanceof MySql) {
32
            $dbDumper->setDefaultCharacterSet($dbConfig['charset'] ?? '');
33
        }
34
35
	    if ($dbDumper instanceof MongoDb) {
36
		    $dbDumper->setAuthenticationDatabase(config('database.connections.mongodb.dump.mongodb_user_auth') ?? '');
37
	    }
38
39
        if (isset($dbConfig['port'])) {
40
            $dbDumper = $dbDumper->setPort($dbConfig['port']);
41
        }
42
43
        if (isset($dbConfig['dump'])) {
44
            $dbDumper = static::processExtraDumpParameters($dbConfig['dump'], $dbDumper);
45
        }
46
47
        return $dbDumper;
48
    }
49
50
    protected static function forDriver($dbDriver): DbDumper
51
    {
52
        $driver = strtolower($dbDriver);
53
54
        if ($driver === 'mysql' || $driver === 'mariadb') {
55
            return new MySql();
56
        }
57
58
        if ($driver === 'pgsql') {
59
            return new PostgreSql();
60
        }
61
62
        if ($driver === 'sqlite') {
63
            return new Sqlite();
64
        }
65
66
        if ($driver === 'mongodb') {
67
            return new MongoDb();
68
        }
69
70
        throw CannotCreateDbDumper::unsupportedDriver($driver);
71
    }
72
73
    protected static function processExtraDumpParameters(array $dumpConfiguration, DbDumper $dbDumper): DbDumper
74
    {
75
        collect($dumpConfiguration)->each(function ($configValue, $configName) use ($dbDumper) {
76
            $methodName = lcfirst(studly_case(is_numeric($configName) ? $configValue : $configName));
77
            $methodValue = is_numeric($configName) ? null : $configValue;
78
79
            $methodName = static::determineValidMethodName($dbDumper, $methodName);
80
81
            if (method_exists($dbDumper, $methodName)) {
82
                static::callMethodOnDumper($dbDumper, $methodName, $methodValue);
83
            }
84
        });
85
86
        return $dbDumper;
87
    }
88
89
    protected static function callMethodOnDumper(DbDumper $dbDumper, string $methodName, $methodValue): DbDumper
90
    {
91
        if (! $methodValue) {
92
            $dbDumper->$methodName();
93
94
            return $dbDumper;
95
        }
96
97
        $dbDumper->$methodName($methodValue);
98
99
        return $dbDumper;
100
    }
101
102
    protected static function determineValidMethodName(DbDumper $dbDumper, string $methodName): string
103
    {
104
        return collect([$methodName, 'set'.ucfirst($methodName)])
105
            ->first(function (string $methodName) use ($dbDumper) {
106
                return method_exists($dbDumper, $methodName);
107
            }, '');
108
    }
109
}
110