Updater   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Test Coverage

Coverage 92.68%

Importance

Changes 0
Metric Value
wmc 11
eloc 37
dl 0
loc 128
ccs 38
cts 41
cp 0.9268
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A setAdapter() 0 7 2
A __construct() 0 4 1
A dbFilename() 0 3 1
A clean() 0 10 2
A __destruct() 0 3 1
A updateRequired() 0 6 1
A getFileManager() 0 3 1
A update() 0 19 2
1
<?php
2
3
namespace PierInfor\GeoLite;
4
5
/**
6
 * Updater class update free maxmind dbs in mmdb format
7
 */
8
class Updater implements Interfaces\UpdaterInterface
9
{
10
11
    const ABS_DB_PATH = __DIR__ . self::DB_PATH;
12
13
    /**
14
     * Current adapter
15
     *
16
     * @var String
17
     */
18
    private $adapter;
19
20
    /**
21
     * File manager
22
     *
23
     * @var FileManager
24
     */
25
    private $fileManager;
26
27
    /**
28
     * Instanciate with given locales
29
     *
30
     * @param array $locales
31
     */
32 19
    public function __construct()
33
    {
34 19
        $this->fileManager = new FileManager();
35 19
        $this->adapter = self::ADAPTER_COUNTRY;
36
    }
37
38
    /**
39
     * on unset instance
40
     */
41 19
    public function __destruct()
42
    {
43 19
        $this->fileManager  = null;
44
    }
45
46
    /**
47
     * returns FileManager instance
48
     *
49
     * @return FileManager
50
     */
51 1
    public function getFileManager(): FileManager
52
    {
53 1
        return $this->fileManager;
54
    }
55
56
    /**
57
     * set adapter
58
     *
59
     * @param string $adapter
60
     * @return Updater
61
     * @throws \Exception
62
     */
63 4
    public function setAdapter(string $adapter = self::ADAPTER_COUNTRY): Updater
64
    {
65 4
        if (!in_array($adapter, self::ADAPTERS)) {
66 1
            throw new \Exception('Error: Unkown adapter ' . $adapter);
67
        }
68 3
        $this->adapter = $adapter;
69 3
        return $this;
70
    }
71
72
    /**
73
     * update
74
     *
75
     * @return Updater
76
     */
77 1
    public function update(): Updater
78
    {
79 1
        $this->clean();
80 1
        $url = self::UPDATERS[$this->adapter];
81 1
        $localTarget = self::ABS_DB_PATH . basename($url);
82 1
        $this->fileManager->download($url, $localTarget);
83 1
        $this->fileManager->ungz($localTarget);
84 1
        list($archive, $tar) = explode('.', basename($url));
85 1
        $archive = sprintf('%s%s.%s', self::ABS_DB_PATH, $archive, $tar);
86 1
        $this->fileManager->untar($archive, self::ABS_DB_PATH);
87 1
        $folderList = $this->fileManager->folderList(self::ABS_DB_PATH);
88 1
        if (count($folderList) == 1) {
89
            $this->fileManager->copyFile(
90
                sprintf('%s/%s', $folderList[0], $this->dbFilename()),
91
                self::ABS_DB_PATH . $this->dbFilename()
92
            );
93
        }
94 1
        $this->clean();
95 1
        return $this;
96
    }
97
98
    /**
99
     * return true if current db file date is different from today
100
     *
101
     * @return boolean
102
     */
103 1
    public function updateRequired(): bool
104
    {
105 1
        $updatedToday = $this->fileManager->isFileDateToday(
106 1
            self::ABS_DB_PATH . $this->dbFilename()
107
        );
108 1
        return (false === $updatedToday);
109
    }
110
111
    /**
112
     * return db filename for a given adapter
113
     *
114
     * @return string
115
     */
116 1
    public function dbFilename(): string
117
    {
118 1
        return self::UPDATERS_DB_FILENAME[$this->adapter];
119
    }
120
121
    /**
122
     * clean unnattended files and folders in db path
123
     *
124
     * @return Updater
125
     */
126 2
    public function clean(): Updater
127
    {
128 2
        $this->fileManager->unlinkFolders(self::ABS_DB_PATH);
129 2
        $extCount = count(self::CLEAN_DB_EXTS);
130 2
        for ($c = 0; $c < $extCount; $c++) {
131 2
            $this->fileManager->unlinkFiles(
132 2
                self::ABS_DB_PATH . self::CLEAN_DB_EXTS[$c]
133
            );
134
        }
135 2
        return $this;
136
    }
137
}
138