1 | var patternToRegex = require('./helpers').patternToRegex;
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | exports.del = function (mockInstance, keys, callback) {
|
7 |
|
8 | if (!(keys instanceof Array)) {
|
9 | keys = [keys];
|
10 | }
|
11 |
|
12 | var keysDeleted = 0;
|
13 |
|
14 | for (var i = 0; i < keys.length; i++) {
|
15 |
|
16 | if (keys[i] in mockInstance.storage) {
|
17 |
|
18 | delete mockInstance.storage[keys[i]];
|
19 | keysDeleted++;
|
20 |
|
21 | }
|
22 | }
|
23 |
|
24 | mockInstance._callCallback(callback, null, keysDeleted);
|
25 | }
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | exports.exists = function (mockInstance, keys, callback) {
|
31 | if (!(keys instanceof Array)) {
|
32 | keys = [keys];
|
33 | }
|
34 |
|
35 | var result = 0
|
36 | for (var i = 0; i < keys.length; i++) {
|
37 | if( keys[i] in mockInstance.storage) {
|
38 | result++
|
39 | }
|
40 | }
|
41 |
|
42 | mockInstance._callCallback(callback, null, result);
|
43 | }
|
44 |
|
45 | exports.type = function(mockInstance, key, callback) {
|
46 | var type = "none";
|
47 |
|
48 | if (key in mockInstance.storage) {
|
49 | type = mockInstance.storage[key].type;
|
50 | }
|
51 |
|
52 | mockInstance._callCallback(callback, null, type);
|
53 | };
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | var expire = function (mockInstance, key, seconds, callback) {
|
59 |
|
60 | var result = 0;
|
61 |
|
62 | var obj = mockInstance.storage[key];
|
63 |
|
64 | if (obj) {
|
65 | var now = new Date().getTime();
|
66 | var milli = Math.min(seconds*1000, Math.pow(2, 31) - 1);
|
67 |
|
68 | if (mockInstance.storage[key]._expire) {
|
69 | clearTimeout(mockInstance.storage[key]._expire);
|
70 | }
|
71 |
|
72 | mockInstance.storage[key].expires = new Date(now + milli);
|
73 | var _expire = setTimeout(function() {
|
74 | delete mockInstance.storage[key];
|
75 | }, milli);
|
76 | if (_expire.unref) {
|
77 | _expire.unref();
|
78 | }
|
79 | mockInstance.storage[key]._expire = _expire;
|
80 |
|
81 | result = 1;
|
82 | }
|
83 |
|
84 | mockInstance._callCallback(callback, null, result);
|
85 | }
|
86 |
|
87 | exports.expire = expire;
|
88 |
|
89 | exports.pexpire = function (mockInstance, key, ms, callback) {
|
90 | var computedSeconds = ms > 0 ? ms/1000 : ms;
|
91 | return expire(mockInstance, key, computedSeconds, function(err, seconds) {
|
92 | mockInstance._callCallback(callback, err, seconds);
|
93 | });
|
94 | };
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 | var ttl = function (mockInstance, key, callback) {
|
101 | var result = 0;
|
102 |
|
103 | var obj = mockInstance.storage[key];
|
104 |
|
105 | if (obj) {
|
106 | var now = new Date().getTime();
|
107 | var expires = mockInstance.storage[key].expires instanceof Date ? mockInstance.storage[key].expires.getTime() : -1;
|
108 | var seconds = (expires - now) / 1000;
|
109 |
|
110 | if (seconds > 0) {
|
111 | result = seconds;
|
112 | } else {
|
113 | result = -1;
|
114 | }
|
115 |
|
116 | } else {
|
117 | result = -2;
|
118 | }
|
119 |
|
120 | mockInstance._callCallback(callback, null, result);
|
121 | };
|
122 |
|
123 | exports.ttl = ttl;
|
124 |
|
125 | exports.pttl = function (mockInstance, key, callback) {
|
126 | return ttl(mockInstance, key, function(err, ttl) {
|
127 | var computedTtl = ttl > 0 ? ttl * 1000 : ttl;
|
128 | mockInstance._callCallback(callback, err, computedTtl);
|
129 | });
|
130 | };
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 | exports.persist = function (mockInstance, key, callback) {
|
138 | var result = 0;
|
139 |
|
140 | var obj = mockInstance.storage[key];
|
141 |
|
142 | if (obj && obj.expires && obj.expires >= 0) {
|
143 | clearTimeout(obj._expire);
|
144 | delete obj.expires
|
145 | result = 1;
|
146 | }
|
147 |
|
148 | mockInstance._callCallback(callback, null, result);
|
149 | };
|
150 |
|
151 |
|
152 |
|
153 |
|
154 | exports.keys = function (mockInstance, pattern, callback) {
|
155 | var regex = patternToRegex(pattern);
|
156 | var keys = [];
|
157 |
|
158 | for (var key in mockInstance.storage) {
|
159 | if (regex.test(key)) {
|
160 | keys.push(key);
|
161 | }
|
162 | }
|
163 |
|
164 | mockInstance._callCallback(callback, null, keys);
|
165 | }
|
166 |
|
167 | exports.scan = function (mockInstance, index, pattern, count, callback) {
|
168 | var regex = patternToRegex(pattern);
|
169 | var keys = [];
|
170 | var idx = 1;
|
171 | var resIdx = 0;
|
172 | count = count || 10;
|
173 |
|
174 | for (var key in mockInstance.storage) {
|
175 | if (idx >= index && regex.test(key)) {
|
176 | keys.push(key);
|
177 | count--;
|
178 | if(count === 0) {
|
179 | resIdx = idx+1;
|
180 | break;
|
181 | }
|
182 | }
|
183 | idx++;
|
184 | }
|
185 |
|
186 | mockInstance._callCallback(callback, null, [resIdx.toString(), keys]);
|
187 | }
|
188 |
|
189 |
|
190 |
|
191 |
|
192 |
|
193 | exports.rename = function (mockInstance, key, newKey, callback) {
|
194 | var err = null
|
195 |
|
196 | if (key in mockInstance.storage) {
|
197 | mockInstance.storage[newKey] = mockInstance.storage[key]
|
198 | delete mockInstance.storage[key];
|
199 | } else {
|
200 | err = new Error("ERR no such key")
|
201 | }
|
202 |
|
203 | mockInstance._callCallback(callback, err, "OK");
|
204 |
|
205 | }
|
206 |
|
207 |
|
208 |
|
209 |
|
210 |
|
211 | exports.renamenx = function (mockInstance, key, newKey, callback) {
|
212 | var err = null;
|
213 | var result;
|
214 |
|
215 | if (key in mockInstance.storage) {
|
216 | if (newKey in mockInstance.storage) {
|
217 | result = 0;
|
218 | } else {
|
219 | mockInstance.storage[newKey] = mockInstance.storage[key];
|
220 | delete mockInstance.storage[key];
|
221 | result = 1;
|
222 | }
|
223 | } else {
|
224 | err = new Error("ERR no such key");
|
225 | }
|
226 |
|
227 | mockInstance._callCallback(callback, err, result);
|
228 | }
|
229 |
|
230 |
|
231 |
|
232 |
|
233 |
|
234 | exports.dbsize = function(mockInstance, callback) {
|
235 | var size = Object.keys(mockInstance.storage).length || 0
|
236 | mockInstance._callCallback(callback, null, size)
|
237 | }
|