mongo 1.0.8 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/bin/insert.rb +35 -0
  2. data/bin/mongo_console +21 -0
  3. data/bin/oid.rb +13 -0
  4. data/lib/mongo.rb +1 -1
  5. data/lib/mongo/collection.rb +19 -19
  6. data/lib/mongo/connection.rb +91 -51
  7. data/lib/mongo/cursor.rb +59 -23
  8. data/lib/mongo/util/core_ext.rb +15 -4
  9. data/mongo.gemspec +3 -0
  10. data/test/auxillary/1.4_features.rb +1 -1
  11. data/test/auxillary/authentication_test.rb +1 -1
  12. data/test/auxillary/autoreconnect_test.rb +1 -1
  13. data/test/auxillary/slave_connection_test.rb +1 -1
  14. data/test/collection_test.rb +2 -1
  15. data/test/connection_test.rb +1 -1
  16. data/test/conversions_test.rb +1 -1
  17. data/test/cursor_fail_test.rb +1 -1
  18. data/test/cursor_message_test.rb +22 -10
  19. data/test/cursor_test.rb +5 -4
  20. data/test/db_api_test.rb +1 -1
  21. data/test/db_connection_test.rb +2 -2
  22. data/test/db_test.rb +3 -4
  23. data/test/grid_file_system_test.rb +1 -1
  24. data/test/grid_io_test.rb +1 -1
  25. data/test/grid_test.rb +2 -2
  26. data/test/replica_pairs/count_test.rb +1 -1
  27. data/test/replica_pairs/insert_test.rb +1 -1
  28. data/test/replica_pairs/pooled_insert_test.rb +1 -1
  29. data/test/replica_pairs/query_test.rb +1 -1
  30. data/test/replica_sets/count_test.rb +1 -1
  31. data/test/replica_sets/insert_test.rb +1 -1
  32. data/test/replica_sets/node_type_test.rb +1 -1
  33. data/test/replica_sets/pooled_insert_test.rb +1 -1
  34. data/test/replica_sets/query_test.rb +1 -1
  35. data/test/replica_sets/replication_ack_test.rb +1 -1
  36. data/test/support_test.rb +1 -1
  37. data/test/threading_test.rb +1 -1
  38. data/test/unit/collection_test.rb +21 -7
  39. data/test/unit/connection_test.rb +1 -1
  40. data/test/unit/cursor_test.rb +5 -3
  41. data/test/unit/db_test.rb +2 -2
  42. metadata +9 -6
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'mongo'
5
+ require 'date'
6
+ require 'logger'
7
+ include Mongo
8
+
9
+ @logger = Logger.new(File.open("m.log", "w"))
10
+ require 'ruby-prof'
11
+
12
+ num_inserts = 100000
13
+ if( ARGV.size() > 0 ) then
14
+ num_inserts = ARGV[0].to_i()
15
+ end
16
+ db = Connection.new('localhost', 27017).db('sample-db')
17
+ coll = db.collection('test')
18
+ coll.remove()
19
+ sleep(2)
20
+
21
+ puts "Testing #{num_inserts} inserts"
22
+ start = Time.now()
23
+
24
+ #RubyProf.start
25
+ num_inserts.times do |i|
26
+ coll.insert({'a' => i+1})
27
+ end
28
+ #result = RubyProf.stop
29
+ ending = Time.now
30
+ total = ending - start
31
+
32
+ puts "Took #{total} seconds, meaning #{num_inserts / total} per second."
33
+
34
+ #printer = RubyProf::FlatPrinter.new(result)
35
+ #printer.print(STDOUT, 0)
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ org_argv = ARGV.dup
3
+ ARGV.clear
4
+
5
+ require 'irb'
6
+
7
+ $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
8
+ require 'mongo'
9
+
10
+ include Mongo
11
+
12
+ host = org_argv[0] || ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
13
+ port = org_argv[1] || ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
14
+ dbnm = org_argv[2] || ENV['MONGO_RUBY_DRIVER_DB'] || 'ruby-mongo-console'
15
+
16
+ puts "Connecting to #{host}:#{port} (CONN) on with database #{dbnm} (DB)"
17
+ CONN = Connection.new(host, port)
18
+ DB = CONN.db(dbnm)
19
+
20
+ puts "Starting IRB session..."
21
+ IRB.start(__FILE__)
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'mongo'
3
+
4
+ TRIALS = 100000
5
+
6
+ t0 = Time.now
7
+
8
+ TRIALS.times do
9
+ BSON::BSON_CODER.serialize(:_id => BSON::ObjectId.new)
10
+ end
11
+ t1 = Time.now
12
+
13
+ puts "Took #{t1 - t0} seconds"
@@ -3,7 +3,7 @@
3
3
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
 
5
5
  module Mongo
6
- VERSION = "1.0.8"
6
+ VERSION = "1.0.9"
7
7
  end
8
8
 
9
9
  module Mongo
@@ -58,6 +58,7 @@ module Mongo
58
58
 
59
59
  @db, @name = db, name
60
60
  @connection = @db.connection
61
+ @logger = @connection.logger
61
62
  @pk_factory = pk_factory || BSON::ObjectId
62
63
  @hint = nil
63
64
  end
@@ -283,20 +284,19 @@ module Mongo
283
284
  # @core remove remove-instance_method
284
285
  def remove(selector={}, opts={})
285
286
  # Initial byte is 0.
286
- message = BSON::ByteBuffer.new([0, 0, 0, 0])
287
+ message = BSON::ByteBuffer.new("\0\0\0\0")
287
288
  BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
