mongo 0.19.3 → 0.20

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 (65) hide show
  1. data/README.rdoc +7 -3
  2. data/Rakefile +16 -6
  3. data/bin/bson_benchmark.rb +2 -2
  4. data/examples/gridfs.rb +3 -2
  5. data/lib/mongo.rb +3 -26
  6. data/lib/mongo/collection.rb +69 -50
  7. data/lib/mongo/connection.rb +16 -41
  8. data/lib/mongo/cursor.rb +22 -32
  9. data/lib/mongo/db.rb +13 -5
  10. data/lib/mongo/exceptions.rb +11 -15
  11. data/lib/mongo/gridfs/grid.rb +14 -3
  12. data/lib/mongo/gridfs/grid_file_system.rb +28 -5
  13. data/lib/mongo/gridfs/grid_io.rb +42 -24
  14. data/lib/mongo/util/support.rb +13 -2
  15. data/mongo-ruby-driver.gemspec +3 -1
  16. data/test/collection_test.rb +62 -9
  17. data/test/connection_test.rb +21 -32
  18. data/test/conversions_test.rb +1 -1
  19. data/test/cursor_test.rb +2 -2
  20. data/test/db_api_test.rb +28 -27
  21. data/test/db_connection_test.rb +1 -1
  22. data/test/db_test.rb +23 -13
  23. data/test/grid_file_system_test.rb +30 -4
  24. data/test/grid_io_test.rb +14 -1
  25. data/test/grid_test.rb +59 -3
  26. data/test/test_helper.rb +4 -1
  27. data/test/threading/test_threading_large_pool.rb +1 -1
  28. data/test/threading_test.rb +1 -1
  29. data/test/unit/collection_test.rb +2 -2
  30. data/test/unit/cursor_test.rb +7 -0
  31. data/test/unit/db_test.rb +8 -8
  32. metadata +6 -46
  33. data/bin/gr.rb +0 -14
  34. data/lib/bson.rb +0 -46
  35. data/lib/bson/bson_c.rb +0 -20
  36. data/lib/bson/bson_ruby.rb +0 -601
  37. data/lib/bson/byte_buffer.rb +0 -224
  38. data/lib/bson/exceptions.rb +0 -39
  39. data/lib/bson/ordered_hash.rb +0 -140
  40. data/lib/bson/types/binary.rb +0 -54
  41. data/lib/bson/types/code.rb +0 -36
  42. data/lib/bson/types/dbref.rb +0 -40
  43. data/lib/bson/types/min_max_keys.rb +0 -58
  44. data/lib/bson/types/objectid.rb +0 -180
  45. data/lib/bson/types/regexp_of_holding.rb +0 -45
  46. data/lib/mongo/gridfs.rb +0 -29
  47. data/lib/mongo/gridfs/chunk.rb +0 -91
  48. data/lib/mongo/gridfs/grid_store.rb +0 -580
  49. data/lib/mongo/types/binary.rb +0 -52
  50. data/lib/mongo/types/code.rb +0 -36
  51. data/lib/mongo/types/dbref.rb +0 -40
  52. data/lib/mongo/types/min_max_keys.rb +0 -58
  53. data/lib/mongo/types/objectid.rb +0 -180
  54. data/lib/mongo/types/regexp_of_holding.rb +0 -45
  55. data/lib/mongo/util/bson_c.rb +0 -18
  56. data/lib/mongo/util/bson_ruby.rb +0 -606
  57. data/lib/mongo/util/byte_buffer.rb +0 -222
  58. data/lib/mongo/util/ordered_hash.rb +0 -140
  59. data/test/binary_test.rb +0 -15
  60. data/test/bson_test.rb +0 -459
  61. data/test/byte_buffer_test.rb +0 -81
  62. data/test/chunk_test.rb +0 -82
  63. data/test/grid_store_test.rb +0 -337
  64. data/test/objectid_test.rb +0 -125
  65. data/test/ordered_hash_test.rb +0 -172
@@ -30,10 +30,14 @@ Then you can install the mongo gem as follows:
30
30
 
31
31
  $ gem install mongo
32
32
 
