mongo 0.18.2 → 0.18.3

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.
Files changed (51) hide show
  1. data/README.rdoc +37 -28
  2. data/Rakefile +19 -0
  3. data/bin/objectid_benchmark.rb +23 -0
  4. data/examples/admin.rb +7 -6
  5. data/examples/capped.rb +3 -4
  6. data/examples/cursor.rb +4 -3
  7. data/examples/gridfs.rb +3 -2
  8. data/examples/index_test.rb +10 -9
  9. data/examples/info.rb +3 -2
  10. data/examples/queries.rb +3 -2
  11. data/examples/simple.rb +3 -2
  12. data/examples/strict.rb +2 -1
  13. data/examples/types.rb +4 -3
  14. data/lib/mongo.rb +29 -12
  15. data/lib/mongo/admin.rb +17 -2
  16. data/lib/mongo/collection.rb +230 -169
  17. data/lib/mongo/connection.rb +136 -91
  18. data/lib/mongo/cursor.rb +68 -40
  19. data/lib/mongo/db.rb +247 -123
  20. data/lib/mongo/{errors.rb → exceptions.rb} +6 -5
  21. data/lib/mongo/gridfs.rb +6 -0
  22. data/lib/mongo/gridfs/grid_store.rb +142 -94
  23. data/lib/mongo/types/binary.rb +11 -1
  24. data/lib/mongo/types/code.rb +6 -1
  25. data/lib/mongo/types/dbref.rb +7 -2
  26. data/lib/mongo/types/min_max_keys.rb +58 -0
  27. data/lib/mongo/types/objectid.rb +76 -20
  28. data/lib/mongo/types/regexp_of_holding.rb +5 -0
  29. data/lib/mongo/util/bson_ruby.rb +36 -2
  30. data/lib/mongo/util/byte_buffer.rb +18 -2
  31. data/lib/mongo/util/conversions.rb +6 -5
  32. data/lib/mongo/util/ordered_hash.rb +3 -1
  33. data/lib/mongo/util/support.rb +3 -0
  34. data/lib/mongo/util/xml_to_ruby.rb +7 -0
  35. data/test/test_bson.rb +48 -0
  36. data/test/test_collection.rb +13 -0
  37. data/test/test_connection.rb +35 -0
  38. data/test/test_conversions.rb +1 -1
  39. data/test/test_cursor.rb +37 -5
  40. data/test/test_db.rb +51 -2
  41. data/test/test_db_api.rb +4 -7
  42. data/test/test_grid_store.rb +10 -0
  43. data/test/test_objectid.rb +16 -2
  44. data/test/test_ordered_hash.rb +14 -0
  45. data/test/threading/test_threading_large_pool.rb +4 -4
  46. data/test/unit/db_test.rb +43 -0
  47. metadata +5 -7
  48. data/examples/benchmarks.rb +0 -42
  49. data/examples/blog.rb +0 -76
  50. data/lib/mongo/constants.rb +0 -15
  51. data/test/mongo-qa/_common.rb +0 -8
@@ -191,6 +191,19 @@ class TestCollection < Test::Unit::TestCase
191
191
  end
192
192
  end
193
193
 
194
+ def test_safe_remove
195
+ @conn = Connection.new
196
+ @db = @conn['mongo-ruby-test']
197
+ @test = @db['test-safe-remove']
198
+ @test.save({:a => 20})
199
+ @conn.stubs(:receive).returns([[{'ok' => 0, 'err' => 'failed'}], 1, 0])
200
+
201
+ assert_raise OperationFailure do
202
+ @test.remove({}, :safe => true)
203
+ end
204
+ @test.drop
205
+ end
206
+
194
207
  def test_count
195
208
  @@test.drop
196
209
 
@@ -1,6 +1,7 @@
1
1
  require 'test/test_helper'
2
2
  require 'logger'
3
3
  require 'stringio'
4
+ require 'thread'
4
5
 
5
6
  # NOTE: assumes Mongo is running
6
7
  class TestConnection < Test::Unit::TestCase