288
289
  message.put_int(0)
289
- message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a)
290
+ message.put_binary(BSON::BSON_CODER.serialize(selector, false, true).to_s)
290
291
 
292
+ @logger.debug("MONGODB #{@db.name}['#{@name}'].remove(#{selector.inspect})") if @logger
291
293
  if opts[:safe]
292
- @connection.send_message_with_safe_check(Mongo::Constants::OP_DELETE, message, @db.name,
293
- "#{@db.name}['#{@name}'].remove(#{selector.inspect})", opts[:safe])
294
+ @connection.send_message_with_safe_check(Mongo::Constants::OP_DELETE, message, @db.name, nil, opts[:safe])
294
295
  # the return value of send_message_with_safe_check isn't actually meaningful --
295
296
  # only the fact that it didn't raise an error is -- so just return true
296
297
  true
297
298
  else
298
- @connection.send_message(Mongo::Constants::OP_DELETE, message,
299
- "#{@db.name}['#{@name}'].remove(#{selector.inspect})")
299
+ @connection.send_message(Mongo::Constants::OP_DELETE, message)
300
300
  end
301
301
  end
302
302
 
@@ -322,20 +322,19 @@ module Mongo
322
322
  # @core update update-instance_method
323
323
  def update(selector, document, options={})
324
324
  # Initial byte is 0.
325
- message = BSON::ByteBuffer.new([0, 0, 0, 0])
325
+ message = BSON::ByteBuffer.new("\0\0\0\0")
326
326
  BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
327
327
  update_options = 0
328
328
  update_options += 1 if options[:upsert]
329
329
  update_options += 2 if options[:multi]
330
330
  message.put_int(update_options)
331
- message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a)
332
- message.put_array(BSON::BSON_CODER.serialize(document, false, true).to_a)
331
+ message.put_binary(BSON::BSON_CODER.serialize(selector, false, true).to_s)
332
+ message.put_binary(BSON::BSON_CODER.serialize(document, false, true).to_s)
333
+ @logger.debug("MONGODB #{@db.name}['#{@name}'].update(#{selector.inspect}, #{document.inspect})") if @logger
333
334
  if options[:safe]
334
- @connection.send_message_with_safe_check(Mongo::Constants::OP_UPDATE, message, @db.name,
335
- "#{@db.name}['#{@name}'].update(#{selector.inspect}, #{document.inspect})", options[:safe])
335
+ @connection.send_message_with_safe_check(Mongo::Constants::OP_UPDATE, message, @db.name, nil, options[:safe])
336
336
  else
337
- @connection.send_message(Mongo::Constants::OP_UPDATE, message,
338
- "#{@db.name}['#{@name}'].update(#{selector.inspect}, #{document.inspect})")
337
+ @connection.send_message(Mongo::Constants::OP_UPDATE, message, nil)
339
338
  end
340
339
  end
341
340
 
@@ -680,17 +679,18 @@ module Mongo
680
679
  # +check_keys+ setting.
681
680
  def insert_documents(documents, collection_name=@name, check_keys=true, safe=false)
682
681
  # Initial byte is 0.
683
- message = BSON::ByteBuffer.new([0, 0, 0, 0])
682
+ message = BSON::ByteBuffer.new("\0\0\0\0")
684
683
  BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}")
685
- documents.each { |doc| message.put_array(BSON::BSON_CODER.serialize(doc, check_keys, true).to_a) }
684
+ documents.each do |doc|
685
+ message.put_binary(BSON::BSON_CODER.serialize(doc, check_keys, true).to_s)
686
+ end
686
687
  raise InvalidOperation, "Exceded maximum insert size of 16,000,000 bytes" if message.size > 16_000_000
687
688
 
689
+ @logger.debug("MONGODB #{@db.name}['#{collection_name}'].insert(#{documents.inspect})") if @logger
688
690
  if safe
689
- @connection.send_message_with_safe_check(Mongo::Constants::OP_INSERT, message, @db.name,
690
- "#{@db.name}['#{collection_name}'].insert(#{documents.inspect})", safe)
691
+ @connection.send_message_with_safe_check(Mongo::Constants::OP_INSERT, message, @db.name, nil, safe)
691
692
  else
692
- @connection.send_message(Mongo::Constants::OP_INSERT, message,
693
- "#{@db.name}['#{collection_name}'].insert(#{documents.inspect})")
693
+ @connection.send_message(Mongo::Constants::OP_INSERT, message, nil)
694
694
  end
695
695
  documents.collect { |o| o[:_id] || o['_id'] }
696
696
  end
@@ -277,8 +277,8 @@ module Mongo
277
277
  # @return [Hash]
278
278
  def database_info
279
279
  doc = self['admin'].command({:listDatabases => 1})
280
- returning({}) do |info|
281
- doc['databases'].each { |db| info[db['name']] = db['sizeOnDisk'].to_i }
280
+ doc['databases'].each_with_object({}) do |db, info|
281
+ info[db['name']] = db['sizeOnDisk'].to_i
282
282
  end
283
283
  end
284
284
 
@@ -298,7 +298,7 @@ module Mongo
298
298
  #
299
299
  # @core databases db-instance_method
300
300
  def db(db_name, options={})
301
- DB.new(db_name, self, options.merge(:logger => @logger))
301
+ DB.new(db_name, self)
302
302
  end
303
303
 
304
304
  # Shortcut for returning a database. Use DB#db to accept options.
@@ -309,7 +309,7 @@ module Mongo
309
309
  #