33
- For a significant performance boost, you should also install the driver's C
33
+ The driver also requires the BSON gem:
34
+
35
+ $ gem install bson
36
+
37
+ And for a significant performance boost, you'll want to install the C extensions:
34
38
  extensions:
35
39
 
36
- $ gem install mongo_ext
40
+ $ gem install bson_ext
37
41
 
38
42
  === From the GitHub source
39
43
 
@@ -274,7 +278,7 @@ Random cursor fun facts:
274
278
  = Testing
275
279
 
276
280
  If you have the source code, you can run the tests. There's a separate rake task for testing with
277
- the mongo_ext C extension enabled.
281
+ the bson_ext C extension enabled.
278
282
 
279
283
  $ rake test:c
280
284
 
data/Rakefile CHANGED
@@ -27,6 +27,7 @@ namespace :test do
27
27
  ENV['C_EXT'] = 'TRUE'
28
28
  Rake::Task['test:unit'].invoke
29
29
  Rake::Task['test:functional'].invoke
30
+ Rake::Task['test:bson'].invoke
30
31
  Rake::Task['test:pooled_threading'].invoke
31
32
  Rake::Task['test:drop_databases'].invoke
32
33
  ENV['C_EXT'] = nil
@@ -37,10 +38,11 @@ namespace :test do
37
38
  ENV['C_EXT'] = nil
38
39
  Rake::Task['test:unit'].invoke
39
40
  Rake::Task['test:functional'].invoke
41
+ Rake::Task['test:bson'].invoke
40
42
  Rake::Task['test:pooled_threading'].invoke
41
43
  Rake::Task['test:drop_databases'].invoke
42
44
  end
43
-
45
+
44
46
  Rake::TestTask.new(:unit) do |t|
45
47
  t.test_files = FileList['test/unit/*_test.rb']
46
48
  t.verbose = true
@@ -91,13 +93,18 @@ namespace :test do
91
93
  t.verbose = true
92
94
  end
93
95
 
96
+ Rake::TestTask.new(:bson) do |t|
97
+ t.test_files = FileList['test/mongo_bson/*_test.rb']
98
+ t.verbose = true
99
+ end
100
+
94
101
  task :drop_databases do |t|
95
102
  puts "Dropping test database..."
96
- require File.join(File.dirname(__FILE__), 'lib', 'mongo')
103
+ require File.join(File.dirname(__FILE__), 'test', 'test_helper')
97
104
  include Mongo
98
105
  con = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
99
106
  ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
100
- con.drop_database('ruby-mongo-test')
107
+ con.drop_database(MONGO_TEST_DB)
101
108
  end
102
109
  end
103
110
 
@@ -134,9 +141,12 @@ namespace :gem do
134
141
 
135
142
  desc "Install the optional c extensions"
136
143
  task :install_extensions do
137
- sh "gem build mongo-extensions.gemspec"
138
- sh "gem install mongo_ext-*.gem"
139
- sh "rm mongo_ext-*.gem"
144
+ sh "gem build bson.gemspec"
145
+ sh "gem build bson_ext.gemspec"
146
+ sh "gem install bson-*.gem"
147
+ sh "gem install bson_ext-*.gem"
148
+ sh "rm bson-*.gem"
149
+ sh "rm bson_ext-*.gem"
140
150
  end
141
151
 
142
152
  end
@@ -9,9 +9,9 @@ TRIALS = 100000
9
9
 
10
10
  def encode(doc)
11
11
  t0 = Time.new
12
- b = BSON.new
12
+ b = Mongo::BSON_CODER.new
13
13
  TRIALS.times { |i|
14
- b = BSON.new
14
+ b = Mongo::BSON_CODER.new
15
15
  b.serialize doc
16
16
  }
17
17
  print "took: #{Time.now.to_f - t0.to_f}\n"
@@ -17,7 +17,7 @@ data = "hello, world!"
17
17
  grid = Grid.new(db)
18
18
 
19
19
  # Write a new file. data can be a string or an io object responding to #read.
20
- id = grid.put(data, 'hello.txt')
20
+ id = grid.put(data, :filename => 'hello.txt')
21
21
 
22
22
  # Read it and print out the contents
23
23
  file = grid.get(id)
@@ -33,11 +33,12 @@ rescue => e
33
33
  end