@@ -122,4 +123,38 @@ class TestConnection < Test::Unit::TestCase
122
123
  assert_equal ['bar', Connection::DEFAULT_PORT], nodes[0]
123
124
  assert_equal ['foo', 123], nodes[1]
124
125
  end
126
+
127
+ context "Connection exceptions" do
128
+ setup do
129
+ @conn = Mongo::Connection.new('localhost', 27017, :pool_size => 10, :timeout => 10)
130
+ @coll = @conn['mongo-ruby-test']['test-connection-exceptions']
131
+ end
132
+
133
+ should "release connection if an exception is raised on send_message" do
134
+ @conn.stubs(:send_message_on_socket).raises(ConnectionFailure)
135
+ assert_equal 0, @conn.checked_out.size
136
+ assert_raise ConnectionFailure do
137
+ @coll.insert({:test => "insert"})
138
+ end
139
+ assert_equal 0, @conn.checked_out.size
140
+ end
141
+
142
+ should "release connection if an exception is raised on send_with_safe_check" do
143
+ @conn.stubs(:receive).raises(ConnectionFailure)
144
+ assert_equal 0, @conn.checked_out.size
145
+ assert_raise ConnectionFailure do
146
+ @coll.insert({:test => "insert"}, :safe => true)
147
+ end
148
+ assert_equal 0, @conn.checked_out.size
149
+ end
150
+
151
+ should "release connection if an exception is raised on receive_message" do
152
+ @conn.stubs(:receive).raises(ConnectionFailure)
153
+ assert_equal 0, @conn.checked_out.size
154
+ assert_raise ConnectionFailure do
155
+ @coll.find.to_a
156
+ end
157
+ assert_equal 0, @conn.checked_out.size
158
+ end
159
+ end
125
160
  end
@@ -1,5 +1,5 @@
1
1
  require 'test/test_helper'
2
- require 'mongo/errors'
2
+ require 'mongo/exceptions'
3
3
  require 'mongo/util/conversions'
4
4
  require 'mongo/util/ordered_hash'
5
5
 
@@ -1,4 +1,5 @@
1
1
  require 'test/test_helper'
2
+ require 'logger'
2
3
 
3
4
  # NOTE: assumes Mongo is running
4
5
  class CursorTest < Test::Unit::TestCase
@@ -17,11 +18,6 @@ class CursorTest < Test::Unit::TestCase
17
18
  @@coll_full_name = 'ruby-mongo-test.test'
18
19
  end
19
20
 
20
- def teardown
21
- @@coll.remove
22
- @@db.error
23
- end
24
-
25
21
  def test_explain
26
22
  cursor = @@coll.find('a' => 1)
27
23
  explaination = cursor.explain
@@ -112,6 +108,42 @@ class CursorTest < Test::Unit::TestCase
112
108
  assert_equal 2004, @@coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
113
109
  end
114
110
 
111
+ def test_sort_min_max_keys
112
+ @@coll.remove
113
+ @@coll.insert({"n" => 1000000})
114
+ @@coll.insert({"n" => -1000000})
115
+ @@coll.insert({"n" => MaxKey.new})
116
+ @@coll.insert({"n" => MinKey.new})
117
+
118
+ results = @@coll.find.sort([:n, :asc]).to_a
119
+
120
+ assert_equal MinKey.new, results[0]['n']
121
+ assert_equal -1000000, results[1]['n']
122
+ assert_equal 1000000, results[2]['n']
123
+ assert_equal MaxKey.new, results[3]['n']
124
+ end
125
+
126
+ def test_id_range_queries
127
+ @@coll.remove
128
+
129
+ t1 = Time.now
130
+ t1_id = ObjectID.from_time(t1)
131
+ @@coll.save({:t => 't1'})
132
+ @@coll.save({:t => 't1'})
133
+ @@coll.save({:t => 't1'})
134
+ sleep(2)
135
+ t2 = Time.now
136
+ t2_id = ObjectID.from_time(t2)
137
+ @@coll.save({:t => 't2'})
138
+ @@coll.save({:t => 't2'})
139
+ @@coll.save({:t => 't2'})
140
+
141
+ assert_equal 3, @@coll.find({'_id' => {'$gt' => t1_id}, '_id' => {'$lt' => t2_id}}).count
142
+ @@coll.find({'_id' => {'$gt' => t2_id}}).each do |doc|
143
+ assert_equal 't2', doc['t']
144
+ end
145
+ end
146
+
115
147
  def test_limit
