em-mongo 0.2.4 → 0.2.6
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.
- data/lib/em-mongo/collection.rb +5 -0
- data/lib/em-mongo/connection.rb +45 -39
- data/lib/em-mongo.rb +1 -2
- data/spec/collection_spec.rb +25 -0
- data/spec/connection_spec.rb +2 -10
- metadata +2 -2
data/lib/em-mongo/collection.rb
CHANGED
data/lib/em-mongo/connection.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module EM::Mongo
|
2
|
-
DEFAULT_IP
|
3
|
-
DEFAULT_PORT
|
4
|
-
DEFAULT_DB
|
5
|
-
DEFAULT_NS
|
2
|
+
DEFAULT_IP = "127.0.0.1"
|
3
|
+
DEFAULT_PORT = 27017
|
4
|
+
DEFAULT_DB = "db"
|
5
|
+
DEFAULT_NS = "ns"
|
6
|
+
DEFAULT_QUERY_DOCS = 101
|
6
7
|
|
7
8
|
module EMConnection
|
8
9
|
class Error < Exception;
|
@@ -33,12 +34,6 @@ module EM::Mongo
|
|
33
34
|
@is_connected
|
34
35
|
end
|
35
36
|
|
36
|
-
# XXX RMongo interface
|
37
|
-
def collection(db = DEFAULT_DB, ns = DEFAULT_NS)
|
38
|
-
raise "Not connected" if not connected?
|
39
|
-
EM::Mongo::Collection.new(db, ns, self)
|
40
|
-
end
|
41
|
-
|
42
37
|
def new_request_id
|
43
38
|
@request_id += 1
|
44
39
|
end
|
@@ -77,6 +72,23 @@ module EM::Mongo
|
|
77
72
|
send_command(message.to_s, req_id)
|
78
73
|
end
|
79
74
|
|
75
|
+
def update(collection_name, selector, document, options)
|
76
|
+
message = BSON::ByteBuffer.new([0, 0, 0, 0])
|
77
|
+
BSON::BSON_RUBY.serialize_cstr(message, collection_name)
|
78
|
+
|
79
|
+
flags = 0
|
80
|
+
flags += 1 if options[:upsert]
|
81
|
+
flags += 2 if options[:multi]
|
82
|
+
message.put_int(flags)
|
83
|
+
|
84
|
+
message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a)
|
85
|
+
message.put_array(BSON::BSON_CODER.serialize(document, true, true).to_a)
|
86
|
+
|
87
|
+
req_id = new_request_id
|
88
|
+
message.prepend!(message_headers(OP_UPDATE, req_id, message))
|
89
|
+
send_command(message.to_s, req_id)
|
90
|
+
end
|
91
|
+
|
80
92
|
def delete(collection_name, selector)
|
81
93
|
message = BSON::ByteBuffer.new([0, 0, 0, 0])
|
82
94
|
BSON::BSON_RUBY.serialize_cstr(message, collection_name)
|
@@ -102,20 +114,21 @@ module EM::Mongo
|
|
102
114
|
|
103
115
|
# EM hooks
|
104
116
|
def initialize(options={})
|
105
|
-
@request_id
|
106
|
-
@responses
|
107
|
-
@is_connected
|
108
|
-
@host
|
109
|
-
@port
|
117
|
+
@request_id = 0
|
118
|
+
@responses = {}
|
119
|
+
@is_connected = false
|
120
|
+
@host = options[:host] || DEFAULT_IP
|
121
|
+
@port = options[:port] || DEFAULT_PORT
|
122
|
+
@on_unbind = options[:unbind_cb] || proc {}
|
110
123
|
|
111
124
|
@on_close = proc {
|
112
|
-
raise Error, "
|
125
|
+
raise Error, "failure with mongodb server #{@host}:#{@port}"
|
113
126
|
}
|
114
127
|
timeout options[:timeout] if options[:timeout]
|
115
|
-
errback{ @on_close.call }
|
128
|
+
errback { @on_close.call }
|
116
129
|
end
|
117
130
|
|
118
|
-
def self.connect(host = DEFAULT_IP, port =
|
131
|
+
def self.connect(host = DEFAULT_IP, port = DEFAULT_PORT, timeout = nil)
|
119
132
|
opt = {:host => host, :port => port, :timeout => timeout}
|
120
133
|
EM.connect(host, port, self, opt)
|
121
134
|
end
|
@@ -123,26 +136,28 @@ module EM::Mongo
|
|
123
136
|
def connection_completed
|
124
137
|
@buffer = BSON::ByteBuffer.new
|
125
138
|
@is_connected = true
|
126
|
-
@on_close = proc{
|
127
|
-
}
|
128
139
|
succeed
|
129
140
|
end
|
130
141
|
|
131
142
|
|
132
143
|
def message_received?
|
133
144
|
size = @buffer.get_int
|
145
|
+
#@buffer.put_int(size, -1)
|
134
146
|
@buffer.rewind
|
135
|
-
|
147
|
+
|
148
|
+
if @buffer.size >= size-4
|
149
|
+
true
|
150
|
+
else
|
151
|
+
false
|
152
|
+
end
|
136
153
|
end
|
137
154
|
|
138
155
|
def receive_data(data)
|
139
156
|
|
140
|
-
@buffer.
|
141
|
-
@buffer.rewind
|
157
|
+
@buffer.append!(BSON::ByteBuffer.new(data.unpack('C*')))
|
142
158
|
return if @buffer.size < STANDARD_HEADER_SIZE
|
143
159
|
|
144
160
|
if message_received?
|
145
|
-
|
146
161
|
# Header
|
147
162
|
header = BSON::ByteBuffer.new
|
148
163
|
header.put_array(@buffer.get(STANDARD_HEADER_SIZE))
|
@@ -181,12 +196,12 @@ module EM::Mongo
|
|
181
196
|
|
182
197
|
if size > @buffer.size
|
183
198
|
@buffer = ''
|
184
|
-
raise "Buffer Overflow: Failed to parse buffer"
|
199
|
+
raise "Buffer Overflow: Failed to parse document buffer: size: #{size}, expected: #{@buffer.size}"
|
185
200
|
end
|
186
201
|
buf.put_array(@buffer.get(size-4), 4)
|
187
202
|
|
188
203
|
buf.rewind
|
189
|
-
BSON::
|
204
|
+
BSON::BSON_RUBY.deserialize(buf)
|
190
205
|
end
|
191
206
|
|
192
207
|
@buffer.clear
|
@@ -200,19 +215,16 @@ module EM::Mongo
|
|
200
215
|
end
|
201
216
|
|
202
217
|
def send_data data
|
203
|
-
log "send_data:#{data.size}"#, data
|
204
218
|
super data
|
205
219
|
end
|
206
220
|
|
207
221
|
def unbind
|
208
|
-
log "unbind"
|
209
222
|
@is_connected = false
|
210
|
-
@
|
223
|
+
@on_unbind.call
|
211
224
|
end
|
212
225
|
|
213
226
|
def close
|
214
|
-
|
215
|
-
@on_close = proc{ yield if block_given? }
|
227
|
+
@on_close = proc { yield if block_given? }
|
216
228
|
if @responses.empty?
|
217
229
|
close_connection
|
218
230
|
else
|
@@ -223,8 +235,7 @@ module EM::Mongo
|
|
223
235
|
private
|
224
236
|
|
225
237
|
def log *args
|
226
|
-
|
227
|
-
pp args
|
238
|
+
puts args
|
228
239
|
puts
|
229
240
|
end
|
230
241
|
|
@@ -252,15 +263,10 @@ module EM::Mongo
|
|
252
263
|
def initialize(host = DEFAULT_IP, port = DEFAULT_PORT, timeout = nil)
|
253
264
|
@em_connection = EMConnection.connect(host, port, timeout)
|
254
265
|
@db = {}
|
255
|
-
self
|
256
266
|
end
|
257
267
|
|
258
268
|
def db(name = DEFAULT_DB)
|
259
|
-
@db[name]
|
260
|
-
end
|
261
|
-
|
262
|
-
def collection(db = DEFAULT_DB, ns = DEFAULT_NS)
|
263
|
-
@em_connection.collection(db, ns)
|
269
|
+
@db[name] ||= EM::Mongo::Database.new(name, @em_connection)
|
264
270
|
end
|
265
271
|
|
266
272
|
def close
|
data/lib/em-mongo.rb
CHANGED
data/spec/collection_spec.rb
CHANGED
@@ -63,6 +63,31 @@ describe EMMongo::Collection do
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
it 'should find large sets of objects' do
|
67
|
+
EM::Spec::Mongo.collection do |collection|
|
68
|
+
(0..1500).each { |n| collection.insert({n.to_s => n.to_s}) }
|
69
|
+
collection.find do |res|
|
70
|
+
res.size.should == EM::Mongo::DEFAULT_QUERY_DOCS
|
71
|
+
collection.find({}, {:limit => 1500}) do |res|
|
72
|
+
res.size.should == 1500
|
73
|
+
EM::Spec::Mongo.close
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should update an object' do
|
80
|
+
EM::Spec::Mongo.collection do |collection|
|
81
|
+
obj = collection.insert('hello' => 'world')
|
82
|
+
collection.update({'hello' => 'world'}, {'hello' => 'newworld'})
|
83
|
+
collection.find({'_id' => obj['_id']},{}) do |res|
|
84
|
+
res[0]['hello'].should == 'newworld'
|
85
|
+
EM::Spec::Mongo.close
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
66
91
|
it 'should remove an object' do
|
67
92
|
EM::Spec::Mongo.collection do |collection|
|
68
93
|
obj = collection.insert('hello' => 'world')
|
data/spec/connection_spec.rb
CHANGED
@@ -16,11 +16,11 @@ describe EMMongo::Connection do
|
|
16
16
|
it 'should close' do
|
17
17
|
em do
|
18
18
|
connection = EMMongo::Connection.new
|
19
|
-
EM.
|
19
|
+
EM.add_timer(1) do
|
20
20
|
connection.connected?.should == true
|
21
21
|
connection.close
|
22
22
|
end
|
23
|
-
EM.add_timer(
|
23
|
+
EM.add_timer(2) do
|
24
24
|
EM.next_tick do
|
25
25
|
connection.connected?.should == false
|
26
26
|
done
|
@@ -29,14 +29,6 @@ describe EMMongo::Connection do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
# Support the old RMongo interface for now
|
33
|
-
it 'should instantiate a Collection' do
|
34
|
-
EM::Spec::Mongo.connection do |connection|
|
35
|
-
connection.collection.is_a?(EM::Mongo::Collection).should == true
|
36
|
-
EM::Spec::Mongo.close
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
32
|
it 'should instantiate a Databse' do
|
41
33
|
EM::Spec::Mongo.connection do |connection|
|
42
34
|
db1 = connection.db
|