34
34
 
35
35
  # Metadata
36
- id = grid.put(data, 'hello.txt', :content_type => 'text/plain', :metadata => {'name' => 'hello'})
36
+ id = grid.put(data, :filename => 'hello.txt', :content_type => 'text/plain', :metadata => {'name' => 'hello'})
37
37
  file = grid.get(id)
38
38
 
39
39
  p file.content_type
40
40
  p file.metadata.inspect
41
41
  p file.chunk_size
42
42
  p file.file_length
43
+ p file.filename
43
44
  p file.data
@@ -1,23 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
 
3
3
  module Mongo
4
- VERSION = "0.19.3"
5
- end
6
-
7
- begin
8
- # Need this for running test with and without c ext in Ruby 1.9.
9
- raise LoadError if ENV['TEST_MODE'] && !ENV['C_EXT']
10
- require 'mongo_ext/cbson'
11
- raise LoadError unless defined?(CBson::VERSION) && CBson::VERSION == Mongo::VERSION
12
- require 'mongo/util/bson_c'
13
- BSON = BSON_C
14
- rescue LoadError
15
- require 'mongo/util/bson_ruby'
16
- BSON = BSON_RUBY
17
- warn "\n**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance."
18
- warn " You can install the extension as follows:\n gem install mongo_ext\n"
19
- warn " If you continue to receive this message after installing, make sure that the"
20
- warn " mongo_ext gem is in your load path and that the mongo_ext and mongo gems are of the same version.\n"
4
+ VERSION = "0.20"
21
5
  end
22
6
 
23
7
  module Mongo
@@ -41,25 +25,18 @@ module Mongo
41
25
 
42
26
  end
43
27
 
44
- require 'mongo/types/binary'
45
- require 'mongo/types/code'
46
- require 'mongo/types/dbref'
47
- require 'mongo/types/objectid'
48
- require 'mongo/types/regexp_of_holding'
49
- require 'mongo/types/min_max_keys'
28
+ require 'bson'
50
29
 
30
+ require 'mongo/util/conversions'
51
31
  require 'mongo/util/support'
52
32
  require 'mongo/util/core_ext'
53
- require 'mongo/util/conversions'
54
33
  require 'mongo/util/server_version'
55
- require 'mongo/util/bson_ruby'
56
34
 
57
35
  require 'mongo/collection'
58
36
  require 'mongo/connection'
59
37
  require 'mongo/cursor'
60
38
  require 'mongo/db'
61
39
  require 'mongo/exceptions'
62
- require 'mongo/gridfs'
63
40
  require 'mongo/gridfs/grid'
64
41
  require 'mongo/gridfs/grid_io'
65
42
  require 'mongo/gridfs/grid_file_system'
@@ -26,7 +26,7 @@ module Mongo
26
26
  # @param [DB] db a MongoDB database instance.
27
27
  # @param [String, Symbol] name the name of the collection.
28
28
  #
29
- # @raise [InvalidName]
29
+ # @raise [InvalidNSName]
30
30
  # if collection name is empty, contains '$', or starts or ends with '.'
31
31
  #
32
32
  # @raise [TypeError]
@@ -45,18 +45,18 @@ module Mongo
45
45
  name = name.to_s
46
46
 
47
47
  if name.empty? or name.include? ".."
48
- raise InvalidName, "collection names cannot be empty"
48
+ raise Mongo::InvalidNSName, "collection names cannot be empty"
49
49
  end
50
50
  if name.include? "$"
51
- raise InvalidName, "collection names must not contain '$'" unless name =~ /((^\$cmd)|(oplog\.\$main))/
51
+ raise Mongo::InvalidNSName, "collection names must not contain '$'" unless name =~ /((^\$cmd)|(oplog\.\$main))/
52
52
  end
53
53
  if name.match(/^\./) or name.match(/\.$/)
54
- raise InvalidName, "collection names must not start or end with '.'"
54
+ raise Mongo::InvalidNSName, "collection names must not start or end with '.'"
55
55
  end
56
56
 
57
57
  @db, @name = db, name
58
58
  @connection = @db.connection
59
- @pk_factory = pk_factory || ObjectID
59
+ @pk_factory = pk_factory || BSON::ObjectID
60
60
  @hint = nil