310
310
  # @core databases []-instance_method
311
311
  def [](db_name)
312
- DB.new(db_name, self, :logger => @logger)
312
+ DB.new(db_name, self)
313
313
  end
314
314
 
315
315
  # Drop a database.
@@ -388,11 +388,9 @@ module Mongo
388
388
  #
389
389
  # @param [Integer] operation a MongoDB opcode.
390
390
  # @param [BSON::ByteBuffer] message a message to send to the database.
391
- # @param [String] log_message text version of +message+ for logging.
392
391
  #
393
392
  # @return [Integer] number of bytes sent
394
393
  def send_message(operation, message, log_message=nil)
395
- @logger.debug(" MONGODB #{log_message || message}") if @logger
396
394
  begin
397
395
  packed_message = add_message_headers(operation, message).to_s
398
396
  socket = checkout
@@ -408,7 +406,6 @@ module Mongo
408
406
  # @param [Integer] operation a MongoDB opcode.
409
407
  # @param [BSON::ByteBuffer] message a message to send to the database.
410
408
  # @param [String] db_name the name of the database. used on call to get_last_error.
411
- # @param [String] log_message text version of +message+ for logging.
412
409
  # @param [Hash] last_error_params parameters to be sent to getLastError. See DB#error for
413
410
  # available options.
414
411
  #
@@ -420,7 +417,6 @@ module Mongo
420
417
  def send_message_with_safe_check(operation, message, db_name, log_message=nil, last_error_params=false)
421
418
  message_with_headers = add_message_headers(operation, message)
422
419
  message_with_check = last_error_message(db_name, last_error_params)
423
- @logger.debug(" MONGODB #{log_message || message}") if @logger
424
420
  begin
425
421
  sock = checkout
426
422
  packed_message = message_with_headers.append!(message_with_check).to_s
@@ -442,7 +438,6 @@ module Mongo
442
438
  #
443
439
  # @param [Integer] operation a MongoDB opcode.
444
440
  # @param [BSON::ByteBuffer] message a message to send to the database.
445
- # @param [String] log_message text version of +message+ for logging.
446
441
  # @param [Socket] socket a socket to use in lieu of checking out a new one.
447
442
  #
448
443
  # @return [Array]
@@ -450,7 +445,6 @@ module Mongo
450
445
  # and [3] a cursor_id.
451
446
  def receive_message(operation, message, log_message=nil, socket=nil)
452
447
  packed_message = add_message_headers(operation, message).to_s
453
- @logger.debug(" MONGODB #{log_message || message}") if @logger
454
448
  begin
455
449
  sock = socket || checkout
456
450
 
@@ -626,7 +620,7 @@ module Mongo
626
620
  if config
627
621
  update_node_list(config['hosts']) if config['hosts']
628
622
  if @logger
629
- @logger.warn(config['msg']) if config['msg']
623
+ @logger.warn("MONGODB #{config['msg']}") if config['msg']
630
624
  end
631
625
  end
632
626
 
@@ -737,7 +731,7 @@ module Mongo
737
731
 
738
732
  # Otherwise, wait
739
733
  if @logger
740
- @logger.warn "Waiting for available connection; #{@checked_out.size} of #{@size} connections checked out."
734
+ @logger.warn "MONGODB Waiting for available connection; #{@checked_out.size} of #{@size} connections checked out."
741
735
  end
742
736
  @queue.wait(@connection_mutex)
743
737
  end
@@ -745,14 +739,14 @@ module Mongo
745
739
  end
746
740
 
747
741
  def receive(sock)
748
- receive_header(sock)
742
+ receive_and_discard_header(sock)
749
743
  number_received, cursor_id = receive_response_header(sock)
750
744
  read_documents(number_received, cursor_id, sock)
751
745
  end
752
746
 
753
747
  def receive_header(sock)
754
748
  header = BSON::ByteBuffer.new
755
- header.put_array(receive_message_on_socket(16, sock).unpack("C*"))
749
+ header.put_binary(receive_message_on_socket(16, sock))
756
750
  unless header.size == STANDARD_HEADER_SIZE
757
751
  raise "Short read for DB response header: " +
758
752
  "expected #{STANDARD_HEADER_SIZE} bytes, saw #{header.size}"
@@ -763,19 +757,25 @@ module Mongo
763
757
  response_to = header.get_int
764
758
  op = header.get_int
765
759
  end
760
+
761
+ def receive_and_discard_header(sock)
762
+ bytes_read = receive_and_discard_message_on_socket(16, sock)
763
+ unless bytes_read == STANDARD_HEADER_SIZE
764
+ raise "Short read for DB response header: " +
765
+ "expected #{STANDARD_HEADER_SIZE} bytes, saw #{bytes_read}"
766
+ end
767
+ nil
768
+ end
766
769
 
767
770
  def receive_response_header(sock)
768
- header_buf = BSON::ByteBuffer.new
769
- header_buf.put_array(receive_message_on_socket(RESPONSE_HEADER_SIZE, sock).unpack("C*"))
771
+ header_buf = receive_message_on_socket(RESPONSE_HEADER_SIZE, sock)
770
772
  if header_buf.length != RESPONSE_HEADER_SIZE
771
773
  raise "Short read for DB response header; " +
772
774
  "expected #{RESPONSE_HEADER_SIZE} bytes, saw #{header_buf.length}"
773
775
  end