116
148
  @@coll.remove
117
149
 
@@ -132,7 +132,7 @@ class DBTest < Test::Unit::TestCase
132
132
  db.pk_factory = Object.new
133
133
  fail "error: expected exception"
134
134
  rescue => ex
135
- assert_match /can not change PK factory/, ex.to_s
135
+ assert_match /Cannot change/, ex.to_s
136
136
  ensure
137
137
  conn.close
138
138
  end
@@ -145,7 +145,7 @@ class DBTest < Test::Unit::TestCase
145
145
  end
146
146
 
147
147
  def test_logout
148
- @@db.logout # only testing that we don't throw exception
148
+ assert @@db.logout
149
149
  end
150
150
 
151
151
  def test_error
@@ -202,4 +202,53 @@ class DBTest < Test::Unit::TestCase
202
202
  assert db.collection('users').remove
203
203
  end
204
204
 
205
+ context "database profiling" do
206
+ setup do
207
+ @db = @@conn['ruby-mongo-test-admin-functions']
208
+ @coll = @db['test']
209
+ @coll.remove
210
+ @r1 = @coll.insert('a' => 1) # collection not created until it's used
211
+ end
212
+
213
+ should "set default profiling level" do
214
+ assert_equal :off, @db.profiling_level
215
+ end
216
+
217
+ should "change profiling level" do
218
+ @db.profiling_level = :slow_only
219
+ assert_equal :slow_only, @db.profiling_level
220
+ @db.profiling_level = :off
221
+ assert_equal :off, @db.profiling_level
222
+ @db.profiling_level = :all
223
+ assert_equal :all, @db.profiling_level
224
+ begin
225
+ @db.profiling_level = :medium
226
+ fail "shouldn't be able to do this"
227
+ rescue
228
+ end
229
+ end
230
+
231
+ should "return profiling info" do
232
+ @db.profiling_level = :all
233
+ @coll.find()
234
+ @db.profiling_level = :off
235
+
236
+ info = @db.profiling_info
237
+ assert_kind_of Array, info
238
+ assert info.length >= 1
239
+ first = info.first
240
+ assert_kind_of String, first['info']
241
+ assert_kind_of Time, first['ts']
242
+ assert_kind_of Numeric, first['millis']
243
+ end
244
+
245
+ should "validate collection" do
246
+ doc = @db.validate_collection(@coll.name)
247
+ assert_not_nil doc
248
+ result = doc['result']
249
+ assert_not_nil result
250
+ assert_match /firstExtent/, result
251
+ end
252
+
253
+ end
205
254
  end
@@ -419,6 +419,7 @@ class DBAPITest < Test::Unit::TestCase
419
419
  @@db.collection('does-not-exist')
420
420
  fail "expected exception"
421
421
  rescue => ex
422
+ assert_equal MongoDBError, ex.class
422
423
  assert_equal "Collection does-not-exist doesn't exist. Currently in strict mode.", ex.to_s
423
424
  ensure
424
425
  @@db.strict = false
@@ -438,15 +439,11 @@ class DBAPITest < Test::Unit::TestCase
438
439
  end
439
440
 
440
441
  # Now the collection exists. This time we should see an exception.
441
- begin
442
+ assert_raise MongoDBError do
442
443
  @@db.create_collection('foobar')
443
- fail "expected exception"
444
- rescue => ex
445
- assert_equal "Collection foobar already exists. Currently in strict mode.", ex.to_s
446
- ensure
447
- @@db.strict = false
448
- @@db.drop_collection('foobar')
449
444
  end
445
+ @@db.strict = false
446
+ @@db.drop_collection('foobar')
450
447
 
451
448
  # Now we're not in strict mode - should succeed
452
449
  @@db.create_collection('foobar')
