-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathemonhub_buffer.py
115 lines (79 loc) · 2.77 KB
/
emonhub_buffer.py
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
"""
This code is released under the GNU Affero General Public License.
OpenEnergyMonitor project:
http://openenergymonitor.org
"""
import logging
"""class AbstractBuffer
Represents the actual buffer being used.
"""
class AbstractBuffer():
def storeItem(self, data):
raise NotImplementedError
def retrieveItems(self, number):
raise NotImplementedError
def retrieveItem(self):
raise NotImplementedError
def discardLastRetrievedItem(self):
raise NotImplementedError
def discardLastRetrievedItems(self, number):
raise NotImplementedError
def hasItems(self):
raise NotImplementedError
"""
This implementation of the AbstractBuffer just uses an in-memory data structure.
It's basically identical to the previous (inline) buffer.
"""
class InMemoryBuffer(AbstractBuffer):
def __init__(self, bufferName, buffer_size):
self._bufferName = str(bufferName)
self._buffer_type = "memory"
self._maximumEntriesInBuffer = int(buffer_size)
self._data_buffer = []
self._log = logging.getLogger("EmonHub")
def hasItems(self):
return self.size() > 0
def isFull(self):
return self.size() >= self._maximumEntriesInBuffer
def getMaxEntrySliceIndex(self):
return max(0,
self.size() - self._maximumEntriesInBuffer - 1)
def discardOldestItems(self):
self._data_buffer = self._data_buffer[self.getMaxEntrySliceIndex():]
def discardOldestItemsIfFull(self):
if self.isFull():
self._log.warning(
"In-memory buffer (%s) reached limit of %d items, deleting oldest"
% (self._bufferName, self._maximumEntriesInBuffer))
self.discardOldestItems()
def storeItem(self, data):
self.discardOldestItemsIfFull()
self._data_buffer.append(data)
def retrieveItem(self):
return self._data_buffer[0]
def retrieveItems(self, number):
blen = len(self._data_buffer)
if number > blen:
number = blen
return self._data_buffer[:number]
def discardLastRetrievedItem(self):
del self._data_buffer[0]
def discardLastRetrievedItems(self, number):
blen = len(self._data_buffer)
if number > blen:
number = blen
self._data_buffer = self._data_buffer[number:]
def size(self):
return len(self._data_buffer)
"""
The getBuffer function returns the buffer class corresponding to a
buffering method passed as argument.
"""
bufferMethodMap = {
'memory': InMemoryBuffer
}
def getBuffer(method):
"""Returns the buffer class corresponding to the method
method (string): buffering method
"""
return bufferMethodMap[method]