rdkit 0.0.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/Gemfile +10 -1
- data/Gemfile.ci +13 -0
- data/Guardfile +40 -0
- data/README.md +282 -6
- data/Vagrantfile +13 -0
- data/example/blocking.rb +10 -0
- data/example/blocking/command_runner.rb +28 -0
- data/example/blocking/core.rb +24 -0
- data/example/blocking/server.rb +10 -0
- data/example/blocking/version.rb +3 -0
- data/example/callbacks.rb +9 -0
- data/example/callbacks/command_runner.rb +21 -0
- data/example/callbacks/core.rb +18 -0
- data/example/callbacks/server.rb +30 -0
- data/example/counter.rb +0 -2
- data/example/counter/command_runner.rb +4 -0
- data/example/counter/core.rb +4 -0
- data/example/http.rb +9 -0
- data/example/http/core.rb +18 -0
- data/example/http/responder.rb +7 -0
- data/example/http/server.rb +19 -0
- data/lib/rdkit.rb +20 -3
- data/lib/rdkit/callbacks.rb +10 -0
- data/lib/rdkit/client.rb +157 -0
- data/lib/rdkit/configuration.rb +31 -0
- data/lib/rdkit/core.rb +2 -4
- data/lib/rdkit/core_ext.rb +7 -0
- data/lib/rdkit/db.rb +257 -0
- data/lib/rdkit/db_commands.rb +182 -0
- data/lib/rdkit/errors.rb +32 -1
- data/lib/rdkit/http_parser.rb +56 -0
- data/lib/rdkit/http_responder.rb +74 -0
- data/lib/rdkit/introspection.rb +133 -21
- data/lib/rdkit/logger.rb +9 -4
- data/lib/rdkit/memory_monitoring.rb +29 -0
- data/lib/rdkit/notification_center.rb +21 -0
- data/lib/rdkit/rd_object.rb +69 -0
- data/lib/rdkit/resp.rb +9 -1
- data/lib/rdkit/{command_parser.rb → resp_parser.rb} +6 -18
- data/lib/rdkit/resp_responder.rb +105 -0
- data/lib/rdkit/server.rb +242 -86
- data/lib/rdkit/simple_commands.rb +17 -0
- data/lib/rdkit/slow_log.rb +52 -0
- data/lib/rdkit/subcommands.rb +157 -0
- data/lib/rdkit/version.rb +1 -1
- data/rdkit.gemspec +6 -0
- metadata +119 -5
- data/lib/rdkit/inheritable.rb +0 -15
- data/lib/rdkit/resp_runner.rb +0 -46
@@ -0,0 +1,31 @@
|
|
1
|
+
module RDKit
|
2
|
+
class Configuration
|
3
|
+
attr_reader :config
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@config = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
@@instance = Configuration.new
|
11
|
+
|
12
|
+
def reset
|
13
|
+
@@instance = Configuration.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(key)
|
17
|
+
@@instance.config[key]
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_i(key)
|
21
|
+
@@instance.config[key] ? @@instance.config[key].to_i : -1
|
22
|
+
end
|
23
|
+
|
24
|
+
def set(key, value)
|
25
|
+
@@instance.config[key] = value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self; include ClassMethods; end
|
30
|
+
end
|
31
|
+
end
|
data/lib/rdkit/core.rb
CHANGED
data/lib/rdkit/db.rb
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
module RDKit
|
2
|
+
class DB
|
3
|
+
attr_reader :index
|
4
|
+
|
5
|
+
def initialize(index=0)
|
6
|
+
@index = index
|
7
|
+
|
8
|
+
flush!
|
9
|
+
end
|
10
|
+
|
11
|
+
def flush!
|
12
|
+
@objects = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
module StringMethods
|
16
|
+
def get(key)
|
17
|
+
if object = get_typed_object(key, :string)
|
18
|
+
object.value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def set(key, value)
|
23
|
+
objects[key] = RDObject.string(value)
|
24
|
+
end
|
25
|
+
|
26
|
+
def getset(key, new_value)
|
27
|
+
objects[key].try(:value).tap { set(key, new_value) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def setnx(key, value)
|
31
|
+
if objects[key]
|
32
|
+
false
|
33
|
+
else
|
34
|
+
set(key, value)
|
35
|
+
true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
include StringMethods
|
40
|
+
|
41
|
+
module KeyMethods
|
42
|
+
def del(keys)
|
43
|
+
keys.select { |key| objects.delete(key) }.count
|
44
|
+
end
|
45
|
+
|
46
|
+
def filter_keys(pattern)
|
47
|
+
objects.keys
|
48
|
+
end
|
49
|
+
|
50
|
+
def exists?(key)
|
51
|
+
objects.include?(key)
|
52
|
+
end
|
53
|
+
|
54
|
+
def type(key)
|
55
|
+
objects[key].type.to_s rescue 'none'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
include KeyMethods
|
59
|
+
|
60
|
+
module ListMethods
|
61
|
+
def lpush(key, elements)
|
62
|
+
if list = get_typed_object(key, :list)
|
63
|
+
list.unshift(*elements)
|
64
|
+
|
65
|
+
list.length
|
66
|
+
else
|
67
|
+
# key not exist
|
68
|
+
objects[key] = RDObject.list(elements)
|
69
|
+
|
70
|
+
objects[key].length
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def llen(key)
|
75
|
+
if list = get_typed_object(key, :list)
|
76
|
+
|
77
|
+
list.length
|
78
|
+
else
|
79
|
+
0
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def lrange(key, start, stop)
|
84
|
+
if list = get_typed_object(key, :list)
|
85
|
+
|
86
|
+
list[start..stop]
|
87
|
+
else
|
88
|
+
[]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def lpop(key)
|
93
|
+
if list = get_typed_object(key, :list)
|
94
|
+
|
95
|
+
result = list.shift
|
96
|
+
|
97
|
+
del([key]) if list.empty?
|
98
|
+
|
99
|
+
result
|
100
|
+
else
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def rpop(key)
|
106
|
+
if list = get_typed_object(key, :list)
|
107
|
+
|
108
|
+
result = list.pop
|
109
|
+
|
110
|
+
del([key]) if list.empty?
|
111
|
+
|
112
|
+
result
|
113
|
+
else
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
include ListMethods
|
119
|
+
|
120
|
+
module SetMethods
|
121
|
+
def sadd(key, elements)
|
122
|
+
if set = get_typed_object(key, :set)
|
123
|
+
size0 = set.size
|
124
|
+
|
125
|
+
elements.each { |e| set.add(e) }
|
126
|
+
|
127
|
+
set.size - size0
|
128
|
+
else
|
129
|
+
objects[key] = RDObject.set(elements)
|
130
|
+
|
131
|
+
objects[key].size
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def scard(key)
|
136
|
+
if set = get_typed_object(key, :set)
|
137
|
+
|
138
|
+
set.size
|
139
|
+
else
|
140
|
+
0
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def smembers(key)
|
145
|
+
if set = get_typed_object(key, :set)
|
146
|
+
|
147
|
+
set.to_a
|
148
|
+
else
|
149
|
+
[]
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def sismember(key, value)
|
154
|
+
if set = get_typed_object(key, :set)
|
155
|
+
|
156
|
+
set.include?(value) ? 1 : 0
|
157
|
+
else
|
158
|
+
0
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def srem(key, elements)
|
163
|
+
if set = get_typed_object(key, :set)
|
164
|
+
size0 = set.size
|
165
|
+
|
166
|
+
elements.each { |e| set.delete(e) }
|
167
|
+
|
168
|
+
size0 - set.size
|
169
|
+
else
|
170
|
+
0
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
include SetMethods
|
175
|
+
|
176
|
+
module HashMethods
|
177
|
+
def hset(key, field, value)
|
178
|
+
if hash = get_typed_object(key, :hash)
|
179
|
+
existed = hash.has_key?(field) ? 0 : 1
|
180
|
+
|
181
|
+
hash[field] = value
|
182
|
+
|
183
|
+
existed
|
184
|
+
else
|
185
|
+
objects[key] = RDObject.create_hash(field, value)
|
186
|
+
|
187
|
+
1
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def hget(key, field)
|
192
|
+
if hash = get_typed_object(key, :hash)
|
193
|
+
hash[field]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def hexists?(key, field)
|
198
|
+
if hash = get_typed_object(key, :hash)
|
199
|
+
hash.has_key?(field)
|
200
|
+
else
|
201
|
+
false
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def hlen(key)
|
206
|
+
if hash = get_typed_object(key, :hash)
|
207
|
+
hash.size
|
208
|
+
else
|
209
|
+
0
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def hdel(key, fields)
|
214
|
+
if hash = get_typed_object(key, :hash)
|
215
|
+
size0 = hash.size
|
216
|
+
|
217
|
+
fields.each { |f| hash.delete(f) }
|
218
|
+
|
219
|
+
size0 - hash.size
|
220
|
+
else
|
221
|
+
0
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def hkeys(key)
|
226
|
+
if hash = get_typed_object(key, :hash)
|
227
|
+
hash.keys
|
228
|
+
else
|
229
|
+
[]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def hvals(key)
|
234
|
+
if hash = get_typed_object(key, :hash)
|
235
|
+
hash.values
|
236
|
+
else
|
237
|
+
[]
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
include HashMethods
|
242
|
+
|
243
|
+
private
|
244
|
+
|
245
|
+
def objects
|
246
|
+
@objects
|
247
|
+
end
|
248
|
+
|
249
|
+
def get_typed_object(key, type)
|
250
|
+
if object = objects[key]
|
251
|
+
raise WrongTypeError unless object.type == type
|
252
|
+
|
253
|
+
object
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module RDKit
|
2
|
+
module DBCommands
|
3
|
+
def select(index)
|
4
|
+
raise InvalidDBIndexError unless (0..15).map(&:to_s).include?(index)
|
5
|
+
|
6
|
+
index = index.to_i
|
7
|
+
|
8
|
+
server.select_db!(index)
|
9
|
+
|
10
|
+
'OK'
|
11
|
+
end
|
12
|
+
|
13
|
+
module StringCommands
|
14
|
+
def get(key)
|
15
|
+
db.get(key)
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(key, value)
|
19
|
+
db.set(key, value)
|
20
|
+
|
21
|
+
'OK'
|
22
|
+
end
|
23
|
+
|
24
|
+
def setnx(key, value)
|
25
|
+
db.setnx(key, value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def getset(key, new_value)
|
29
|
+
db.getset(key, new_value)
|
30
|
+
end
|
31
|
+
|
32
|
+
def mget(key, *more_keys)
|
33
|
+
([key] + more_keys).map { |k| db.get(k) rescue nil }
|
34
|
+
end
|
35
|
+
|
36
|
+
def mset(key, value, *more_pairs)
|
37
|
+
unless more_pairs.size % 2 == 0
|
38
|
+
raise WrongNumberOfArgumentError, "wrong number of arguments for 'mset' command"
|
39
|
+
end
|
40
|
+
|
41
|
+
db.set(key, value)
|
42
|
+
more_pairs.each_slice(2) { |key, value| db.set(key, value) }
|
43
|
+
|
44
|
+
'OK'
|
45
|
+
end
|
46
|
+
|
47
|
+
def strlen(key)
|
48
|
+
if str = db.get(key)
|
49
|
+
str.bytesize
|
50
|
+
else
|
51
|
+
0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
include StringCommands
|
56
|
+
|
57
|
+
module ListCommands
|
58
|
+
def lpush(key, value, *more_values)
|
59
|
+
db.lpush(key, [value] + more_values)
|
60
|
+
end
|
61
|
+
|
62
|
+
def llen(key)
|
63
|
+
db.llen(key)
|
64
|
+
end
|
65
|
+
|
66
|
+
def lrange(key, start, stop)
|
67
|
+
db.lrange(key, start, stop)
|
68
|
+
end
|
69
|
+
|
70
|
+
def lpop(key)
|
71
|
+
db.lpop(key)
|
72
|
+
end
|
73
|
+
|
74
|
+
def rpop(key)
|
75
|
+
db.rpop(key)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
include ListCommands
|
79
|
+
|
80
|
+
module SetCommands
|
81
|
+
def sadd(key, value, *more_values)
|
82
|
+
db.sadd(key, [value] + more_values)
|
83
|
+
end
|
84
|
+
|
85
|
+
def scard(key)
|
86
|
+
db.scard(key)
|
87
|
+
end
|
88
|
+
|
89
|
+
def smembers(key)
|
90
|
+
db.smembers(key)
|
91
|
+
end
|
92
|
+
|
93
|
+
def sismember(key, value)
|
94
|
+
db.sismember(key, value)
|
95
|
+
end
|
96
|
+
|
97
|
+
def srem(key, value, *more_values)
|
98
|
+
db.srem(key, [value] + more_values).tap { db.del([key]) if db.scard(key) == 0 }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
include SetCommands
|
102
|
+
|
103
|
+
module HashCommands
|
104
|
+
def hset(key, field, value)
|
105
|
+
db.hset(key, field, value)
|
106
|
+
end
|
107
|
+
|
108
|
+
def hget(key, field)
|
109
|
+
db.hget(key, field)
|
110
|
+
end
|
111
|
+
|
112
|
+
def hexists(key, field)
|
113
|
+
db.hexists?(key, field)
|
114
|
+
end
|
115
|
+
|
116
|
+
def hlen(key)
|
117
|
+
db.hlen(key)
|
118
|
+
end
|
119
|
+
|
120
|
+
def hstrlen(key, field)
|
121
|
+
if str = db.hget(key, field)
|
122
|
+
str.bytesize
|
123
|
+
else
|
124
|
+
0
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def hdel(key, field, *more_fields)
|
129
|
+
db.hdel(key, [field] + more_fields).tap { db.del([key]) if db.hlen(key) == 0 }
|
130
|
+
end
|
131
|
+
|
132
|
+
def hkeys(key)
|
133
|
+
db.hkeys(key)
|
134
|
+
end
|
135
|
+
|
136
|
+
def hvals(key)
|
137
|
+
db.hvals(key)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
include HashCommands
|
141
|
+
|
142
|
+
module KeyCommands
|
143
|
+
def del(key, *more_keys)
|
144
|
+
db.del(more_keys.unshift(key))
|
145
|
+
end
|
146
|
+
|
147
|
+
def keys(pattern)
|
148
|
+
db.filter_keys(pattern)
|
149
|
+
end
|
150
|
+
|
151
|
+
def exists(key)
|
152
|
+
db.exists?(key)
|
153
|
+
end
|
154
|
+
|
155
|
+
def type(key)
|
156
|
+
db.type(key)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
include KeyCommands
|
160
|
+
|
161
|
+
module ServerCommands
|
162
|
+
def flushdb
|
163
|
+
server.flushdb!
|
164
|
+
|
165
|
+
'OK'
|
166
|
+
end
|
167
|
+
|
168
|
+
def flushall
|
169
|
+
server.flushall!
|
170
|
+
|
171
|
+
'OK'
|
172
|
+
end
|
173
|
+
end
|
174
|
+
include ServerCommands
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def db
|
179
|
+
server.current_db
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|