774
- header_buf.rewind
775
- check_response_flags(header_buf.get_int)
776
- cursor_id = header_buf.get_long
777
- starting_from = header_buf.get_int
778
- number_remaining = header_buf.get_int
776
+ flags, cursor_id_a, cursor_id_b, starting_from, number_remaining = header_buf.unpack('VVVVV')
777
+ check_response_flags(flags)
778
+ cursor_id = (cursor_id_b << 32) + cursor_id_a
779
779
  [number_remaining, cursor_id]
780
780
  end
781
781
 
@@ -792,13 +792,10 @@ module Mongo
792
792
  docs = []
793
793
  number_remaining = number_received
794
794
  while number_remaining > 0 do
795
- buf = BSON::ByteBuffer.new
796
- buf.put_array(receive_message_on_socket(4, sock).unpack("C*"))
797
- buf.rewind
798
- size = buf.get_int
799
- buf.put_array(receive_message_on_socket(size - 4, sock).unpack("C*"), 4)
795
+ buf = receive_message_on_socket(4, sock)
796
+ size = buf.unpack('V')[0]
797
+ buf << receive_message_on_socket(size - 4, sock)
800
798
  number_remaining -= 1
801
- buf.rewind
802
799
  docs << BSON::BSON_CODER.deserialize(buf)
803
800
  end
804
801
  [docs, number_received, cursor_id]
@@ -818,26 +815,27 @@ module Mongo
818
815
  opts.assert_valid_keys(:w, :wtimeout, :fsync)
819
816
  cmd.merge!(opts)
820
817
  end
821
- message.put_array(BSON::BSON_CODER.serialize(cmd, false).unpack("C*"))
818
+ message.put_binary(BSON::BSON_CODER.serialize(cmd, false).to_s)
822
819
  add_message_headers(Mongo::Constants::OP_QUERY, message)
823
820
  end
824
821
 
825
822
  # Prepares a message for transmission to MongoDB by
826
823
  # constructing a valid message header.
827
824
  def add_message_headers(operation, message)
828
- headers = BSON::ByteBuffer.new
829
-
830
- # Message size.
831
- headers.put_int(16 + message.size)
832
-
833
- # Unique request id.
834
- headers.put_int(get_request_id)
835
-
836
- # Response id.
837
- headers.put_int(0)
838
-
839
- # Opcode.
840
- headers.put_int(operation)
825
+ headers = [
826
+ # Message size.
827
+ 16 + message.size,
828
+
829
+ # Unique request id.
830
+ get_request_id,
831
+
832
+ # Response id.
833
+ 0,
834
+
835
+ # Opcode.
836
+ operation
837
+ ].pack('VVVV')
838
+
841
839
  message.prepend!(headers)
842
840
  end
843
841
 
@@ -847,11 +845,14 @@ module Mongo
847
845
  # @return [Integer] number of bytes sent
848
846
  def send_message_on_socket(packed_message, socket)
849
847
  begin
850
- total_bytes_sent = 0
851
- while packed_message.size > 0
852
- byte_sent = socket.send(packed_message, 0)
853
- total_bytes_sent += byte_sent
854
- packed_message.slice!(0, byte_sent)
848
+ total_bytes_sent = socket.send(packed_message, 0)
849
+ if total_bytes_sent != packed_message.size
850
+ packed_message.slice!(0, total_bytes_sent)
851
+ while packed_message.size > 0
852
+ byte_sent = socket.send(packed_message, 0)
853
+ total_bytes_sent += byte_sent
854
+ packed_message.slice!(0, byte_sent)
855
+ end
855
856
  end
856
857
  total_bytes_sent
857
858
  rescue => ex
@@ -863,12 +864,16 @@ module Mongo
863
864
  # Low-level method for receiving data from socket.
864
865
  # Requires length and an available socket.
865
866
  def receive_message_on_socket(length, socket)
866
- message = ""
867
867
  begin
868
- while message.length < length do
869
- chunk = socket.recv(length - message.length)
870
- raise ConnectionFailure, "connection closed" unless chunk.length > 0
871
- message += chunk
868
+ message = socket.read(length)
869
+ raise ConnectionFailure, "connection closed" unless message.length > 0
870
+ if message.length < length
871
+ chunk = new_binary_string
872
+ while message.length < length
873
+ socket.read(length - message.length, chunk)
874
+ raise ConnectionFailure, "connection closed" unless chunk.length > 0
875
+ message << chunk
876
+ end
872
877
  end
873
878
  rescue => ex
874
879
  close
@@ -876,5 +881,40 @@ module Mongo
876
881
  end
877
882
  message
878
883
  end
884
+
885
+ # Low-level data for receiving data from socket.
886
+ # Unlike #receive_message_on_socket, this method immediately discards the data
887
+ # and only returns the number of bytes read.
888
+ def receive_and_discard_message_on_socket(length, socket)
889
+ bytes_read = 0
890
+ begin
891
+ chunk = socket.read(length)
892
+ bytes_read = chunk.length
893
+ raise ConnectionFailure, "connection closed" unless bytes_read > 0
894
+ if bytes_read < length
895
+ while bytes_read < length
896
+ socket.read(length - bytes_read, chunk)
897
+ raise ConnectionFailure, "connection closed" unless chunk.length > 0
898
+ bytes_read += chunk.length
899
+ end
900
+ end
901
+ rescue => ex
902
+ close
903
+ raise ConnectionFailure, "Operation failed with the following exception: #{ex}"
904
+ end
905
+ bytes_read
906
+ end
907
+
908
+ if defined?(Encoding)
909
+ BINARY_ENCODING = Encoding.find("binary")
910
+
911
+ def new_binary_string
912
+ "".force_encoding(BINARY_ENCODING)
913
+ end
914
+ else
915
+ def new_binary_string
916
+ ""
917
+ end
918
+ end
879
919
  end
