Tue, 11 Sep 2018 23:27:56 +0100
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
138
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | local function _remove(list, m) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | if m.prev then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | m.prev.next = m.next; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 | if m.next then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | m.next.prev = m.prev; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | if list._tail == m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | list._tail = m.prev; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | if list._head == m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | list._head = m.next; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | list._count = list._count - 1; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | local function _insert(list, m) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | if list._head then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | list._head.prev = m; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | m.prev, m.next = nil, list._head; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | list._head = m; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | if not list._tail then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | list._tail = m; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | list._count = list._count + 1; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | local cache_methods = {}; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | local cache_mt = { __index = cache_methods }; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | function cache_methods:set(k, v) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | local m = self._data[k]; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | if m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | -- Key already exists |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | if v ~= nil then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | -- Bump to head of list |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | _remove(self, m); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | _insert(self, m); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | m.value = v; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | else |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | -- Remove from list |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | _remove(self, m); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | self._data[k] = nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | return true; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | -- New key |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | if v == nil then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | return true; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 | -- Check whether we need to remove oldest k/v |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 | if self._count == self.size then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | local tail = self._tail; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 | local on_evict, evicted_key, evicted_value = self._on_evict, tail.key, tail.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 | if on_evict ~= nil and (on_evict == false or on_evict(evicted_key, evicted_value) == false) then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 | -- Cache is full, and we're not allowed to evict |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | return false; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 | _remove(self, tail); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | self._data[evicted_key] = nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 | m = { key = k, value = v, prev = nil, next = nil }; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 | self._data[k] = m; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 | _insert(self, m); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 | return true; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | function cache_methods:get(k) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 | local m = self._data[k]; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | if m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 | return m.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 | return nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 | function cache_methods:items() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | local m = self._head; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | return function () |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 | if not m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | return; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | local k, v = m.key, m.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 | m = m.next; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | return k, v; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 | function cache_methods:values() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 | local m = self._head; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 | return function () |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 | if not m then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 | return; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 | local v = m.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 | m = m.next; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 | return v; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 | function cache_methods:count() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 | return self._count; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 | function cache_methods:head() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 | local head = self._head; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 | if not head then return nil, nil; end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 | return head.key, head.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 | function cache_methods:tail() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 | local tail = self._tail; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 | if not tail then return nil, nil; end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 | return tail.key, tail.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 | function cache_methods:resize(new_size) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | new_size = assert(tonumber(new_size), "cache size must be a number"); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 | new_size = math.floor(new_size); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 | assert(new_size > 0, "cache size must be greater than zero"); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 | local on_evict = self._on_evict; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | while self._count > new_size do |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 | local tail = self._tail; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | local evicted_key, evicted_value = tail.key, tail.value; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | if on_evict ~= nil and (on_evict == false or on_evict(evicted_key, evicted_value) == false) then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | -- Cache is full, and we're not allowed to evict |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | return false; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 | _remove(self, tail); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 | self._data[evicted_key] = nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 | self.size = new_size; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | return true; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 | function cache_methods:table() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 | --luacheck: ignore 212/t |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 | if not self.proxy_table then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 | self.proxy_table = setmetatable({}, { |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 | __index = function (t, k) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 | return self:get(k); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 | end; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 | __newindex = function (t, k, v) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 | if not self:set(k, v) then |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 | error("failed to insert key into cache - full"); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 | end; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 | __pairs = function (t) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 | return self:items(); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 | end; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 | __len = function (t) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 | return self:count(); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 | end; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 | }); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 | return self.proxy_table; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 | function cache_methods:clear() |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 | self._data = {}; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 | self._count = 0; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 | self._head = nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 | self._tail = nil; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 | local function new(size, on_evict) |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 | size = assert(tonumber(size), "cache size must be a number"); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 | size = math.floor(size); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 | assert(size > 0, "cache size must be greater than zero"); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 | local data = {}; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 | return setmetatable({ _data = data, _count = 0, size = size, _head = nil, _tail = nil, _on_evict = on_evict }, cache_mt); |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 | end |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 | |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 | return { |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 | new = new; |
561f0af6c9dc
serve/: Import dependencies required for serve mode from Prosody 329a670ae975
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 | } |