61
61
  end
62
62
 
@@ -66,7 +66,7 @@ module Mongo
66
66
  # @param [String] name
67
67
  # the collection to return
68
68
  #
69
- # @raise [InvalidName]
69
+ # @raise [Mongo::InvalidNSName]
70
70
  # if passed an invalid collection name
71
71
  #
72
72
  # @return [Collection]
@@ -107,9 +107,11 @@ module Mongo
107
107
  # a document specifying elements which must be present for a
108
108
  # document to be included in the result set.
109
109
  #
110
- # @option opts [Array] :fields field names that should be returned in the result
110
+ # @option opts [Array, Hash] :fields field names that should be returned in the result
111
111
  # set ("_id" will always be included). By limiting results to a certain subset of fields,
112
- # you can cut down on network traffic and decoding time.
112
+ # you can cut down on network traffic and decoding time. If using a Hash, keys should be field
113
+ # names and values should be either 1 or 0, depending on whether you want to include or exclude
114
+ # the given field.
113
115
  # @option opts [Integer] :skip number of documents to skip from the beginning of the result set
114
116
  # @option opts [Integer] :limit maximum number of documents to return
115
117
  # @option opts [Array] :sort an array of [key, direction] pairs to sort by. Direction should
@@ -179,7 +181,7 @@ module Mongo
179
181
  spec = case spec_or_object_id
180
182
  when nil
181
183
  {}
182
- when ObjectID
184
+ when BSON::ObjectID
183
185
  {:_id => spec_or_object_id}
184
186
  when Hash
185
187
  spec_or_object_id
@@ -258,10 +260,10 @@ module Mongo
258
260
  # @core remove remove-instance_method
259
261
  def remove(selector={}, opts={})
260
262
  # Initial byte is 0.
261
- message = ByteBuffer.new([0, 0, 0, 0])
262
- BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
263
+ message = BSON::ByteBuffer.new([0, 0, 0, 0])
264
+ BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
263
265
  message.put_int(0)
264
- message.put_array(BSON.serialize(selector, false, true).to_a)
266
+ message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a)
265
267
 
266
268
  if opts[:safe]
267
269
  @connection.send_message_with_safe_check(Mongo::Constants::OP_DELETE, message, @db.name,
@@ -297,14 +299,14 @@ module Mongo
297
299
  # @core update update-instance_method
298
300
  def update(selector, document, options={})
299
301
  # Initial byte is 0.
300
- message = ByteBuffer.new([0, 0, 0, 0])
301
- BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
302
+ message = BSON::ByteBuffer.new([0, 0, 0, 0])
303
+ BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
302
304
  update_options = 0
303
305
  update_options += 1 if options[:upsert]
304
306
  update_options += 2 if options[:multi]
305
307
  message.put_int(update_options)
306
- message.put_array(BSON.serialize(selector, false, true).to_a)
307
- message.put_array(BSON.serialize(document, false, true).to_a)
308
+ message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a)
309
+ message.put_array(BSON::BSON_CODER.serialize(document, false, true).to_a)
308
310
  if options[:safe]
309
311
  @connection.send_message_with_safe_check(Mongo::Constants::OP_UPDATE, message, @db.name,
310
312
  "#{@db.name}['#{@name}'].update(#{selector.inspect}, #{document.inspect})")
@@ -403,7 +405,6 @@ module Mongo
403
405
 
404
406
  # Note: calling drop_indexes with no args will drop them all.
405
407
  @db.drop_index(@name, '*')
406
-
407
408
  end
408
409
 
409
410
  # Drop the entire collection. USE WITH CAUTION.
@@ -411,17 +412,41 @@ module Mongo
411
412
  @db.drop_collection(@name)
412
413
  end
413
414
 