880
920
  end
@@ -37,6 +37,7 @@ module Mongo
37
37
  @db = collection.db
38
38
  @collection = collection
39
39
  @connection = @db.connection
40
+ @logger = @connection.logger
40
41
 
41
42
  @selector = convert_selector_for_query(options[:selector])
42
43
  @fields = convert_fields_for_query(options[:fields])
@@ -49,19 +50,20 @@ module Mongo
49
50
  @explain = options[:explain]
50
51
  @socket = options[:socket]
51
52
  @tailable = options[:tailable] || false
52
- @batch_size = options[:batch_size] || 0
53
+ batch_size(options[:batch_size] || 0)
53
54
 
54
55
  @full_collection_name = "#{@collection.db.name}.#{@collection.name}"
55
- @cache = []
56
- @closed = false
57
- @query_run = false
56
+ @cache = []
57
+ @closed = false
58
+ @query_run = false
59
+ @returned = 0
58
60
  end
59
61
 
60
62
  # Get the next document specified the cursor options.
61
63
  #
62
64
  # @return [Hash, Nil] the next document or Nil if no documents remain.
63
65
  def next_document
64
- refill_via_get_more if num_remaining == 0
66
+ refresh if @cache.length == 0#empty?# num_remaining == 0
65
67
  doc = @cache.shift
66
68
 
67
69
  if doc && doc['$err']
@@ -178,6 +180,26 @@ module Mongo
178
180
  self
179
181
  end
180
182
 
183
+ # Set the batch size for server responses.
184
+ #
185
+ # Note that the batch size will take effect only on queries
186
+ # where the number to be returned is greater than 100.
187
+ #
188
+ # @param [Integer] size either 0 or some integer greater than 1. If 0,
189
+ # the server will determine the batch size.
190
+ #
191
+ # @return [Cursor]
192
+ def batch_size(size=0)
193
+ check_modifiable
194
+ if size < 0 || size == 1
195
+ raise ArgumentError, "Invalid value for batch_size #{size}; must be 0 or > 1."
196
+ else
197
+ @batch_size = size > @limit ? @limit : size
198
+ end
199
+
200
+ self
201
+ end
202
+
181
203
  # Iterate over each document in this cursor, yielding it to the given
182
204
  # block.
183
205
  #
@@ -190,10 +212,11 @@ module Mongo
190
212
  # puts doc['user']
191
213
  # end
192
214
  def each
193
- num_returned = 0
194
- while has_next? && (@limit <= 0 || num_returned < @limit)
195
- yield next_document
196
- num_returned += 1
215
+ #num_returned = 0
216
+ #while has_next? && (@limit <= 0 || num_returned < @limit)
217
+ while doc = next_document
218
+ yield doc #next_document
219
+ #num_returned += 1
197
220
  end
198
221
  end
199
222
 
@@ -241,7 +264,8 @@ module Mongo
241
264
  message = BSON::ByteBuffer.new([0, 0, 0, 0])
242
265
  message.put_int(1)
243
266
  message.put_long(@cursor_id)
244
- @connection.send_message(Mongo::Constants::OP_KILL_CURSORS, message, "cursor.close #{@cursor_id}")
267
+ @logger.debug("MONGODB cursor.close #{@cursor_id}") if @logger
268
+ @connection.send_message(Mongo::Constants::OP_KILL_CURSORS, message, nil)
245
269
  end
246
270
  @cursor_id = 0
247
271
  @closed = true
@@ -297,9 +321,7 @@ module Mongo
297
321
  {fields => 1}
298
322
  when Array
299
323
  return nil if fields.length.zero?
300
- returning({}) do |hash|
301
- fields.each { |field| hash[field] = 1 }
302
- end
324
+ fields.each_with_object({}) { |field, hash| hash[field] = 1 }
303
325
  when Hash
304
326
  return fields
305
327
  end
@@ -325,13 +347,13 @@ module Mongo
325
347
  end
326
348
  end
327
349
 
328
- # Return a number of documents remaining for this cursor.
350
+ # Return the number of documents remaining for this cursor.
329
351
  def num_remaining
330
- refill_via_get_more if @cache.length == 0
352
+ refresh if @cache.length == 0
331
353
  @cache.length
332
354
  end
333
355
 
334
- def refill_via_get_more
356
+ def refresh
335
357
  return if send_initial_query || @cursor_id.zero?
336
358
  message = BSON::ByteBuffer.new([0, 0, 0, 0])
337
359
 
@@ -339,11 +361,22 @@ module Mongo
339
361
  BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@collection.name}")
340
362
 
341
363
  # Number of results to return.
342
- message.put_int(@batch_size)
364
+ if @limit > 0
365
+ limit = @limit - @returned
366
+ if @batch_size > 0
367
+ limit = limit < @batch_size ? limit : @batch_size
368
+ end
369
+ message.put_int(limit)
370
+ else
371
+ message.put_int(@batch_size)
372
+ end
343
373
 
344
374
  # Cursor id.
345
375
  message.put_long(@cursor_id)
346
- results, @n_received, @cursor_id = @connection.receive_message(Mongo::Constants::OP_GET_MORE, message, "cursor.get_more()", @socket)
376
+ @logger.debug("MONGODB cursor.refresh() for cursor #{@cursor_id}") if @logger
377
+ results, @n_received, @cursor_id = @connection.receive_message(Mongo::Constants::OP_GET_MORE,
378
+ message, nil, @socket)
379
+ @returned += @n_received
347
380
  @cache += results
