Passed
Push — main ( e82f34...7054df )
by Sílvio
05:01 queued 02:07
created

MigrationManager::getMigrationQueries()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 55
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 12
c 0
b 0
f 0
nc 6
nop 1
dl 0
loc 55
rs 9.8666

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Silviooosilva\CacheerPhp\Core;
4
5
use PDO;
6
use PDOException;
7
8
/**
9
 * Class MigrationManager
10
 * @author Sílvio Silva <https://github.com/silviooosilva>
11
 * @package Silviooosilva\CacheerPhp
12
 */
13
class MigrationManager
14
{
15
    /**
16
     * @param PDO $connection
17
     * @return void
18
     */
19
    public static function migrate(PDO $connection)
20
    {
21
        try {
22
            self::prepareDatabase($connection);
23
            $queries = self::getMigrationQueries($connection);
24
            foreach ($queries as $query) {
25
                if (trim($query)) {
26
                    $connection->exec($query);
27
                }
28
            }
29
        } catch (PDOException $exception) {
30
            throw new PDOException($exception->getMessage(), $exception->getCode());
31
        }
32
    }
33
34
    /**
35
     * @param PDO $connection
36
     * @return void
37
     */
38
    private static function prepareDatabase(PDO $connection): void
39
    {
40
        $driver = $connection->getAttribute(PDO::ATTR_DRIVER_NAME);
41
        if ($driver !== 'sqlite') {
42
            $dbname = CACHEER_DATABASE_CONFIG[Connect::getConnection()]['dbname'];
43
            $connection->exec("USE $dbname");
44
        }
45
    }
46
47
    /**
48
     * @param PDO $connection
49
     * @return array
50
     */
51
    private static function getMigrationQueries(PDO $connection): array
52
    {
53
        $driver = $connection->getAttribute(PDO::ATTR_DRIVER_NAME);
54
        $createdAtDefault = ($driver === 'pgsql') ? 'DEFAULT NOW()' : 'DEFAULT CURRENT_TIMESTAMP';
55
56
        if ($driver === 'sqlite') {
57
            $query = "
58
                CREATE TABLE IF NOT EXISTS cacheer_table (
59
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
60
                    cacheKey VARCHAR(255) NOT NULL,
61
                    cacheData TEXT NOT NULL,
62
                    cacheNamespace VARCHAR(255),
63
                    expirationTime DATETIME NOT NULL,
64
                    created_at DATETIME $createdAtDefault,
65
                    UNIQUE(cacheKey, cacheNamespace)
66
                );
67
                CREATE INDEX IF NOT EXISTS idx_cacheer_cacheKey ON cacheer_table (cacheKey);
68
                CREATE INDEX IF NOT EXISTS idx_cacheer_cacheNamespace ON cacheer_table (cacheNamespace);
69
                CREATE INDEX IF NOT EXISTS idx_cacheer_expirationTime ON cacheer_table (expirationTime);
70
                CREATE INDEX IF NOT EXISTS idx_cacheer_key_namespace ON cacheer_table (cacheKey, cacheNamespace);
71
            ";
72
        } elseif ($driver === 'pgsql') {
73
            $query = "
74
                CREATE TABLE IF NOT EXISTS cacheer_table (
75
                    id SERIAL PRIMARY KEY,
76
                    cacheKey VARCHAR(255) NOT NULL,
77
                    cacheData TEXT NOT NULL,
78
                    cacheNamespace VARCHAR(255),
79
                    expirationTime TIMESTAMP NOT NULL,
80
                    created_at TIMESTAMP $createdAtDefault,
81
                    UNIQUE(cacheKey, cacheNamespace)
82
                );
83
                CREATE INDEX IF NOT EXISTS idx_cacheer_cacheKey ON cacheer_table (cacheKey);
84
                CREATE INDEX IF NOT EXISTS idx_cacheer_cacheNamespace ON cacheer_table (cacheNamespace);
85
                CREATE INDEX IF NOT EXISTS idx_cacheer_expirationTime ON cacheer_table (expirationTime);
86
                CREATE INDEX IF NOT EXISTS idx_cacheer_key_namespace ON cacheer_table (cacheKey, cacheNamespace);
87
            ";
88
        } else {
89
            $query = "
90
                CREATE TABLE IF NOT EXISTS cacheer_table (
91
                    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
92
                    cacheKey VARCHAR(255) NOT NULL,
93
                    cacheData LONGTEXT NOT NULL,
94
                    cacheNamespace VARCHAR(255) NULL,
95
                    expirationTime DATETIME NOT NULL,
96
                    created_at TIMESTAMP $createdAtDefault,
97
                    UNIQUE KEY unique_cache_key_namespace (cacheKey, cacheNamespace),
98
                    KEY idx_cacheer_cacheKey (cacheKey),
99
                    KEY idx_cacheer_cacheNamespace (cacheNamespace),
100
                    KEY idx_cacheer_expirationTime (expirationTime),
101
                    KEY idx_cacheer_key_namespace (cacheKey, cacheNamespace)
102
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
103
            ";
104
        }
105
        return array_filter(array_map('trim', explode(';', $query)));
106
    }
107
}
108