415
+
416
+ # Atomically update and return a document using MongoDB's findAndModify command. (MongoDB > 1.3.0)
417
+ #
418
+ # @option opts [Hash] :update (nil) the update operation to perform on the matched document.
419
+ # @option opts [Hash] :query ({}) a query selector document for matching the desired document.
420
+ # @option opts [Array, String, OrderedHash] :sort ({}) specify a sort option for the query using any
421
+ # of the sort options available for Cursor#sort. Sort order is important if the query will be matching
422
+ # multiple documents since only the first matching document will be updated and returned.
423
+ # @option opts [Boolean] :remove (false) If true, removes the the returned document from the collection.
424
+ # @option opts [Boolean] :new (false) If true, returns the updated document; otherwise, returns the document
425
+ # prior to update.
426
+ #
427
+ # @return [Hash] the matched document.
428
+ #
429
+ # @core findandmodify find_and_modify-instance_method
430
+ def find_and_modify(opts={})
431
+ cmd = OrderedHash.new
432
+ cmd[:findandmodify] = @name
433
+ cmd.merge!(opts)
434
+ cmd[:sort] = Mongo::Support.format_order_clause(opts[:sort]) if opts[:sort]
435
+
436
+ @db.command(cmd, false, true)['value']
437
+ end
438
+
414
439
  # Perform a map/reduce operation on the current collection.
415
440
  #
416
- # @param [String, Code] map a map function, written in JavaScript.
417
- # @param [String, Code] reduce a reduce function, written in JavaScript.
441
+ # @param [String, BSON::Code] map a map function, written in JavaScript.
442
+ # @param [String, BSON::Code] reduce a reduce function, written in JavaScript.
418
443
  #
419
444
  # @option opts [Hash] :query ({}) a query selector document, like what's passed to #find, to limit
420
445
  # the operation to a subset of the collection.
421
446
  # @option opts [Array] :sort ([]) an array of [key, direction] pairs to sort by. Direction should
422
447
  # be specified as Mongo::ASCENDING (or :ascending / :asc) or Mongo::DESCENDING (or :descending / :desc)
423
448
  # @option opts [Integer] :limit (nil) if passing a query, number of objects to return from the collection.
424
- # @option opts [String, Code] :finalize (nil) a javascript function to apply to the result set after the
449
+ # @option opts [String, BSON::Code] :finalize (nil) a javascript function to apply to the result set after the
425
450
  # map/reduce operation has finished.
426
451
  # @option opts [String] :out (nil) the name of the output collection. If specified, the collection will not be treated as temporary.
427
452
  # @option opts [Boolean] :keeptemp (false) if true, the generated collection will be persisted. default is false.
@@ -433,8 +458,8 @@ module Mongo
433
458
  #
434
459
  # @core mapreduce map_reduce-instance_method
435
460
  def map_reduce(map, reduce, opts={})
436
- map = Code.new(map) unless map.is_a?(Code)
437
- reduce = Code.new(reduce) unless reduce.is_a?(Code)
461
+ map = BSON::Code.new(map) unless map.is_a?(BSON::Code)
462
+ reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code)
438
463
 
439
464
  hash = OrderedHash.new
440
465
  hash['mapreduce'] = self.name
@@ -452,28 +477,18 @@ module Mongo
452
477
 
453
478
  # Perform a group aggregation.
454
479
  #
455
- # @param [Array, String, Code, Nil] :key either 1) an array of fields to group by,
480
+ # @param [Array, String, BSON::Code, Nil] :key either 1) an array of fields to group by,
456
481
  # 2) a javascript function to generate the key object, or 3) nil.
457
482
  # @param [Hash] condition an optional document specifying a query to limit the documents over which group is run.
458
483
  # @param [Hash] initial initial value of the aggregation counter object
459
- # @param [String, Code] reduce aggregation function, in JavaScript
460
- # @param [String, Code] finalize :: optional. a JavaScript function that receives and modifies
484
+ # @param [String, BSON::Code] reduce aggregation function, in JavaScript
485
+ # @param [String, BSON::Code] finalize :: optional. a JavaScript function that receives and modifies
461
486
  # each of the resultant grouped objects. Available only when group is run
462
487
  # with command set to true.
463
- # @param [Nil] deprecated this param in a placeholder for a deprecated param. It will be removed
464
- # in the next release.
465
488
  #
466
489
  # @return [Array] the grouped items.
