aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/StudipDbCache.class.php
blob: 865825e25880fb1fa72fe9ef0584c609a52add4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
/**
 * StudipCache implementation using database table
 *
 * @package     studip
 * @subpackage  cache
 *
 * @author    Elmar Ludwig <elmar.ludwig@uos.de>
 */
class StudipDbCache implements StudipCache
{

    /**
     * @return string A translateable display name for this cache class.
     */
    public static function getDisplayName(): string
    {
        return _('Datenbank');
    }

    /**
     * Expire item from the cache.
     *
     * @param string $arg a single key
     */
    public function expire($arg)
    {
        $db = DBManager::get();

        $stmt = $db->prepare('DELETE FROM cache WHERE cache_key = ?');
        $stmt->execute([$arg]);
    }

    /**
     * Expire all items from the cache.
     */
    public function flush()
    {
        $db = DBManager::get();

        $db->exec('TRUNCATE TABLE cache');
    }

    /**
     * Delete all expired items from the cache.
     */
    public function purge()
    {
        $db = DBManager::get();

        $stmt = $db->prepare('DELETE FROM cache WHERE expires < ?');
        $stmt->execute([time()]);
    }

    /**
     * Retrieve item from the server.
     *
     * @param string $arg a single key
     *
     * @return mixed    the previously stored data if an item with such a key
     *                  exists on the server or FALSE on failure.
     */
    public function read($arg)
    {
        $db = DBManager::get();

        $stmt = $db->prepare('SELECT content FROM cache WHERE cache_key = ? AND expires > ?');
        $stmt->execute([$arg, time()]);
        $result = $stmt->fetchColumn();

        return $result !== false ? unserialize($result) : false;
    }

    /**
     * Store data at the server.
     *
     * @param string $name     the item's key.
     * @param mixed  $content  the item's content (will be serialized if necessary).
     * @param int    $expired  the item's expiry time in seconds. Optional, defaults to 12h.
     *
     * @return bool     returns TRUE on success or FALSE on failure.
     */
    public function write($name, $content, $expires = self::DEFAULT_EXPIRATION)
    {
        $db = DBManager::get();

        $stmt = $db->prepare('REPLACE INTO cache VALUES(?, ?, ?)');
        return $stmt->execute([$name, serialize($content), time() + $expires]);
    }

    /**
     * Return statistics.
     *
     * @see StudipCache::getStats()
     *
     * @return array|array[]
     */
    public function getStats(): array
    {
        return [
            __CLASS__ => [
                'name' => _('Anzahl Einträge'),
                'value' => DBManager::get()->fetchColumn("SELECT COUNT(*) FROM `cache`")
            ]
        ];
    }

    /**
     * Return the Vue component name and props that handle configuration.
     *
     * @see StudipCache::getConfig()
     *
     * @return array
     */
    public static function getConfig(): array
    {
        return [
            'component' => null,
            'props' => []
        ];
    }

}