348
381
  close_cursor_if_query_complete
349
382
  end
@@ -354,8 +387,9 @@ module Mongo
354
387
  false
355
388
  else
356
389
  message = construct_query_message
357
- results, @n_received, @cursor_id = @connection.receive_message(Mongo::Constants::OP_QUERY, message,
358
- (query_log_message if @connection.logger), @socket)
390
+ @logger.debug query_log_message if @logger
391
+ results, @n_received, @cursor_id = @connection.receive_message(Mongo::Constants::OP_QUERY, message, nil, @socket)
392
+ @returned += @n_received
359
393
  @cache += results
360
394
  @query_run = true
361
395
  close_cursor_if_query_complete
@@ -370,8 +404,8 @@ module Mongo
370
404
  message.put_int(@skip)
371
405
  message.put_int(@limit)
372
406
  spec = query_contains_special_fields? ? construct_query_spec : @selector
373
- message.put_array(BSON::BSON_CODER.serialize(spec, false).to_a)
374
- message.put_array(BSON::BSON_CODER.serialize(@fields, false).to_a) if @fields
407
+ message.put_binary(BSON::BSON_CODER.serialize(spec, false).to_s)
408
+ message.put_binary(BSON::BSON_CODER.serialize(@fields, false).to_s) if @fields
375
409
  message
376
410
  end
377
411
 
@@ -402,7 +436,9 @@ module Mongo
402
436
  end
403
437
 
404
438
  def close_cursor_if_query_complete
405
- close if @limit > 0 && @n_received >= @limit
439
+ if @limit > 0 && @returned >= @limit
440
+ close
441
+ end
406
442
  end
407
443
 
408
444
  def check_modifiable
@@ -20,10 +20,21 @@
20
20
  class Object
21
21
 
22
22
  #:nodoc:
23
- def returning(value)
24
- yield value
25
- value
26
- end
23
+ def tap
24
+ yield self
25
+ self
26
+ end unless respond_to? :tap
27
+
28
+ end
29
+
30
+ #:nodoc:
31
+ module Enumerable
32
+
33
+ #:nodoc:
34
+ def each_with_object(memo)
35
+ each { |element| yield(element, memo) }
36
+ memo
37
+ end unless [].respond_to?(:each_with_object)
27
38
 
28
39
  end
29
40
 
@@ -15,8 +15,11 @@ Gem::Specification.new do |s|
15
15
  'mongo.gemspec', 'LICENSE.txt']
16
16
  s.files += ['lib/mongo.rb'] + Dir['lib/mongo/**/*.rb']
17
17
  s.files += Dir['examples/**/*.rb'] + Dir['bin/**/*.rb']
18
+ s.files += Dir['bin/mongo_console']
18
19
  s.test_files = Dir['test/**/*.rb']
19
20
 
21
+ s.executables = ['mongo_console']
22
+
20
23
  s.has_rdoc = true
21
24
  s.test_files = Dir['test/**/*.rb']
22
25
  s.test_files -= Dir['test/mongo_bson/*.rb'] # remove these files from the manifest
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # Demonstrate features in MongoDB 1.4
7
7
  class Features14Test < Test::Unit::TestCase
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test requires bouncing the server.
7
7
  # It also requires that a user exists on the admin database.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test requires bouncing the server
7
7
  class AutoreconnectTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  # NOTE: these tests are run only if we can connect to a single MongoDB in slave mode.
4
4
  class SlaveConnectionTest < Test::Unit::TestCase
@@ -105,10 +105,11 @@ class TestCollection < Test::Unit::TestCase
105
105
  end
106
106
 
107
107
  def test_safe_insert
108
+ @@test.create_index("hello", :unique => true)
108
109
  a = {"hello" => "world"}
109
110
  @@test.insert(a)
110
111
  @@test.insert(a)
111
- assert(@@db.error.include?("E11000"))
112
+ assert(@@db.get_last_error['err'].include?("11000"))
112
113
 
113
114
  assert_raise OperationFailure do
114
115
  @@test.insert(a, :safe => true)
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  require 'logger'
3
3
  require 'stringio'
4
4
  require 'thread'
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  require 'mongo/exceptions'
3
3
  require 'mongo/util/conversions'
4
4
  require 'bson/ordered_hash'
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  require 'logger'
3
3
 
4
4
  class CursorTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  require 'logger'
3
3
 
4
4
  class CursorTest < Test::Unit::TestCase
@@ -17,16 +17,28 @@ class CursorTest < Test::Unit::TestCase
17
17
  @@coll_full_name = "#{MONGO_TEST_DB}.test"
18
18
  end
19
19
 
20
- def test_cursor_invalid
21
- 100.times do |n|
22
- @@coll.insert({:a => "HELLO" * 50000})
20
+ def test_valid_batch_sizes
21
+ assert_raise ArgumentError do
22
+ @@coll.find({}, :batch_size => 1, :limit => 5)
23
23
  end
24
24
 