@@ -151,6 +151,16 @@ class GridStoreTest < Test::Unit::TestCase
151
151
  assert_equal 0, @@files.count
152
152
  assert_equal 0, @@chunks.count
153
153
  end
154
+
155
+ def test_mv
156
+ assert_equal 1, @@files.count
157
+ assert_equal 1, @@chunks.count
158
+ GridStore.mv(@@db, 'foobar', 'bazqux')
159
+ assert_equal 1, @@files.count
160
+ assert_equal 1, @@chunks.count
161
+ assert !GridStore.exist?(@@db, 'foobar')
162
+ assert GridStore.exist?(@@db, 'bazqux')
163
+ end
154
164
 
155
165
  def test_append
156
166
  GridStore.open(@@db, 'foobar', 'w+') { |f| f.write(" how are you?") }
@@ -23,7 +23,7 @@ class ObjectIDTest < Test::Unit::TestCase
23
23
  doc = {:name => 'Mongo'}
24
24
  doc = ObjectID.create_pk(doc)
25
25
  assert doc[:_id]
26
-
26
+
27
27
  doc = {:name => 'Mongo', :_id => '12345'}
28
28
  doc = ObjectID.create_pk(doc)
29
29
  assert_equal '12345', doc[:_id]
@@ -136,7 +136,21 @@ class ObjectIDTest < Test::Unit::TestCase
136
136
  def test_generation_time
137
137
  time = Time.now
138
138
  id = ObjectID.new
139
+ generated_time = id.generation_time
140
+
141
+ assert_in_delta time.to_i, generated_time.to_i, 2
142
+ assert_equal "UTC", generated_time.zone
143
+ end
144
+
145
+ def test_from_time
146
+ time = Time.now.utc
147
+ id = ObjectID.from_time(time)
148
+
149
+ assert_equal time.to_i, id.generation_time.to_i
150
+ end
139
151
 
140
- assert_in_delta time.to_i, id.generation_time.to_i, 2
152
+ def test_json
153
+ id = ObjectID.new
154
+ assert_equal "{\"$oid\": \"#{id}\"}", id.to_json
141
155
  end
142
156
  end
@@ -19,6 +19,12 @@ class OrderedHashTest < Test::Unit::TestCase
19
19
  assert_equal a, b
20
20
  end
21
21
 
22
+ def test_hash_code
23
+ o = OrderedHash.new
24
+ o['number'] = 50
25
+ assert o.hash
26
+ end
27
+
22
28
  def test_empty
23
29
  assert_equal [], OrderedHash.new.keys
24
30
  end
@@ -130,6 +136,14 @@ class OrderedHashTest < Test::Unit::TestCase
130
136
  assert_equal ['crab', 'apple', 3, 'foo'], @oh.values
131
137
  end
132
138
 
139
+ def test_update
140
+ other = OrderedHash.new
141
+ other['f'] = 'foo'
142
+ noob = @oh.update(other)
143
+ assert_equal @ordered_keys + ['f'], noob.keys
144
+ assert_equal [1, 2, 3, 'foo'], noob.values
145
+ end
146
+
133
147
  def test_inspect_retains_order
134
148
  assert_equal '{"c"=>1, "a"=>2, "z"=>3}', @oh.inspect
135
149
  end
@@ -25,7 +25,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
25
25
  def test_safe_update
26
26
  set_up_safe_data
27
27
  threads = []
28
- 1000.times do |i|
28
+ 300.times do |i|
29
29
  threads[i] = Thread.new do
30
30
  if i % 2 == 0
31
31
  assert_raise Mongo::OperationFailure do
@@ -37,7 +37,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
37
37
  end
38
38
  end
39
39
 
40
- 1000.times do |i|
40
+ 300.times do |i|
41
41
  threads[i].join
42
42
  end
43
43
  end
@@ -45,7 +45,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
45
45
  def test_safe_insert
46
46
  set_up_safe_data
47
47
  threads = []
48
- 1000.times do |i|
48
+ 300.times do |i|
49
49
  threads[i] = Thread.new do
50
50
  if i % 2 == 0
51
51
  assert_raise Mongo::OperationFailure do
