em-mongo 0.3.4 → 0.3.5
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/VERSION +1 -1
- data/lib/em-mongo/collection.rb +2 -1
- data/lib/em-mongo/connection.rb +9 -1
- data/lib/em-mongo/exceptions.rb +72 -0
- data/spec/integration/collection_spec.rb +30 -8
- metadata +3 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.5
|
data/lib/em-mongo/collection.rb
CHANGED
@@ -14,8 +14,9 @@ module EM::Mongo
|
|
14
14
|
|
15
15
|
skip = opts.delete(:skip) || 0
|
16
16
|
limit = opts.delete(:limit) || 0
|
17
|
+
order = opts.delete(:order)
|
17
18
|
|
18
|
-
@connection.find(@name, skip, limit, selector, nil, &blk)
|
19
|
+
@connection.find(@name, skip, limit, order, selector, nil, &blk)
|
19
20
|
end
|
20
21
|
|
21
22
|
def first(selector={}, opts={}, &blk)
|
data/lib/em-mongo/connection.rb
CHANGED
@@ -99,12 +99,13 @@ module EM::Mongo
|
|
99
99
|
send_command(message.to_s, req_id)
|
100
100
|
end
|
101
101
|
|
102
|
-
def find(collection_name, skip, limit, query, fields, &blk)
|
102
|
+
def find(collection_name, skip, limit, order, query, fields, &blk)
|
103
103
|
message = BSON::ByteBuffer.new
|
104
104
|
message.put_int(RESERVED) # query options
|
105
105
|
BSON::BSON_RUBY.serialize_cstr(message, collection_name)
|
106
106
|
message.put_int(skip)
|
107
107
|
message.put_int(limit)
|
108
|
+
query = order.nil? ? query : construct_query_spec(query, order)
|
108
109
|
message.put_array(BSON::BSON_CODER.serialize(query, false).to_a)
|
109
110
|
message.put_array(BSON::BSON_CODER.serialize(fields, false).to_a) if fields
|
110
111
|
req_id = new_request_id
|
@@ -112,6 +113,13 @@ module EM::Mongo
|
|
112
113
|
send_command(message.to_s, req_id, &blk)
|
113
114
|
end
|
114
115
|
|
116
|
+
def construct_query_spec(query, order)
|
117
|
+
spec = BSON::OrderedHash.new
|
118
|
+
spec['$query'] = query
|
119
|
+
spec['$orderby'] = Mongo::Support.format_order_clause(order) if order
|
120
|
+
spec
|
121
|
+
end
|
122
|
+
|
115
123
|
# EM hooks
|
116
124
|
def initialize(options={})
|
117
125
|
@request_id = 0
|
@@ -0,0 +1,72 @@
|
|
1
|
+
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
#
|
5
|
+
# --
|
6
|
+
# Copyright (C) 2008-2011 10gen Inc.
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
# ++
|
20
|
+
|
21
|
+
module Mongo
|
22
|
+
# Generic Mongo Ruby Driver exception class.
|
23
|
+
class MongoRubyError < StandardError; end
|
24
|
+
|
25
|
+
# Raised when MongoDB itself has returned an error.
|
26
|
+
class MongoDBError < RuntimeError; end
|
27
|
+
|
28
|
+
# Raised when configuration options cause connections, queries, etc., to fail.
|
29
|
+
class ConfigurationError < MongoRubyError; end
|
30
|
+
|
31
|
+
# Raised on fatal errors to GridFS.
|
32
|
+
class GridError < MongoRubyError; end
|
33
|
+
|
34
|
+
# Raised on fatal errors to GridFS.
|
35
|
+
class GridFileNotFound < GridError; end
|
36
|
+
|
37
|
+
# Raised on fatal errors to GridFS.
|
38
|
+
class GridMD5Failure < GridError; end
|
39
|
+
|
40
|
+
# Raised when invalid arguments are sent to Mongo Ruby methods.
|
41
|
+
class MongoArgumentError < MongoRubyError; end
|
42
|
+
|
43
|
+
# Raised on failures in connection to the database server.
|
44
|
+
class ConnectionError < MongoRubyError; end
|
45
|
+
|
46
|
+
# Raised on failures in connection to the database server.
|
47
|
+
class ReplicaSetConnectionError < ConnectionError; end
|
48
|
+
|
49
|
+
# Raised on failures in connection to the database server.
|
50
|
+
class ConnectionTimeoutError < MongoRubyError; end
|
51
|
+
|
52
|
+
# Raised when a connection operation fails.
|
53
|
+
class ConnectionFailure < MongoDBError; end
|
54
|
+
|
55
|
+
# Raised when authentication fails.
|
56
|
+
class AuthenticationError < MongoDBError; end
|
57
|
+
|
58
|
+
# Raised when a database operation fails.
|
59
|
+
class OperationFailure < MongoDBError; end
|
60
|
+
|
61
|
+
# Raised when a socket read operation times out.
|
62
|
+
class OperationTimeout < ::Timeout::Error; end
|
63
|
+
|
64
|
+
# Raised when a client attempts to perform an invalid operation.
|
65
|
+
class InvalidOperation < MongoDBError; end
|
66
|
+
|
67
|
+
# Raised when an invalid collection or database name is used (invalid namespace name).
|
68
|
+
class InvalidNSName < RuntimeError; end
|
69
|
+
|
70
|
+
# Raised when the client supplies an invalid value to sort by.
|
71
|
+
class InvalidSortValueError < MongoRubyError; end
|
72
|
+
end
|
@@ -26,7 +26,7 @@ describe EMMongo::Collection do
|
|
26
26
|
|
27
27
|
it 'should find an object by attribute' do
|
28
28
|
@conn, @coll = connection_and_collection
|
29
|
-
|
29
|
+
|
30
30
|
@coll.insert("hello" => 'world')
|
31
31
|
@coll.find({"hello" => "world"},{}) do |res|
|
32
32
|
res.size.should >= 1
|
@@ -40,7 +40,7 @@ describe EMMongo::Collection do
|
|
40
40
|
|
41
41
|
obj = @coll.insert({:_id => 1234, 'foo' => 'bar', :hello => 'world'})
|
42
42
|
@coll.first({:_id => 1234},{}) do |res|
|
43
|
-
res['hello'].should == 'world'
|
43
|
+
res['hello'].should == 'world'
|
44
44
|
res['foo'].should == 'bar'
|
45
45
|
done
|
46
46
|
end
|
@@ -48,7 +48,7 @@ describe EMMongo::Collection do
|
|
48
48
|
|
49
49
|
it 'should find an object by symbol' do
|
50
50
|
@conn, @coll = connection_and_collection
|
51
|
-
|
51
|
+
|
52
52
|
@coll.insert('hello' => 'world')
|
53
53
|
@coll.find({:hello => "world"},{}) do |res|
|
54
54
|
res.size.should >= 1
|
@@ -59,7 +59,7 @@ describe EMMongo::Collection do
|
|
59
59
|
|
60
60
|
it 'should find an object by id' do
|
61
61
|
@conn, @coll = connection_and_collection
|
62
|
-
|
62
|
+
|
63
63
|
id = @coll.insert('hello' => 'world')
|
64
64
|
@coll.find({:_id => id},{}) do |res|
|
65
65
|
res.size.should >= 1
|
@@ -79,9 +79,31 @@ describe EMMongo::Collection do
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
it 'should find objects and sort by the order field' do
|
83
|
+
@conn, @coll = connection_and_collection
|
84
|
+
|
85
|
+
@coll.insert(:name => 'one', :position => 0)
|
86
|
+
@coll.insert(:name => 'three', :position => 2)
|
87
|
+
@coll.insert(:name => 'two', :position => 1)
|
88
|
+
|
89
|
+
@coll.find({}, {:order => 'position'}) do |res|
|
90
|
+
res[0]["name"].should == 'one'
|
91
|
+
res[1]["name"].should == 'two'
|
92
|
+
res[2]["name"].should == 'three'
|
93
|
+
done
|
94
|
+
end
|
95
|
+
|
96
|
+
@coll.find({}, {:order => [:position, :desc]}) do |res|
|
97
|
+
res[0]["name"].should == 'three'
|
98
|
+
res[1]["name"].should == 'two'
|
99
|
+
res[2]["name"].should == 'one'
|
100
|
+
done
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
82
104
|
it 'should find large sets of objects' do
|
83
105
|
@conn, @coll = connection_and_collection
|
84
|
-
|
106
|
+
|
85
107
|
(0..1500).each { |n| @coll.insert({n.to_s => n.to_s}) }
|
86
108
|
@coll.find do |res|
|
87
109
|
res.size.should == EM::Mongo::DEFAULT_QUERY_DOCS
|
@@ -175,7 +197,7 @@ describe EMMongo::Collection do
|
|
175
197
|
|
176
198
|
it 'should find an object using nested properties' do
|
177
199
|
@conn, @coll = connection_and_collection
|
178
|
-
|
200
|
+
|
179
201
|
@coll.insert({
|
180
202
|
'name' => 'Google',
|
181
203
|
'address' => {
|
@@ -205,7 +227,7 @@ describe EMMongo::Collection do
|
|
205
227
|
|
206
228
|
it 'should find objects greater than something' do
|
207
229
|
@conn, @coll = connection_and_collection
|
208
|
-
|
230
|
+
|
209
231
|
number_hash.each do |num, word|
|
210
232
|
@coll.insert('num' => num, 'word' => word)
|
211
233
|
end
|
@@ -219,7 +241,7 @@ describe EMMongo::Collection do
|
|
219
241
|
|
220
242
|
it 'should handle multiple pending queries' do
|
221
243
|
@conn, @coll = connection_and_collection
|
222
|
-
|
244
|
+
|
223
245
|
id = @coll.insert("foo" => "bar")
|
224
246
|
received = 0
|
225
247
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 5
|
9
|
+
version: 0.3.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- bcg
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/em-mongo/connection.rb
|
77
77
|
- lib/em-mongo/conversions.rb
|
78
78
|
- lib/em-mongo/database.rb
|
79
|
+
- lib/em-mongo/exceptions.rb
|
79
80
|
- lib/em-mongo/support.rb
|
80
81
|
- lib/em-mongo.rb
|
81
82
|
- spec/integration/collection_spec.rb
|