25
- cursor = @@coll.find({}, :batch_size => 50)
26
- cursor.next_document
27
- p @@db.command("cursorInfo" => 1)
28
- cursor.close
29
- p @@db.command("cursorInfo" => 1)
30
- cursor.next_document
25
+ assert_raise ArgumentError do
26
+ @@coll.find({}, :batch_size => -1, :limit => 5)
27
+ end
28
+
29
+ assert @@coll.find({}, :batch_size => 0, :limit => 5)
30
+ end
31
+
32
+ def test_batch_size
33
+ @@coll.remove
34
+ 200.times do |n|
35
+ @@coll.insert({:a => n})
36
+ end
37
+
38
+ list = @@coll.find({}, :batch_size => 2, :limit => 6).to_a
39
+ assert_equal 6, list.length
40
+
41
+ list = @@coll.find({}, :batch_size => 100, :limit => 101).to_a
42
+ assert_equal 101, list.length
31
43
  end
32
44
  end
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  require 'logger'
3
3
 
4
4
  class CursorTest < Test::Unit::TestCase
@@ -126,13 +126,13 @@ class CursorTest < Test::Unit::TestCase
126
126
  @@coll.remove
127
127
 
128
128
  t1 = Time.now
129
- t1_id = ObjectID.from_time(t1)
129
+ t1_id = ObjectId.from_time(t1)
130
130
  @@coll.save({:t => 't1'})
131
131
  @@coll.save({:t => 't1'})
132
132
  @@coll.save({:t => 't1'})
133
133
  sleep(2)
134
134
  t2 = Time.now
135
- t2_id = ObjectID.from_time(t2)
135
+ t2_id = ObjectId.from_time(t2)
136
136
  @@coll.save({:t => 't2'})
137
137
  @@coll.save({:t => 't2'})
138
138
  @@coll.save({:t => 't2'})
@@ -428,4 +428,5 @@ class CursorTest < Test::Unit::TestCase
428
428
  cursor.rewind!
429
429
  assert_equal 100, cursor.map {|doc| doc }.length
430
430
  end
431
- end
431
+
432
+ end
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class DBAPITest < Test::Unit::TestCase
4
4
  include Mongo
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class DBConnectionTest < Test::Unit::TestCase
4
4
 
@@ -10,6 +10,6 @@ class DBConnectionTest < Test::Unit::TestCase
10
10
  db = Connection.new(host, port).db(MONGO_TEST_DB)
11
11
  coll = db.collection('test')
12
12
  coll.remove
13
- db.error
13
+ db.get_last_error
14
14
  end
15
15
  end
@@ -1,5 +1,4 @@
1
- $:.unshift '.'
2
- require 'test/test_helper'
1
+ require './test/test_helper'
3
2
  require 'digest/md5'
4
3
  require 'stringio'
5
4
  require 'logger'
@@ -204,10 +203,10 @@ class DBTest < Test::Unit::TestCase
204
203
  @@db['test'].save("i" => 1)
205
204
 
206
205
  @@db['test'].update({"i" => 1}, {"$set" => {"i" => 2}})
207
- assert @@db.last_status()["updatedExisting"]
206
+ assert @@db.get_last_error()["updatedExisting"]
208
207
 
209
208
  @@db['test'].update({"i" => 1}, {"$set" => {"i" => 500}})
210
- assert !@@db.last_status()["updatedExisting"]
209
+ assert !@@db.get_last_error()["updatedExisting"]
211
210
  end
212
211
 
213
212
  def test_text_port_number_raises_no_errors
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  include Mongo
3
3
 
4
4
  class GridFileSystemTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  include Mongo
3
3
 
4
4
  class GridIOTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  include Mongo
3
3
 
4
4
  class GridTest < Test::Unit::TestCase
@@ -139,7 +139,7 @@ class GridTest < Test::Unit::TestCase
139
139
  io.rewind
140
140
  data = io.read
141
141
  if data.respond_to?(:force_encoding)
142
- data.force_encoding(:binary)
142
+ data.force_encoding("binary")
143
143
  end
144
144
  read_data = ""
145
145
  while(chunk = file.read(read_length))
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: this test should be run only if a replica pair is running.
7
7
  class ReplicaPairCountTest < Test::Unit::TestCase
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: this test should be run only if a replica pair is running.
7
7
  class ReplicaPairInsertTest < Test::Unit::TestCase
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: this test should be run only if a replica pair is running.
7
7
  class ReplicaPairPooledInsertTest < Test::Unit::TestCase
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: this test should be run only if a replica pair is running.
7
7
  class ReplicaPairQueryTest < Test::Unit::TestCase
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes to be running
7
7
  # on the local host.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes to be running
7
7
  # on the local host.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes, one of which is an arbiter, to be running
7
7
  # on the local host.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes to be running
7
7
  # on the local host.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes to be running
7
7
  # on the local host.
@@ -1,7 +1,7 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  require 'mongo'
3
3
  require 'test/unit'
4
- require 'test/test_helper'
4
+ require './test/test_helper'
5
5
 
6
6
  # NOTE: This test expects a replica set of three nodes to be running on local host.
7
7
  class ReplicaSetAckTest < Test::Unit::TestCase
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class SupportTest < Test::Unit::TestCase
4
4
  include Mongo
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class TestThreading < Test::Unit::TestCase
4
4
 
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require File.expand_path('./test/test_helper.rb')
2
2
 
3
3
  class CollectionTest < Test::Unit::TestCase
4
4
 
@@ -12,8 +12,9 @@ class CollectionTest < Test::Unit::TestCase
12
12
  @db = @conn['testing']
13
13
  @coll = @db.collection('books')
14
14
  @conn.expects(:send_message).with do |op, msg, log|
15
- op == 2001 && log.include?("testing['books'].update")
15
+ op == 2001
16
16
  end
17
+ @logger.stubs(:debug)
17
18
  @coll.update({}, {:title => 'Moby Dick'})
18
19
  end
19
20
 
