Completed
Push — master ( e90e68...49a516 )
by Marco
04:59 queued 02:33
created

FilesystemXattr::has()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 24
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 0
cts 0
cp 0
rs 8.5125
c 0
b 0
f 0
cc 5
eloc 13
nc 4
nop 2
crap 30
1
<?php namespace Comodojo\Cache\Drivers;
2
3
use \Exception;
4
5
/**
6
 * Apcu provider
7
 *
8
 * @package     Comodojo Spare Parts
9
 * @author      Marco Giovinazzi <[email protected]>
10
 * @license     MIT
11
 *
12
 * LICENSE:
13
 *
14
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
 * THE SOFTWARE.
21
 */
22
23
class FilesystemXattr extends AbstractDriver {
24
25
    const DRIVER_NAME = "filesystem-xattr";
26
27
    protected $cache_folder;
28
29 47
    public function __construct(array $configuration) {
30
31 47
        $this->cache_folder = $configuration['cache-folder'];
32
33 47
        if ( $this->test() === false ) throw new Exception("Folder ".$this->cache_folder." not writable");
34
35 47
    }
36
37 47
    public function test() {
38
39 47
        return file_exists($this->cache_folder) && is_writable($this->cache_folder);
40
41
    }
42
43 36
    public function get($key, $namespace) {
44
45 36
        if ( $this->has($key, $namespace) ) {
46
47 20
            $cacheFile = $this->cache_folder."$key-$namespace.cache";
48
49 20
            $data = @file_get_contents($cacheFile);
50
51 20
            if ( $data === false ) throw new Exception("Error reading cache content $cacheFile");
52
53 20
            return $data;
54
55
        }
56
57 23
        return null;
58
59
    }
60
61
    public function set($key, $namespace, $value, $ttl = null) {
62
63
        $cacheFile = $this->cache_folder."$key-$namespace.cache";
64
65 View Code Duplication
        if ( $ttl == null || $ttl == 0 ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
66
            $ttl = 0;
67
        } else {
68
            $ttl = time() + intval($ttl);
69
        }
70
71
        $cached = @file_put_contents($cacheFile, $value, LOCK_EX);
72
73
        if ( $cached === false ) throw new Exception("Error writing cache object $cacheFile");
74
75
        $tagged = @xattr_set($cacheFile, "EXPIRE", $ttl, XATTR_DONTFOLLOW);
76
77
        if ( $tagged === false ) throw new Exception("Error writing cache ttl $cacheFile");
78
79
        return true;
80
81
    }
82
83
    public function delete($key, $namespace) {
84
85
        $cacheFile = $this->cache_folder."$key-$namespace.cache";
86
87
        if ( file_exists($cacheFile) ) {
88
89
            $u = unlink($cacheFile);
90
91
            return $u;
92
93
        }
94
95
        return false;
96
97
    }
98
99 View Code Duplication
    public function clear($namespace = null) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
100
101
        $result = [];
102
103
        if ( $namespace === null ) {
104
105
            $file_list = glob($this->cache_folder."*.cache");
106
107
        } else {
108
109
            $file_list = glob($this->cache_folder."*-$namespace.cache");
110
111
        }
112
113
        if ( empty($file_list) ) return true;
114
115
        foreach ( $file_list as $file ) $result[] = unlink($file);
116
117
        return !in_array(false, $result);
118
119
    }
120
121 2 View Code Duplication
    public function getMultiple(array $keys, $namespace) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
122
123 2
        $result = [];
124
125 2
        foreach ( $keys as $key ) {
126 2
            $result[$key] = $this->get($key, $namespace);
127
        }
128
129 2
        return $result;
130
131
    }
132
133 1 View Code Duplication
    public function setMultiple(array $key_values, $namespace, $ttl = null) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
134
135 1
        $result = [];
136
137 1
        foreach ( $key_values as $key => $value ) {
138 1
            $result[] = $this->set($key, $namespace, $value, $ttl);
139
        }
140
141 1
        return !in_array(false, $result);
142
143
    }
144
145 3 View Code Duplication
    public function deleteMultiple(array $keys, $namespace) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
146
147 3
        $result = [];
148
149 3
        foreach ( $keys as $key ) {
150 3
            $result[] = $this->delete($key, $namespace);
151
        }
152
153 3
        return !in_array(false, $result);
154
155
    }
156
157
    public function has($key, $namespace) {
158
159
        $time = time();
160
161
        $cacheFile = $this->cache_folder."$key-$namespace.cache";
162
163
        if ( file_exists($cacheFile) ) {
164
165
            $expire = xattr_get($cacheFile, "EXPIRE", XATTR_DONTFOLLOW);
166
167
            if ( $expire === false ) {
168
                throw new Exception("Error reading cache ttl for $cacheFile");
169
            } else if ( $expire < $time && $expire != 0 ) {
170
                $this->delete($key, $namespace);
171
                return false;
172
            } else {
173
                return true;
174
            }
175
176
        }
177
178
        return false;
179
180
    }
181
182 2
    public function stats() {
183
184 2
        return ['objects' => count(glob($this->cache_folder."*.cache"))];
185
186
    }
187
188
}
189