kbaum-mongo 0.18.3p

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 (72) hide show
  1. data/LICENSE.txt +202 -0
  2. data/README.rdoc +339 -0
  3. data/Rakefile +138 -0
  4. data/bin/bson_benchmark.rb +59 -0
  5. data/bin/fail_if_no_c.rb +11 -0
  6. data/examples/admin.rb +42 -0
  7. data/examples/capped.rb +22 -0
  8. data/examples/cursor.rb +48 -0
  9. data/examples/gridfs.rb +88 -0
  10. data/examples/index_test.rb +126 -0
  11. data/examples/info.rb +31 -0
  12. data/examples/queries.rb +70 -0
  13. data/examples/simple.rb +24 -0
  14. data/examples/strict.rb +35 -0
  15. data/examples/types.rb +36 -0
  16. data/lib/mongo/collection.rb +609 -0
  17. data/lib/mongo/connection.rb +672 -0
  18. data/lib/mongo/cursor.rb +403 -0
  19. data/lib/mongo/db.rb +555 -0
  20. data/lib/mongo/exceptions.rb +66 -0
  21. data/lib/mongo/gridfs/chunk.rb +91 -0
  22. data/lib/mongo/gridfs/grid.rb +79 -0
  23. data/lib/mongo/gridfs/grid_file_system.rb +101 -0
  24. data/lib/mongo/gridfs/grid_io.rb +338 -0
  25. data/lib/mongo/gridfs/grid_store.rb +580 -0
  26. data/lib/mongo/gridfs.rb +25 -0
  27. data/lib/mongo/types/binary.rb +52 -0
  28. data/lib/mongo/types/code.rb +36 -0
  29. data/lib/mongo/types/dbref.rb +40 -0
  30. data/lib/mongo/types/min_max_keys.rb +58 -0
  31. data/lib/mongo/types/objectid.rb +180 -0
  32. data/lib/mongo/types/regexp_of_holding.rb +45 -0
  33. data/lib/mongo/util/bson_c.rb +18 -0
  34. data/lib/mongo/util/bson_ruby.rb +606 -0
  35. data/lib/mongo/util/byte_buffer.rb +222 -0
  36. data/lib/mongo/util/conversions.rb +87 -0
  37. data/lib/mongo/util/ordered_hash.rb +140 -0
  38. data/lib/mongo/util/server_version.rb +69 -0
  39. data/lib/mongo/util/support.rb +26 -0
  40. data/lib/mongo.rb +63 -0
  41. data/mongo-ruby-driver.gemspec +28 -0
  42. data/test/auxillary/autoreconnect_test.rb +42 -0
  43. data/test/binary_test.rb +15 -0
  44. data/test/bson_test.rb +427 -0
  45. data/test/byte_buffer_test.rb +81 -0
  46. data/test/chunk_test.rb +82 -0
  47. data/test/collection_test.rb +515 -0
  48. data/test/connection_test.rb +160 -0
  49. data/test/conversions_test.rb +120 -0
  50. data/test/cursor_test.rb +379 -0
  51. data/test/db_api_test.rb +780 -0
  52. data/test/db_connection_test.rb +16 -0
  53. data/test/db_test.rb +272 -0
  54. data/test/grid_file_system_test.rb +210 -0
  55. data/test/grid_io_test.rb +78 -0
  56. data/test/grid_store_test.rb +334 -0
  57. data/test/grid_test.rb +87 -0
  58. data/test/objectid_test.rb +125 -0
  59. data/test/ordered_hash_test.rb +172 -0
  60. data/test/replica/count_test.rb +34 -0
  61. data/test/replica/insert_test.rb +50 -0
  62. data/test/replica/pooled_insert_test.rb +54 -0
  63. data/test/replica/query_test.rb +39 -0
  64. data/test/slave_connection_test.rb +36 -0
  65. data/test/test_helper.rb +42 -0
  66. data/test/threading/test_threading_large_pool.rb +90 -0
  67. data/test/threading_test.rb +87 -0
  68. data/test/unit/collection_test.rb +61 -0
  69. data/test/unit/connection_test.rb +117 -0
  70. data/test/unit/cursor_test.rb +93 -0
  71. data/test/unit/db_test.rb +98 -0
  72. metadata +127 -0