@@ -22,7 +23,10 @@ class CollectionTest < Test::Unit::TestCase
22
23
  @db = @conn['testing']
23
24
  @coll = @db.collection('books')
24
25
  @conn.expects(:send_message).with do |op, msg, log|
25
- op == 2002 && log.include?("testing['books'].insert")
26
+ op == 2002
27
+ end
28
+ @logger.expects(:debug).with do |msg|
29
+ msg.include?("Moby")
26
30
  end
27
31
  @coll.insert({:title => 'Moby Dick'})
28
32
  end
@@ -32,8 +36,11 @@ class CollectionTest < Test::Unit::TestCase
32
36
  @db = @conn['testing']
33
37
  @coll = @db.collection('books')
34
38
  @conn.expects(:receive_message).with do |op, msg, log, sock|
35
- op == 2004 && log.include?("sort")
39
+ op == 2004
36
40
  end.returns([[], 0, 0])
41
+ @logger.expects(:debug).with do |msg|
42
+ msg.include?('Moby')
43
+ end
37
44
  @coll.find({:title => 'Moby Dick'}).sort([['title', 1], ['author', 1]]).next_document
38
45
  end
39
46
 
@@ -43,7 +50,10 @@ class CollectionTest < Test::Unit::TestCase
43
50
  @coll = @db.collection('books')
44
51
  data = BSON::Binary.new(("BINARY " * 1000).unpack("c*"))
45
52
  @conn.expects(:send_message).with do |op, msg, log|
46
- op == 2002 && log.include?("BSON::Binary")
53
+ op == 2002
54
+ end
55
+ @logger.expects(:debug).with do |msg|
56
+ msg.include?("Binary")
47
57
  end
48
58
  @coll.insert({:data => data})
49
59
  end
@@ -53,7 +63,10 @@ class CollectionTest < Test::Unit::TestCase
53
63
  @db = @conn['testing']
54
64
  @coll = @db.collection('books')
55
65
  @conn.expects(:send_message_with_safe_check).with do |op, msg, db_name, log|
56
- op == 2001 && log.include?("testing['books'].update")
66
+ op == 2001
67
+ end
68
+ @logger.expects(:debug).with do |msg|
69
+ msg.include?("testing['books'].update")
57
70
  end
58
71
  @coll.update({}, {:title => 'Moby Dick'}, :safe => true)
59
72
  end
@@ -63,8 +76,9 @@ class CollectionTest < Test::Unit::TestCase
63
76
  @db = @conn['testing']
64
77
  @coll = @db.collection('books')
65
78
  @conn.expects(:send_message_with_safe_check).with do |op, msg, db_name, log|
66
- op == 2001 && log.include?("testing['books'].update")
79
+ op == 2001
67
80
  end
81
+ @logger.stubs(:debug)
68
82
  @coll.update({}, {:title => 'Moby Dick'}, :safe => true)
69
83
  end
70
84
  end
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
  include Mongo
3
3
 
4
4
  class ConnectionTest < Test::Unit::TestCase
@@ -1,9 +1,11 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class CursorTest < Test::Unit::TestCase
4
4
  context "Cursor options" do
5
5
  setup do
6
- @connection = stub(:class => Connection)
6
+ @logger = mock()
7
+ @logger.stubs(:debug)
8
+ @connection = stub(:class => Connection, :logger => @logger)
7
9
  @db = stub(:name => "testing", :slave_ok? => false, :connection => @connection)
8
10
  @collection = stub(:db => @db, :name => "items")
9
11
  @cursor = Cursor.new(@collection)
@@ -70,7 +72,7 @@ class CursorTest < Test::Unit::TestCase
70
72
 
71
73
  context "Query fields" do
72
74
  setup do
73
- @connection = stub(:class => Collection)
75
+ @connection = stub(:class => Collection, :logger => @logger)
74
76
  @db = stub(:slave_ok? => true, :name => "testing", :connection => @connection)
75
77
  @collection = stub(:db => @db, :name => "items")
76
78
  end
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require './test/test_helper'
2
2
 
3
3
  class DBTest < Test::Unit::TestCase
4
4
  context "DBTest: " do
@@ -71,7 +71,7 @@ class DBTest < Test::Unit::TestCase
71
71
  should "raise an error if getlasterror fails" do
72
72
  @db.expects(:command).returns({})
73
73
  assert_raise Mongo::MongoDBError do
74
- @db.error
74
+ @db.get_last_error
75
75
  end
76
76
  end
77
77
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 8
10
- version: 1.0.8
9
+ - 9
10
+ version: 1.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jim Menard
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-08-27 00:00:00 -04:00
20
+ date: 2010-09-20 00:00:00 -04:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -38,8 +38,8 @@ dependencies:
38
38
  version_requirements: *id001
39
39
  description: A Ruby driver for MongoDB. For more information about Mongo, see http://www.mongodb.org.
40
40
  email: mongodb-dev@googlegroups.com
41
- executables: []
42
-
41
+ executables:
42
+ - mongo_console
43
43
  extensions: []
44
44
 
45
45
  extra_rdoc_files:
@@ -76,6 +76,9 @@ files:
76
76
  - examples/types.rb
77
77
  - bin/bson_benchmark.rb
78
78
  - bin/fail_if_no_c.rb
79
+ - bin/insert.rb
80
+ - bin/oid.rb
81
+ - bin/mongo_console
79
82
  - test/auxillary/1.4_features.rb
80
83
  - test/auxillary/authentication_test.rb
81
84
  - test/auxillary/autoreconnect_test.rb