467
- def group(key, condition, initial, reduce, finalize=nil, deprecated=nil)
468
-
469
- # Warn of changed API post eval deprecation.
470
- if finalize == true || finalize == false || deprecated
471
- warn "The API for Collection#group has changed. 'Finalize' is now the fifth parameter, " +
472
- "since it's no longer necessary to specify whether #group is run as a command. " +
473
- "See http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method for details."
474
- end
475
-
476
- reduce = Code.new(reduce) unless reduce.is_a?(Code)
490
+ def group(key, condition, initial, reduce, finalize=nil)
491
+ reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code)
477
492
 
478
493
  group_command = {
479
494
  "group" => {
@@ -491,17 +506,14 @@ module Mongo
491
506
  key.each { |k| key_value[k] = 1 }
492
507
  else
493
508
  key_type = "$keyf"
494
- key_value = key.is_a?(Code) ? key : Code.new(key)
509
+ key_value = key.is_a?(BSON::Code) ? key : BSON::Code.new(key)
495
510
  end
496
511
 
497
512
  group_command["group"][key_type] = key_value
498
513
  end
499
514
 
500
- # only add finalize if specified
501
- # check to see if users have sent the finalizer as the last argument.
502
- finalize = deprecated if deprecated.is_a?(String) || deprecated.is_a?(Code)
503
- finalize = Code.new(finalize) if finalize.is_a?(String)
504
- if finalize.is_a?(Code)
515
+ finalize = BSON::Code.new(finalize) if finalize.is_a?(String)
516
+ if finalize.is_a?(BSON::Code)
505
517
  group_command['group']['finalize'] = finalize
506
518
  end
507
519
 
@@ -556,7 +568,7 @@ module Mongo
556
568
  #
557
569
  # @param [String] new_name the new name for this collection
558
570
  #
559
- # @raise [InvalidName] if +new_name+ is an invalid collection name.
571
+ # @raise [Mongo::InvalidNSName] if +new_name+ is an invalid collection name.
560
572
  def rename(new_name)
561
573
  case new_name
562
574
  when Symbol, String
@@ -567,13 +579,13 @@ module Mongo
567
579
  new_name = new_name.to_s
568
580
 
569
581
  if new_name.empty? or new_name.include? ".."
570
- raise InvalidName, "collection names cannot be empty"
582
+ raise Mongo::InvalidNSName, "collection names cannot be empty"
571
583
  end
572
584
  if new_name.include? "$"
573
- raise InvalidName, "collection names must not contain '$'"
585
+ raise Mongo::InvalidNSName, "collection names must not contain '$'"
574
586
  end
575
587
  if new_name.match(/^\./) or new_name.match(/\.$/)
576
- raise InvalidName, "collection names must not start or end with '.'"
588
+ raise Mongo::InvalidNSName, "collection names must not start or end with '.'"
577
589
  end
578
590
 
579
591
  @db.rename_collection(@name, new_name)
@@ -596,6 +608,13 @@ module Mongo
596
608
  @db.collections_info(@name).next_document['options']
597
609
  end
598
610
 
611
+ # Return stats on the collection. Uses MongoDB's collstats command.
612
+ #
613
+ # @return [Hash]
614
+ def stats
615
+ @db.command({:collstats => @name})
616
+ end
617
+
599
618
  # Get the number of documents in this collection.
600
619
  #
601
620
  # @return [Integer]
@@ -629,9 +648,9 @@ module Mongo
629
648
  # +check_keys+ setting.
630
649
  def insert_documents(documents, collection_name=@name, check_keys=true, safe=false)
631
650
  # Initial byte is 0.
632
- message = ByteBuffer.new([0, 0, 0, 0])
633
- BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}")
634
- documents.each { |doc| message.put_array(BSON.serialize(doc, check_keys, true).to_a) }
651
+ message = BSON::ByteBuffer.new([0, 0, 0, 0])
652
+ BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}")
653
+ documents.each { |doc| message.put_array(BSON::BSON_CODER.serialize(doc, check_keys, true).to_a) }
635
654
  if safe
636
655
  @connection.send_message_with_safe_check(Mongo::Constants::OP_INSERT, message, @db.name,
637
656
  "#{@db.name}['#{collection_name}'].insert(#{documents.inspect})")
@@ -44,27 +44,21 @@ module Mongo
44
44
  # If connecting to just one server, you may specify whether connection to slave is permitted.
45
45
  # In all cases, the default host is "localhost" and the default port is 27017.
