Completed
Push — master ( 326b3e...061c53 )
by Freek
09:13
created

DbDumperFactory::processExtraDumpParameters()   A

Complexity

Conditions 4
Paths 1

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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