@@ -57,7 +57,7 @@ class TestThreadingLargePool < Test::Unit::TestCase
57
57
  end
58
58
  end
59
59
 
60
- 1000.times do |i|
60
+ 300.times do |i|
61
61
  threads[i].join
62
62
  end
63
63
  end
@@ -48,6 +48,49 @@ class DBTest < Test::Unit::TestCase
48
48
  @db.command(command, true, true)
49
49
  end
50
50
  end
51
+
52
+ should "raise an error if logging out fails" do
53
+ @db.expects(:command).returns({})
54
+ assert_raise MongoDBError do
55
+ @db.logout
56
+ end
57
+ end
58
+
59
+ should "raise an error if collection creation fails" do
60
+ @db.expects(:collection_names).returns([])
61
+ @db.expects(:command).returns({})
62
+ assert_raise MongoDBError do
63
+ @db.create_collection("foo")
64
+ end
65
+ end
66
+
67
+ should "raise an error if getlasterror fails" do
68
+ @db.expects(:command).returns({})
69
+ assert_raise MongoDBError do
70
+ @db.error
71
+ end
72
+ end
73
+
74
+ should "raise an error if rename fails" do
75
+ @db.expects(:command).returns({})
76
+ assert_raise MongoDBError do
77
+ @db.rename_collection("foo", "bar")
78
+ end
79
+ end
80
+
81
+ should "raise an error if drop_index fails" do
82
+ @db.expects(:command).returns({})
83
+ assert_raise MongoDBError do
84
+ @db.drop_index("foo", "bar")
85
+ end
86
+ end
87
+
88
+ should "raise an error if set_profiling_level fails" do
89
+ @db.expects(:command).returns({})
90
+ assert_raise MongoDBError do
91
+ @db.profiling_level = :slow_only
92
+ end
93
+ end
51
94
  end
52
95
  end
53
96
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.2
4
+ version: 0.18.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Menard
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-12-29 00:00:00 -05:00
13
+ date: 2010-01-25 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -30,16 +30,16 @@ files:
30
30
  - lib/mongo/admin.rb
31
31
  - lib/mongo/collection.rb
32
32
  - lib/mongo/connection.rb
33
- - lib/mongo/constants.rb
34
33
  - lib/mongo/cursor.rb
35
34
  - lib/mongo/db.rb
36
- - lib/mongo/errors.rb
35
+ - lib/mongo/exceptions.rb
37
36
  - lib/mongo/gridfs/chunk.rb
38
37
  - lib/mongo/gridfs/grid_store.rb
39
38
  - lib/mongo/gridfs.rb
40
39
  - lib/mongo/types/binary.rb
41
40
  - lib/mongo/types/code.rb
42
41
  - lib/mongo/types/dbref.rb
42
+ - lib/mongo/types/min_max_keys.rb
43
43
  - lib/mongo/types/objectid.rb
44
44
  - lib/mongo/types/regexp_of_holding.rb
45
45
  - lib/mongo/util/bson_c.rb
@@ -52,8 +52,6 @@ files:
52
52
  - lib/mongo/util/xml_to_ruby.rb
53
53
  - lib/mongo.rb
54
54
  - examples/admin.rb
55
- - examples/benchmarks.rb
56
- - examples/blog.rb
57
55
  - examples/capped.rb
58
56
  - examples/cursor.rb
59
57
  - examples/gridfs.rb
@@ -65,6 +63,7 @@ files:
65
63
  - examples/types.rb
66
64
  - bin/bson_benchmark.rb
67
65
  - bin/fail_if_no_c.rb
66
+ - bin/objectid_benchmark.rb
68
67
  - bin/perf.rb
69
68
  has_rdoc: true
70
69
  homepage: http://www.mongodb.org
@@ -97,7 +96,6 @@ signing_key:
97
96
  specification_version: 3
98
97
  summary: Ruby driver for the MongoDB
99
98
  test_files:
100
- - test/mongo-qa/_common.rb
101
99
  - test/replica/count_test.rb
102
100
  - test/replica/insert_test.rb
103
101
  - test/replica/pooled_insert_test.rb