46
46
  #
47
- # When specifying a pair, +pair_or_host+, is a hash with two keys: :left and :right. Each key maps to either
48
- # * a server name, in which case port is 27017,
49
- # * a port number, in which case the server is "localhost", or
50
- # * an array containing [server_name, port_number]
47
+ # To specify a pair, use Connection.paired.
51
48
  #
52
49
  # Note that there are a few issues when using connection pooling with Ruby 1.9 on Windows. These
53
50
  # should be resolved in the next release.
54
51
  #
55
- # @param [String, Hash] pair_or_host See explanation above.
56
- # @param [Integer] port specify a port number here if only one host is being specified. Leave nil if
57
- # specifying a pair of servers in +pair_or_host+.
52
+ # @param [String, Hash] host.
53
+ # @param [Integer] port specify a port number here if only one host is being specified.
58
54
  #
59
55
  # @option options [Boolean] :slave_ok (false) Must be set to +true+ when connecting
60
56
  # to a single, slave node.
61
57
  # @option options [Logger, #debug] :logger (nil) Logger instance to receive driver operation log.
62
- # @option options [Boolean] :auto_reconnect DEPRECATED. See http://www.mongodb.org/display/DOCS/Replica+Pairs+in+Ruby
63
58
  # @option options [Integer] :pool_size (1) The maximum number of socket connections that can be opened to the database.
64
59
  # @option options [Float] :timeout (5.0) When all of the connections to the pool are checked out,
65
60
  # this is the number of seconds to wait for a new connection to be released before throwing an exception.
66
61
  #
67
- #
68
62
  # @example localhost, 27017
69
63
  # Connection.new
70
64
  #
@@ -77,25 +71,16 @@ module Mongo
77
71
  # @example localhost, 3000, where this node may be a slave
78
72
  # Connection.new("localhost", 3000, :slave_ok => true)
79
73
  #
80
- # @example DEPRECATED. To initialize a paired connection, use Connection.paired instead.
81
- # Connection.new({:left => ["db1.example.com", 27017],
82
- # :right => ["db2.example.com", 27017]})
83
- #
84
- # @example DEPRECATED. To initialize a paired connection, use Connection.paired instead.
85
- # Connection.new({:left => ["db1.example.com", 27017],
86
- # :right => ["db2.example.com", 27017]}, nil,
87
- # :pool_size => 20, :timeout => 5)
88
- #
89
74
  # @see http://www.mongodb.org/display/DOCS/Replica+Pairs+in+Ruby Replica pairs in Ruby
90
75
  #
91
76
  # @core connections
92
- def initialize(pair_or_host=nil, port=nil, options={})
77
+ def initialize(host=nil, port=nil, options={})
93
78
  @auths = []
94
79
 
95
80
  if block_given?
96
81
  @nodes = yield self
97
82
  else
98
- @nodes = format_pair(pair_or_host, port)
83
+ @nodes = format_pair(host, port)
99
84
  end
100
85
 
101
86
  # Host and port of current master.
@@ -118,10 +103,6 @@ module Mongo
118
103
  @sockets = []
119
104
  @checked_out = []
120
105
 
121
- if options[:auto_reconnect]
122
- warn(":auto_reconnect is deprecated. see http://www.mongodb.org/display/DOCS/Replica+Pairs+in+Ruby")
123
- end
124
-
125
106
  # slave_ok can be true only if one node is specified
126
107
  @slave_ok = options[:slave_ok] && @nodes.length == 1
127
108
  @logger = options[:logger] || nil
@@ -344,7 +325,7 @@ module Mongo
344
325
  # Send a message to MongoDB, adding the necessary headers.
345
326
  #
346
327
  # @param [Integer] operation a MongoDB opcode.
347
- # @param [ByteBuffer] message a message to send to the database.
328
+ # @param [BSON::ByteBuffer] message a message to send to the database.
348
329
  # @param [String] log_message text version of +message+ for logging.
349
330
  #
350
331
  # @return [True]
@@ -363,7 +344,7 @@ module Mongo
363
344
  # an exception if the operation has failed.
364
345
  #
365
346
  # @param [Integer] operation a MongoDB opcode.