@@ -0,0 +1,120 @@
1
+ require 'test/test_helper'
2
+ require 'mongo/exceptions'
3
+ require 'mongo/util/conversions'
4
+ require 'mongo/util/ordered_hash'
5
+
6
+ class ConversionsTest < Test::Unit::TestCase
7
+ include Mongo::Conversions
8
+
9
+ def test_array_as_sort_parameters_with_array_of_key_and_value
10
+ params = array_as_sort_parameters(["field1", "asc"])
11
+ assert_equal({"field1" => 1}, params)
12
+ end
13
+
14
+ def test_array_as_sort_parameters_with_array_of_string_and_values
15
+ params = array_as_sort_parameters([["field1", :asc], ["field2", :desc]])
16
+ assert_equal({ "field1" => 1, "field2" => -1 }, params)
17
+ end
18
+
19
+ def test_string_as_sort_parameters_with_string
20
+ params = string_as_sort_parameters("field")
21
+ assert_equal({ "field" => 1 }, params)
22
+ end
23
+
24
+ def test_string_as_sort_parameters_with_empty_string
25
+ params = string_as_sort_parameters("")
26
+ assert_equal({}, params)
27
+ end
28
+
29
+ def test_symbol_as_sort_parameters
30
+ params = string_as_sort_parameters(:field)
31
+ assert_equal({ "field" => 1 }, params)
32
+ end
33
+
34
+ def test_sort_value_when_value_is_one
35
+ assert_equal 1, sort_value(1)
36
+ end
37
+
38
+ def test_sort_value_when_value_is_one_as_a_string
39
+ assert_equal 1, sort_value("1")
40
+ end
41
+
42
+ def test_sort_value_when_value_is_negative_one
43
+ assert_equal -1, sort_value(-1)
44
+ end
45
+
46
+ def test_sort_value_when_value_is_negative_one_as_a_string
47
+ assert_equal -1, sort_value("-1")
48
+ end
49
+
50
+ def test_sort_value_when_value_is_ascending
51
+ assert_equal 1, sort_value("ascending")
52
+ end
53
+
54
+ def test_sort_value_when_value_is_asc
55
+ assert_equal 1, sort_value("asc")
56
+ end
57
+
58
+ def test_sort_value_when_value_is_uppercase_ascending
59
+ assert_equal 1, sort_value("ASCENDING")
60
+ end
61
+
62
+ def test_sort_value_when_value_is_uppercase_asc
63
+ assert_equal 1, sort_value("ASC")
64
+ end
65
+
66
+ def test_sort_value_when_value_is_symbol_ascending
67
+ assert_equal 1, sort_value(:ascending)
68
+ end
69
+
70
+ def test_sort_value_when_value_is_symbol_asc
71
+ assert_equal 1, sort_value(:asc)
72
+ end
73
+
74
+ def test_sort_value_when_value_is_symbol_uppercase_ascending
75
+ assert_equal 1, sort_value(:ASCENDING)
76
+ end
77
+
78
+ def test_sort_value_when_value_is_symbol_uppercase_asc
79
+ assert_equal 1, sort_value(:ASC)
80
+ end
81
+
82
+ def test_sort_value_when_value_is_descending
83
+ assert_equal -1, sort_value("descending")
84
+ end
85
+
86
+ def test_sort_value_when_value_is_desc
87
+ assert_equal -1, sort_value("desc")
88
+ end
89
+
90
+ def test_sort_value_when_value_is_uppercase_descending
91
+ assert_equal -1, sort_value("DESCENDING")
92
+ end
93
+
94
+ def test_sort_value_when_value_is_uppercase_desc
95
+ assert_equal -1, sort_value("DESC")
96
+ end
97
+
98
+ def test_sort_value_when_value_is_symbol_descending
99
+ assert_equal -1, sort_value(:descending)
100
+ end
101
+
102
+ def test_sort_value_when_value_is_symbol_desc
103
+ assert_equal -1, sort_value(:desc)
104
+ end
105
+
106
+ def test_sort_value_when_value_is_uppercase_symbol_descending
107
+ assert_equal -1, sort_value(:DESCENDING)
108
+ end
109
+
110
+ def test_sort_value_when_value_is_uppercase_symbol_desc
111
+ assert_equal -1, sort_value(:DESC)
112
+ end
113
+
114
+ def test_sort_value_when_value_is_invalid
115
+ assert_raise Mongo::InvalidSortValueError do
116
+ sort_value(2)
117
+ end
118
+ end
119
+
120
+ end
@@ -0,0 +1,379 @@
1
+ require 'test/test_helper'
2
+ require 'logger'
3
+
4
+ # NOTE: assumes Mongo is running
5
+ class CursorTest < Test::Unit::TestCase
6
+
7
+ include Mongo
8
+
9
+ @@connection = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
10
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
11
+ @@db = @@connection.db('ruby-mongo-test')
12
+ @@coll = @@db.collection('test')
13
+ @@version = @@connection.server_version
14
+
15
+ def setup
16
+ @@coll.remove
17
+ @@coll.insert('a' => 1) # collection not created until it's used
18
+ @@coll_full_name = 'ruby-mongo-test.test'
19
+ end
20
+
21
+ def test_explain
22
+ cursor = @@coll.find('a' => 1)
23
+ explaination = cursor.explain
24
+ assert_not_nil explaination['cursor']
25
+ assert_kind_of Numeric, explaination['n']
26
+ assert_kind_of Numeric, explaination['millis']
27
+ assert_kind_of Numeric, explaination['nscanned']
28
+ end
29
+
30
+ def test_count
31
+ @@coll.remove
32
+
33
+ assert_equal 0, @@coll.find().count()
34
+
35
+ 10.times do |i|
36
+ @@coll.save("x" => i)
37
+ end
38
+
39
+ assert_equal 10, @@coll.find().count()
40
+ assert_kind_of Integer, @@coll.find().count()
41
+ assert_equal 10, @@coll.find({}, :limit => 5).count()
42
+ assert_equal 10, @@coll.find({}, :skip => 5).count()
43
+
44
+ assert_equal 1, @@coll.find({"x" => 1}).count()
45
+ assert_equal 5, @@coll.find({"x" => {"$lt" => 5}}).count()
46
+
47
+ a = @@coll.find()
48
+ b = a.count()
49
+ a.each do |doc|
50
+ break
51
+ end
52
+ assert_equal b, a.count()
53
+
54
+ assert_equal 0, @@db['acollectionthatdoesn'].count()
55
+ end
56
+
57
+ def test_sort
58
+ @@coll.remove
59
+ 5.times{|x| @@coll.insert({"age" => x}) }
60
+
61
+ assert_kind_of Cursor, @@coll.find().sort(:age, 1)
62
+
63
+ assert_equal 0, @@coll.find().sort(:age, 1).next_document["age"]
64
+ assert_equal 4, @@coll.find().sort(:age, -1).next_document["age"]
65
+ assert_equal 0, @@coll.find().sort([["age", :asc]]).next_document["age"]
66
+
67
+ assert_kind_of Cursor, @@coll.find().sort([[:age, -1], [:b, 1]])
68
+
69
+ assert_equal 4, @@coll.find().sort(:age, 1).sort(:age, -1).next_document["age"]
70
+ assert_equal 0, @@coll.find().sort(:age, -1).sort(:age, 1).next_document["age"]
71
+
72
+ assert_equal 4, @@coll.find().sort([:age, :asc]).sort(:age, -1).next_document["age"]
73
+ assert_equal 0, @@coll.find().sort([:age, :desc]).sort(:age, 1).next_document["age"]
74
+
75
+ cursor = @@coll.find()
76
+ cursor.next_document
77
+ assert_raise InvalidOperation do
78
+ cursor.sort(["age"])
79
+ end
80
+
81
+ assert_raise InvalidSortValueError do
82
+ @@coll.find().sort(:age, 25).next_document
83
+ end
84
+
85
+ assert_raise InvalidSortValueError do
86
+ @@coll.find().sort(25).next_document
87
+ end
88
+ end
89
+
90
+ def test_sort_date
91
+ @@coll.remove
92
+ 5.times{|x| @@coll.insert({"created_at" => Time.utc(2000 + x)}) }
93
+
94
+ assert_equal 2000, @@coll.find().sort(:created_at, :asc).next_document["created_at"].year
95
+ assert_equal 2004, @@coll.find().sort(:created_at, :desc).next_document["created_at"].year
96
+
97
+ assert_equal 2000, @@coll.find().sort([:created_at, :asc]).next_document["created_at"].year
98
+ assert_equal 2004, @@coll.find().sort([:created_at, :desc]).next_document["created_at"].year
99
+
100
+ assert_equal 2000, @@coll.find().sort([[:created_at, :asc]]).next_document["created_at"].year
101
+ assert_equal 2004, @@coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
102
+ end
103
+
104
+ def test_sort_min_max_keys
105
+ @@coll.remove
106
+ @@coll.insert({"n" => 1000000})
107
+ @@coll.insert({"n" => -1000000})
108
+ @@coll.insert({"n" => MaxKey.new})
109
+ @@coll.insert({"n" => MinKey.new})
110
+
111
+ results = @@coll.find.sort([:n, :asc]).to_a
112
+
113
+ assert_equal MinKey.new, results[0]['n']
114
+ assert_equal -1000000, results[1]['n']
115
+ assert_equal 1000000, results[2]['n']
116
+ assert_equal MaxKey.new, results[3]['n']
117
+ end
118
+
119
+ def test_id_range_queries
120
+ @@coll.remove
121
+
122
+ t1 = Time.now
123
+ t1_id = ObjectID.from_time(t1)
124
+ @@coll.save({:t => 't1'})
125
+ @@coll.save({:t => 't1'})
126
+ @@coll.save({:t => 't1'})
127
+ sleep(2)
128
+ t2 = Time.now
129
+ t2_id = ObjectID.from_time(t2)
130
+ @@coll.save({:t => 't2'})
131
+ @@coll.save({:t => 't2'})
132
+ @@coll.save({:t => 't2'})
133
+
134
+ assert_equal 3, @@coll.find({'_id' => {'$gt' => t1_id}, '_id' => {'$lt' => t2_id}}).count
135
+ @@coll.find({'_id' => {'$gt' => t2_id}}).each do |doc|
136
+ assert_equal 't2', doc['t']
137
+ end
138
+ end
139
+
140
+ def test_limit
141
+ @@coll.remove
142
+
143
+ 10.times do |i|
144
+ @@coll.save("x" => i)
145
+ end
146
+ assert_equal 10, @@coll.find().count()
147
+
148
+ results = @@coll.find().limit(5).to_a
149
+ assert_equal 5, results.length
150
+ end
151
+
152
+ def test_limit_exceptions
153
+ assert_raise ArgumentError do
154
+ cursor = @@coll.find().limit('not-an-integer')
155
+ end
156
+
157
+ cursor = @@coll.find()
158
+ firstResult = cursor.next_document
159
+ assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
160
+ cursor.limit(1)
161
+ end
162
+
163
+ cursor = @@coll.find()
164
+ cursor.close
165
+ assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
166
+ cursor.limit(1)
167
+ end
168
+ end
169
+
170
+ def test_skip
171
+ @@coll.remove
172
+
173
+ 10.times do |i|
174
+ @@coll.save("x" => i)
175
+ end
176
+ assert_equal 10, @@coll.find().count()
177
+
178
+ all_results = @@coll.find().to_a
179
+ skip_results = @@coll.find().skip(2).to_a
180
+ assert_equal 10, all_results.length
181
+ assert_equal 8, skip_results.length
182
+
183
+ assert_equal all_results.slice(2...10), skip_results
184
+ end
185
+
186
+ def test_skip_exceptions
187
+ assert_raise ArgumentError do
188
+ cursor = @@coll.find().skip('not-an-integer')
189
+ end
190
+
191
+ cursor = @@coll.find()
192
+ firstResult = cursor.next_document
193
+ assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
194
+ cursor.skip(1)
195
+ end
196
+
197
+ cursor = @@coll.find()
198
+ cursor.close
199
+ assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
200
+ cursor.skip(1)
201
+ end
202
+ end
203
+
204
+ def test_limit_skip_chaining
205
+ @@coll.remove
206
+ 10.times do |i|
207
+ @@coll.save("x" => i)
208
+ end
209
+
210
+ all_results = @@coll.find().to_a
211
+ limited_skip_results = @@coll.find().limit(5).skip(3).to_a
212
+
213
+ assert_equal all_results.slice(3...8), limited_skip_results
214
+ end
215
+
216
+ def test_close_no_query_sent
217
+ begin
218
+ cursor = @@coll.find('a' => 1)
219
+ cursor.close
220
+ assert cursor.closed?
221
+ rescue => ex
222
+ fail ex.to_s
223
+ end
224
+ end
225
+
226
+ def test_refill_via_get_more
227
+ assert_equal 1, @@coll.count
228
+ 1000.times { |i|
229
+ assert_equal 1 + i, @@coll.count
230
+ @@coll.insert('a' => i)
231
+ }
232
+
233
+ assert_equal 1001, @@coll.count
234
+ count = 0
235
+ @@coll.find.each { |obj|
236
+ count += obj['a']
237
+ }
238
+ assert_equal 1001, @@coll.count
239
+
240
+ # do the same thing again for debugging
241
+ assert_equal 1001, @@coll.count
242
+ count2 = 0
243
+ @@coll.find.each { |obj|
244
+ count2 += obj['a']
245
+ }
246
+ assert_equal 1001, @@coll.count
247
+
248
+ assert_equal count, count2
249
+ assert_equal 499501, count
250
+ end
251
+
252
+ def test_refill_via_get_more_alt_coll
253
+ coll = @@db.collection('test-alt-coll')
254
+ coll.remove
255
+ coll.insert('a' => 1) # collection not created until it's used
256
+ assert_equal 1, coll.count
257
+
258
+ 1000.times { |i|
259
+ assert_equal 1 + i, coll.count
260
+ coll.insert('a' => i)
261
+ }
262
+
263
+ assert_equal 1001, coll.count
264
+ count = 0
265
+ coll.find.each { |obj|
266
+ count += obj['a']
267
+ }
268
+ assert_equal 1001, coll.count
269
+
270
+ # do the same thing again for debugging
271
+ assert_equal 1001, coll.count
272
+ count2 = 0
273
+ coll.find.each { |obj|
274
+ count2 += obj['a']
275
+ }
276
+ assert_equal 1001, coll.count
277
+
278
+ assert_equal count, count2
279
+ assert_equal 499501, count
280
+ end
281
+
282
+ def test_close_after_query_sent
283
+ begin
284
+ cursor = @@coll.find('a' => 1)
285
+ cursor.next_document
286
+ cursor.close
287
+ assert cursor.closed?
288
+ rescue => ex
289
+ fail ex.to_s
290
+ end
291
+ end
292
+
293
+ def test_kill_cursors
294
+ @@coll.drop
295
+
296
+ client_cursors = @@db.command("cursorInfo" => 1)["clientCursors_size"]
297
+ by_location = @@db.command("cursorInfo" => 1)["byLocation_size"]
298
+
299
+ 10000.times do |i|
300
+ @@coll.insert("i" => i)
301
+ end
302
+
303
+ assert_equal(client_cursors,
304
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
305
+ assert_equal(by_location,
306
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
307
+
308
+ 10.times do |i|
309
+ @@coll.find_one()
310
+ end
311
+
312
+ assert_equal(client_cursors,
313
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
314
+ assert_equal(by_location,
315
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
316
+
317
+ 10.times do |i|
318
+ a = @@coll.find()
319
+ a.next_document
320
+ a.close()
321
+ end
322
+
323
+ assert_equal(client_cursors,
324
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
325
+ assert_equal(by_location,
326
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
327
+
328
+ a = @@coll.find()
329
+ a.next_document
330
+
331
+ assert_not_equal(client_cursors,
332
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
333
+ assert_not_equal(by_location,
334
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
335
+
336
+ a.close()
337
+
338
+ assert_equal(client_cursors,
339
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
340
+ assert_equal(by_location,
341
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
342
+
343
+ a = @@coll.find({}, :limit => 10).next_document
344
+
345
+ assert_equal(client_cursors,
346
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
347
+ assert_equal(by_location,
348
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
349
+
350
+ @@coll.find() do |cursor|
351
+ cursor.next_document
352
+ end
353
+
354
+ assert_equal(client_cursors,
355
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
356
+ assert_equal(by_location,
357
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
358
+
359
+ @@coll.find() { |cursor|
360
+ cursor.next_document
361
+ }
362
+
363
+ assert_equal(client_cursors,
364
+ @@db.command("cursorInfo" => 1)["clientCursors_size"])
365
+ assert_equal(by_location,
366
+ @@db.command("cursorInfo" => 1)["byLocation_size"])
367
+ end
368
+
369
+ def test_count_with_fields
370
+ @@coll.remove
371
+ @@coll.save("x" => 1)
372
+
373
+ if @@version < "1.1.3"
374
+ assert_equal(0, @@coll.find({}, :fields => ["a"]).count())
375
+ else
376
+ assert_equal(1, @@coll.find({}, :fields => ["a"]).count())
377
+ end
378
+ end
379
+ end