366
- # @param [ByteBuffer] message a message to send to the database.
347
+ # @param [BSON::ByteBuffer] message a message to send to the database.
367
348
  # @param [String] db_name the name of the database. used on call to get_last_error.
368
349
  # @param [String] log_message text version of +message+ for logging.
369
350
  #
@@ -394,7 +375,7 @@ module Mongo
394
375
  # Sends a message to the database and waits for the response.
395
376
  #
396
377
  # @param [Integer] operation a MongoDB opcode.
397
- # @param [ByteBuffer] message a message to send to the database.
378
+ # @param [BSON::ByteBuffer] message a message to send to the database.
398
379
  # @param [String] log_message text version of +message+ for logging.
399
380
  # @param [Socket] socket a socket to use in lieu of checking out a new one.
400
381
  #
@@ -479,12 +460,6 @@ module Mongo
479
460
  case pair_or_host
480
461
  when String
481
462
  [[pair_or_host, port ? port.to_i : DEFAULT_PORT]]
482
- when Hash
483
- warn "Initializing a paired connection with Connection.new is deprecated. Use Connection.pair instead."
484
- connections = []
485
- connections << pair_val_to_connection(pair_or_host[:left])
486
- connections << pair_val_to_connection(pair_or_host[:right])
487
- connections
488
463
  when nil
489
464
  [['localhost', DEFAULT_PORT]]
490
465
  end
@@ -625,7 +600,7 @@ module Mongo
625
600
  end
626
601
 
627
602
  def receive_header(sock)
628
- header = ByteBuffer.new
603
+ header = BSON::ByteBuffer.new
629
604
  header.put_array(receive_message_on_socket(16, sock).unpack("C*"))
630
605
  unless header.size == STANDARD_HEADER_SIZE
631
606
  raise "Short read for DB response header: " +
@@ -639,7 +614,7 @@ module Mongo
639
614
  end
640
615
 
641
616
  def receive_response_header(sock)
642
- header_buf = ByteBuffer.new
617
+ header_buf = BSON::ByteBuffer.new
643
618
  header_buf.put_array(receive_message_on_socket(RESPONSE_HEADER_SIZE, sock).unpack("C*"))
644
619
  if header_buf.length != RESPONSE_HEADER_SIZE
645
620
  raise "Short read for DB response header; " +
@@ -657,32 +632,32 @@ module Mongo
657
632
  docs = []
658
633
  number_remaining = number_received
659
634
  while number_remaining > 0 do
660
- buf = ByteBuffer.new
635
+ buf = BSON::ByteBuffer.new
661
636
  buf.put_array(receive_message_on_socket(4, sock).unpack("C*"))
662
637
  buf.rewind
663
638
  size = buf.get_int
664
639
  buf.put_array(receive_message_on_socket(size - 4, sock).unpack("C*"), 4)
665
640
  number_remaining -= 1
666
641
  buf.rewind
667
- docs << BSON.deserialize(buf)
642
+ docs << BSON::BSON_CODER.deserialize(buf)
668
643
  end
669
644
  [docs, number_received, cursor_id]
670
645
  end
671
646
 
672
647
  def last_error_message(db_name)
673
- message = ByteBuffer.new
648
+ message = BSON::ByteBuffer.new
674
649
  message.put_int(0)
675
- BSON_RUBY.serialize_cstr(message, "#{db_name}.$cmd")
650
+ BSON::BSON_RUBY.serialize_cstr(message, "#{db_name}.$cmd")
676
651
  message.put_int(0)
677
652
  message.put_int(-1)
678
- message.put_array(BSON.serialize({:getlasterror => 1}, false).unpack("C*"))
653
+ message.put_array(BSON::BSON_CODER.serialize({:getlasterror => 1}, false).unpack("C*"))
679
654
  add_message_headers(Mongo::Constants::OP_QUERY, message)
680
655
  end
681
656
 
682
657
  # Prepares a message for transmission to MongoDB by
683
658
  # constructing a valid message header.
684
659
  def add_message_headers(operation, message)
685
- headers = ByteBuffer.new
660
+ headers = BSON::ByteBuffer.new
686
661
 
687
662
  # Message size.
688
663
  headers.put_int(16 + message.size)