mongo 0.18 → 0.18.1

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.
@@ -254,16 +254,23 @@ Random cursor fun facts:
254
254
 
255
255
  = Testing
256
256
 
257
- If you have the source code, you can run the tests.
257
+ If you have the source code, you can run the tests. There's a separate rake task for testing with
258
+ the mongo_ext c extension enabled.
258
259
 
259
- $ rake test
260
+ $ rake test:c
260
261
 
261
- This will run both unit and functional tests. If you want to run these
262
- individually:
262
+ Or, to test without the extension:
263
+
264
+ $ rake test:ruby
265
+
266
+ These will run both unit and functional tests. To run these tests alone:
263
267
 
264
268
  $ rake test:unit
265
269
  $ rake test:functional
266
270
 
271
+ To run any individual rake tasks with the C extenson enabled, just pass C_EXT=true to the task:
272
+
273
+ $ rake test:unit C_EXT=true
267
274
 
268
275
  If you want to test replica pairs, you can run the following tests
269
276
  individually:
@@ -276,6 +283,7 @@ It's also possible to test replica pairs with connection pooling:
276
283
 
277
284
  $ rake test:pooled_pair_insert
278
285
 
286
+ ===Shoulda and Mocha
279
287
 
280
288
  All tests now require shoulda and mocha. You can install these gems as
281
289
  follows:
data/Rakefile CHANGED
@@ -10,19 +10,37 @@ rescue LoadError
10
10
  end
11
11
  require 'rbconfig'
12
12
  include Config
13
+ ENV['TEST_MODE'] = 'TRUE'
13
14
 
14
15
  gem_command = "gem"
15
16
  gem_command = "gem1.9" if $0.match(/1\.9$/) # use gem1.9 if we used rake1.9
16
17
 
17
- # NOTE: the functional tests assume MongoDB is running.
18
18
  desc "Test the MongoDB Ruby driver."
19
19
  task :test do
20
- Rake::Task['test:unit'].invoke
21
- Rake::Task['test:functional'].invoke
22
- Rake::Task['test:pooled_threading'].invoke
20
+ puts "\nThis option has changed."
21
+ puts "\nTo test the driver with the c-extensions:\nrake test:c\n"
22
+ puts "To test the pure ruby driver: \nrake test:ruby"
23
23
  end
24
24
 
25
- namespace :test do
25
+ namespace :test do
26
+
27
+ desc "Test the driver with the c extension enabled."
28
+ task :c do
29
+ ENV['C_EXT'] = 'TRUE'
30
+ Rake::Task['test:unit'].invoke
31
+ Rake::Task['test:functional'].invoke
32
+ Rake::Task['test:pooled_threading'].invoke
33
+ ENV['C_EXT'] = nil
34
+ end
35
+
36
+ desc "Test the driver using pure ruby (no c extension)"
37
+ task :ruby do
38
+ ENV['C_EXT'] = nil
39
+ Rake::Task['test:unit'].invoke
40
+ Rake::Task['test:functional'].invoke
41
+ Rake::Task['test:pooled_threading'].invoke
42
+ end
43
+
26
44
  Rake::TestTask.new(:unit) do |t|
27
45
  t.test_files = FileList['test/unit/*_test.rb']
28
46
  t.verbose = true
@@ -79,7 +97,7 @@ namespace :gem do
79
97
  task :install do
80
98
  sh <<EOS
81
99
  #{gem_command} build mongo-ruby-driver.gemspec &&
82
- sudo #{gem_command} install mongo-*.gem &&
100
+ #{gem_command} install mongo-*.gem &&
83
101
  rm mongo-*.gem
84
102
  EOS
85
103
  end
@@ -88,7 +106,7 @@ EOS
88
106
  task :install_extensions do
89
107
  sh <<EOS
90
108
  #{gem_command} build mongo-extensions.gemspec &&
91
- sudo #{gem_command} install mongo_ext-*.gem &&
109
+ #{gem_command} install mongo_ext-*.gem &&
92
110
  rm mongo_ext-*.gem
93
111
  EOS
94
112
  end
@@ -1,5 +1,28 @@
1
1
  $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
 
3
+ module Mongo
4
+ ASCENDING = 1
5
+ DESCENDING = -1
6
+
7
+ VERSION = "0.18.1"
8
+ end
9
+
10
+ begin
11
+ # Need this for running test with and without c ext in Ruby 1.9.
12
+ raise LoadError if ENV['TEST_MODE'] && !ENV['C_EXT']
13
+ require 'mongo_ext/cbson'
14
+ raise LoadError unless defined?(CBson::VERSION) && CBson::VERSION == Mongo::VERSION
15
+ require 'mongo/util/bson_c'
16
+ BSON = BSON_C
17
+ rescue LoadError
18
+ require 'mongo/util/bson_ruby'
19
+ BSON = BSON_RUBY
20
+ warn "\n**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance."
21
+ warn " You can install the extension as follows:\n gem install mongo_ext\n"
22
+ warn " If you continue to receive this message after installing, make sure that the"
23
+ warn " mongo_ext gem is in your load path and that the mongo_ext and mongo gems are of the same version.\n"
24
+ end
25
+
3
26
  require 'mongo/types/binary'
4
27
  require 'mongo/types/code'
5
28
  require 'mongo/types/dbref'
@@ -9,6 +32,7 @@ require 'mongo/types/regexp_of_holding'
9
32
  require 'mongo/util/support'
10
33
  require 'mongo/util/conversions'
11
34
  require 'mongo/util/server_version'
35
+ require 'mongo/util/bson_ruby'
12
36
 
13
37
  require 'mongo/errors'
14
38
  require 'mongo/constants'
@@ -18,18 +42,3 @@ require 'mongo/cursor'
18
42
  require 'mongo/collection'
19
43
  require 'mongo/admin'
20
44
 
21
- begin
22
- require 'mongo_ext/cbson'
23
- BSON_SERIALIZER = CBson
24
- rescue LoadError
25
- BSON_SERIALIZER = BSON
26
- warn "\n**Notice: C extension not detected. This is required for optimum MongoDB Ruby driver performance."
27
- warn " You can install the extension as follows:\n gem install mongo_ext\n"
28
- end
29
-
30
- module Mongo
31
- ASCENDING = 1
32
- DESCENDING = -1
33
-
34
- VERSION = "0.18"
35
- end
@@ -14,8 +14,6 @@
14
14
  # limitations under the License.
15
15
  # ++
16
16
 
17
- require 'mongo/util/ordered_hash'
18
-
19
17
  module Mongo
20
18
 
21
19
  # Provide administrative database methods: those having to do with
@@ -33,8 +33,8 @@ module Mongo
33
33
  if name.empty? or name.include? ".."
34
34
  raise InvalidName, "collection names cannot be empty"
35
35
  end
36
- if name.include? "$" and not name.match(/^\$cmd/)
37
- raise InvalidName, "collection names must not contain '$'"
36
+ if name.include? "$"
37
+ raise InvalidName, "collection names must not contain '$'" unless name =~ /((^\$cmd)|(oplog\.\$main))/
38
38
  end
39
39
  if name.match(/^\./) or name.match(/\.$/)
40
40
  raise InvalidName, "collection names must not start or end with '.'"
@@ -216,9 +216,9 @@ module Mongo
216
216
  def remove(selector={})
217
217
  message = ByteBuffer.new
218
218
  message.put_int(0)
219
- BSON.serialize_cstr(message, "#{@db.name}.#{@name}")
219
+ BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
220
220
  message.put_int(0)
221
- message.put_array(BSON_SERIALIZER.serialize(selector, false).unpack("C*"))
221
+ message.put_array(BSON.serialize(selector, false).unpack("C*"))
222
222
  @connection.send_message(Mongo::Constants::OP_DELETE, message,
223
223
  "db.#{@db.name}.remove(#{selector.inspect})")
224
224
  end
@@ -243,13 +243,13 @@ module Mongo
243
243
  def update(selector, document, options={})
244
244
  message = ByteBuffer.new
245
245
  message.put_int(0)
246
- BSON.serialize_cstr(message, "#{@db.name}.#{@name}")
246
+ BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}")
247
247
  update_options = 0
248
248
  update_options += 1 if options[:upsert]
249
249
  update_options += 2 if options[:multi]
250
250
  message.put_int(update_options)
251
- message.put_array(BSON_SERIALIZER.serialize(selector, false).unpack("C*"))
252
- message.put_array(BSON_SERIALIZER.serialize(document, false).unpack("C*"))
251
+ message.put_array(BSON.serialize(selector, false).unpack("C*"))
252
+ message.put_array(BSON.serialize(document, false).unpack("C*"))
253
253
  if options[:safe]
254
254
  @connection.send_message_with_safe_check(Mongo::Constants::OP_UPDATE, message, @db.name,
255
255
  "db.#{@name}.update(#{selector.inspect}, #{document.inspect})")
@@ -507,8 +507,8 @@ EOS
507
507
  def insert_documents(documents, collection_name=@name, check_keys=true, safe=false)
508
508
  message = ByteBuffer.new
509
509
  message.put_int(0)
510
- BSON.serialize_cstr(message, "#{@db.name}.#{collection_name}")
511
- documents.each { |doc| message.put_array(BSON_SERIALIZER.serialize(doc, check_keys).unpack("C*")) }
510
+ BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}")
511
+ documents.each { |doc| message.put_array(BSON.serialize(doc, check_keys).unpack("C*")) }
512
512
  if safe
513
513
  @connection.send_message_with_safe_check(Mongo::Constants::OP_INSERT, message, @db.name,
514
514
  "db.#{collection_name}.insert(#{documents.inspect})")
@@ -96,7 +96,7 @@ module Mongo
96
96
  # :right => ["db2.example.com", 27017]}, nil,
97
97
  # :pool_size => 20, :timeout => 5)
98
98
  def initialize(pair_or_host=nil, port=nil, options={})
99
- @nodes = format_pair(pair_or_host)
99
+ @nodes = format_pair(pair_or_host, port)
100
100
 
101
101
  # Host and port of current master.
102
102
  @host = @port = nil
@@ -459,7 +459,7 @@ module Mongo
459
459
  buf.put_array(receive_message_on_socket(size - 4, sock).unpack("C*"), 4)
460
460
  number_remaining -= 1
461
461
  buf.rewind
462
- docs << BSON.new.deserialize(buf)
462
+ docs << BSON.deserialize(buf)
463
463
  end
464
464
  [docs, number_received, cursor_id]
465
465
  end
@@ -467,10 +467,10 @@ module Mongo
467
467
  def last_error_message(db_name)
468
468
  message = ByteBuffer.new
469
469
  message.put_int(0)
470
- BSON.serialize_cstr(message, "#{db_name}.$cmd")
470
+ BSON_RUBY.serialize_cstr(message, "#{db_name}.$cmd")
471
471
  message.put_int(0)
472
472
  message.put_int(-1)
473
- message.put_array(BSON_SERIALIZER.serialize({:getlasterror => 1}, false).unpack("C*"))
473
+ message.put_array(BSON.serialize({:getlasterror => 1}, false).unpack("C*"))
474
474
  add_message_headers(Mongo::Constants::OP_QUERY, message)
475
475
  end
476
476
 
@@ -524,7 +524,7 @@ module Mongo
524
524
  ## Private helper methods
525
525
 
526
526
  # Returns an array of host-port pairs.
527
- def format_pair(pair_or_host)
527
+ def format_pair(pair_or_host, port)
528
528
  case pair_or_host
529
529
  when String
530
530
  [[pair_or_host, port ? port.to_i : DEFAULT_PORT]]
@@ -12,9 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'mongo/util/byte_buffer'
16
- require 'mongo/util/bson'
17
-
18
15
  module Mongo
19
16
 
20
17
  # A cursor over query results. Returned objects are hashes.
@@ -289,7 +286,7 @@ module Mongo
289
286
 
290
287
  # DB name.
291
288
  db_name = @admin ? 'admin' : @db.name
292
- BSON.serialize_cstr(message, "#{db_name}.#{@collection.name}")
289
+ BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}")
293
290
 
294
291
  # Number of results to return; db decides for now.
295
292
  message.put_int(0)
@@ -320,15 +317,15 @@ module Mongo
320
317
  message = ByteBuffer.new
321
318
  message.put_int(query_opts)
322
319
  db_name = @admin ? 'admin' : @db.name
323
- BSON.serialize_cstr(message, "#{db_name}.#{@collection.name}")
320
+ BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}")
324
321
  message.put_int(@skip)
325
322
  message.put_int(@limit)
326
323
  selector = @selector
327
324
  if query_contains_special_fields?
328
325
  selector = selector_with_special_query_fields
329
326
  end
330
- message.put_array(BSON_SERIALIZER.serialize(selector, false).unpack("C*"))
331
- message.put_array(BSON_SERIALIZER.serialize(@fields, false).unpack("C*")) if @fields
327
+ message.put_array(BSON.serialize(selector, false).unpack("C*"))
328
+ message.put_array(BSON.serialize(@fields, false).unpack("C*")) if @fields
332
329
  message
333
330
  end
334
331
 
@@ -18,9 +18,6 @@ require 'socket'
18
18
  require 'timeout'
19
19
  require 'digest/md5'
20
20
  require 'thread'
21
- require 'mongo/collection'
22
- require 'mongo/util/ordered_hash.rb'
23
- require 'mongo/admin'
24
21
 
25
22
  module Mongo
26
23
 
@@ -27,6 +27,9 @@ module Mongo
27
27
  # Raised when invalid arguments are sent to Mongo Ruby methods.
28
28
  class MongoArgumentError < MongoRubyError; end
29
29
 
30
+ # Raised when given a string is not valid utf-8 (Ruby 1.8 only).
31
+ class InvalidStringEncoding < MongoRubyError; end
32
+
30
33
  # Raised on failures in connection to the database server.
31
34
  class ConnectionError < MongoRubyError; end
32
35
 
@@ -18,7 +18,6 @@ require 'mongo/types/objectid'
18
18
  require 'mongo/util/byte_buffer'
19
19
  require 'mongo/util/ordered_hash'
20
20
 
21
-
22
21
  module GridFS
23
22
 
24
23
  # A chunk stores a portion of GridStore data.
@@ -124,6 +124,12 @@ module Mongo
124
124
  legacy
125
125
  end
126
126
 
127
+ # Returns the utc time at which this ObjectID was generated. This may
128
+ # be used in lieu of a created_at timestamp.
129
+ def generation_time
130
+ Time.at(@data.pack("C4").unpack("N")[0])
131
+ end
132
+
127
133
  private
128
134
 
129
135
  begin
@@ -0,0 +1,18 @@
1
+ # A thin wrapper for the CBson class
2
+ class BSON_C
3
+
4
+ def self.serialize(obj, check_keys=false)
5
+ ByteBuffer.new(CBson.serialize(obj, check_keys))
6
+ end
7
+
8
+ def self.deserialize(buf=nil)
9
+ if buf.is_a? String
10
+ to_deserialize = ByteBuffer.new(buf) if buf
11
+ else
12
+ buf = ByteBuffer.new(buf.to_a) if buf
13
+ end
14
+ buf.rewind
15
+ CBson.deserialize(buf.to_s)
16
+ end
17
+
18
+ end
@@ -22,8 +22,8 @@ require 'mongo/types/dbref'
22
22
  require 'mongo/types/objectid'
23
23
  require 'mongo/types/regexp_of_holding'
24
24
 
25
- # A BSON seralizer/deserializer.
26
- class BSON
25
+ # A BSON seralizer/deserializer in pure Ruby.
26
+ class BSON_RUBY
27
27
 
28
28
  include Mongo
29
29
 
@@ -49,64 +49,70 @@ class BSON
49
49
  NUMBER_LONG = 18
50
50
  MAXKEY = 127
51
51
 
52
+ def initialize
53
+ @buf = ByteBuffer.new
54
+ end
55
+
52
56
  if RUBY_VERSION >= '1.9'
53
57
  def self.to_utf8(str)
54
58
  str.encode("utf-8")
55
59
  end
56
60
  else
57
61
  def self.to_utf8(str)
58
- str # TODO Ruby 1.8 punt for now
62
+ begin
63
+ str.unpack("U*")
64
+ rescue => ex
65
+ raise InvalidStringEncoding, "String not valid utf-8: #{str}"
66
+ end
67
+ str
59
68
  end
60
69
  end
61
70
 
62
71
  def self.serialize_cstr(buf, val)
63
- buf.put_array(to_utf8(val.to_s).unpack("C*") + [0])
64
- end
65
-
66
- def initialize()
67
- @buf = ByteBuffer.new
72
+ buf.put_array(to_utf8(val.to_s).unpack("C*") << 0)
68
73
  end
69
74
 
70
75
  def to_a
71
76
  @buf.to_a
72
77
  end
73
78
 
79
+ def to_s
80
+ @buf.to_s
81
+ end
82
+
74
83
  # Serializes an object.
75
- # Implemented to ensure an API compatible with BSON extension.
76
- def self.serialize(obj, check_keys)
84
+ # Implemented to ensure an API compatible with BSON extension.
85
+ def self.serialize(obj, check_keys=false)
77
86
  new.serialize(obj, check_keys)
78
87
  end
79
88
 
80
- begin
81
- require 'mongo_ext/cbson'
82
- def serialize(obj, check_keys=false)
83
- @buf = ByteBuffer.new(CBson.serialize(obj, check_keys))
84
- end
85
- rescue LoadError
86
- def serialize(obj, check_keys=false)
87
- raise "Document is null" unless obj
88
-
89
- @buf.rewind
90
- # put in a placeholder for the total size
91
- @buf.put_int(0)
92
-
93
- # Write key/value pairs. Always write _id first if it exists.
94
- if obj.has_key? '_id'
95
- serialize_key_value('_id', obj['_id'], check_keys)
96
- elsif obj.has_key? :_id
97
- serialize_key_value('_id', obj[:_id], check_keys)
98
- end
89
+ def self.deserialize(buf=nil)
90
+ new.deserialize(buf)
91
+ end
92
+
93
+ def serialize(obj, check_keys=false)
94
+ raise "Document is null" unless obj
99
95
 
100
- obj.each {|k, v| serialize_key_value(k, v, check_keys) unless k == '_id' || k == :_id }
96
+ @buf.rewind
97
+ # put in a placeholder for the total size
98
+ @buf.put_int(0)
101
99
 
102
- serialize_eoo_element(@buf)
103
- @buf.put_int(@buf.size, 0)
104
- self
100
+ # Write key/value pairs. Always write _id first if it exists.
101
+ if obj.has_key? '_id'
102
+ serialize_key_value('_id', obj['_id'], check_keys)
103
+ elsif obj.has_key? :_id
104
+ serialize_key_value('_id', obj[:_id], check_keys)
105
105
  end
106
+
107
+ obj.each {|k, v| serialize_key_value(k, v, check_keys) unless k == '_id' || k == :_id }
108
+
109
+ serialize_eoo_element(@buf)
110
+ @buf.put_int(@buf.size, 0)
111
+ self
106
112
  end
107
113
 
108
114
  # Returns the array stored in the buffer.
109
- # Implemented to ensure an API compatible with BSON extension.
115
+ # Implemented to ensure an API compatible with BSON extension.
110
116
  def unpack(arg)
111
117
  @buf.to_a
112
118
  end
@@ -154,93 +160,80 @@ class BSON
154
160
  end
155
161
  end
156
162
 
157
- begin
158
- require 'mongo_ext/cbson'
159
- def deserialize(buf=nil)
160
- if buf.is_a? String
161
- @buf = ByteBuffer.new(buf) if buf
162
- else
163
- @buf = ByteBuffer.new(buf.to_a) if buf
164
- end
165
- @buf.rewind
166
- CBson.deserialize(@buf.to_s)
163
+ def deserialize(buf=nil)
164
+ # If buf is nil, use @buf, assumed to contain already-serialized BSON.
165
+ # This is only true during testing.
166
+ if buf.is_a? String
167
+ @buf = ByteBuffer.new(buf) if buf
168
+ else
169
+ @buf = ByteBuffer.new(buf.to_a) if buf
167
170
  end
168
- rescue LoadError
169
- def deserialize(buf=nil)
170
- # If buf is nil, use @buf, assumed to contain already-serialized BSON.
171
- # This is only true during testing.
172
- if buf.is_a? String
173
- @buf = ByteBuffer.new(buf) if buf
171
+ @buf.rewind
172
+ @buf.get_int # eat message size
173
+ doc = OrderedHash.new
174
+ while @buf.more?
175
+ type = @buf.get
176
+ case type
177
+ when STRING, CODE
178
+ key = deserialize_cstr(@buf)
179
+ doc[key] = deserialize_string_data(@buf)
180
+ when SYMBOL
181
+ key = deserialize_cstr(@buf)
182
+ doc[key] = deserialize_string_data(@buf).intern
183
+ when NUMBER
184
+ key = deserialize_cstr(@buf)
185
+ doc[key] = deserialize_number_data(@buf)
186
+ when NUMBER_INT
187
+ key = deserialize_cstr(@buf)
188
+ doc[key] = deserialize_number_int_data(@buf)
189
+ when NUMBER_LONG
190
+ key = deserialize_cstr(@buf)
191
+ doc[key] = deserialize_number_long_data(@buf)
192
+ when OID
193
+ key = deserialize_cstr(@buf)
194
+ doc[key] = deserialize_oid_data(@buf)
195
+ when ARRAY
196
+ key = deserialize_cstr(@buf)
197
+ doc[key] = deserialize_array_data(@buf)
198
+ when REGEX
199
+ key = deserialize_cstr(@buf)
200
+ doc[key] = deserialize_regex_data(@buf)
201
+ when OBJECT
202
+ key = deserialize_cstr(@buf)
203
+ doc[key] = deserialize_object_data(@buf)
204
+ when BOOLEAN
205
+ key = deserialize_cstr(@buf)
206
+ doc[key] = deserialize_boolean_data(@buf)
207
+ when DATE
208
+ key = deserialize_cstr(@buf)
209
+ doc[key] = deserialize_date_data(@buf)
210
+ when NULL
211
+ key = deserialize_cstr(@buf)
212
+ doc[key] = nil
213
+ when UNDEFINED
214
+ key = deserialize_cstr(@buf)
215
+ doc[key] = nil
216
+ when REF
217
+ key = deserialize_cstr(@buf)
218
+ doc[key] = deserialize_dbref_data(@buf)
219
+ when BINARY
220
+ key = deserialize_cstr(@buf)
221
+ doc[key] = deserialize_binary_data(@buf)
222
+ when CODE_W_SCOPE
223
+ key = deserialize_cstr(@buf)
224
+ doc[key] = deserialize_code_w_scope_data(@buf)
225
+ when TIMESTAMP
226
+ key = deserialize_cstr(@buf)
227
+ doc[key] = [deserialize_number_int_data(@buf),
228
+ deserialize_number_int_data(@buf)]
229
+ when EOO
230
+ break
174
231
  else
175
- @buf = ByteBuffer.new(buf.to_a) if buf
176
- end
177
- @buf.rewind
178
- @buf.get_int # eat message size
179
- doc = OrderedHash.new
180
- while @buf.more?
181
- type = @buf.get
182
- case type
183
- when STRING, CODE
184
- key = deserialize_cstr(@buf)
185
- doc[key] = deserialize_string_data(@buf)
186
- when SYMBOL
187
- key = deserialize_cstr(@buf)
188
- doc[key] = deserialize_string_data(@buf).intern
189
- when NUMBER
190
- key = deserialize_cstr(@buf)
191
- doc[key] = deserialize_number_data(@buf)
192
- when NUMBER_INT
193
- key = deserialize_cstr(@buf)
194
- doc[key] = deserialize_number_int_data(@buf)
195
- when NUMBER_LONG
196
- key = deserialize_cstr(@buf)
197
- doc[key] = deserialize_number_long_data(@buf)
198
- when OID
199
- key = deserialize_cstr(@buf)
200
- doc[key] = deserialize_oid_data(@buf)
201
- when ARRAY
202
- key = deserialize_cstr(@buf)
203
- doc[key] = deserialize_array_data(@buf)
204
- when REGEX
205
- key = deserialize_cstr(@buf)
206
- doc[key] = deserialize_regex_data(@buf)
207
- when OBJECT
208
- key = deserialize_cstr(@buf)
209
- doc[key] = deserialize_object_data(@buf)
210
- when BOOLEAN
211
- key = deserialize_cstr(@buf)
212
- doc[key] = deserialize_boolean_data(@buf)
213
- when DATE
214
- key = deserialize_cstr(@buf)
215
- doc[key] = deserialize_date_data(@buf)
216
- when NULL
217
- key = deserialize_cstr(@buf)
218
- doc[key] = nil
219
- when UNDEFINED
220
- key = deserialize_cstr(@buf)
221
- doc[key] = nil
222
- when REF
223
- key = deserialize_cstr(@buf)
224
- doc[key] = deserialize_dbref_data(@buf)
225
- when BINARY
226
- key = deserialize_cstr(@buf)
227
- doc[key] = deserialize_binary_data(@buf)
228
- when CODE_W_SCOPE
229
- key = deserialize_cstr(@buf)
230
- doc[key] = deserialize_code_w_scope_data(@buf)
231
- when TIMESTAMP
232
- key = deserialize_cstr(@buf)
233
- doc[key] = [deserialize_number_int_data(@buf),
234
- deserialize_number_int_data(@buf)]
235
- when EOO
236
- break
237
- else
238
- raise "Unknown type #{type}, key = #{key}"
239
- end
232
+ raise "Unknown type #{type}, key = #{key}"
240
233
  end
241
- @buf.rewind
242
- doc
243
234
  end
235
+ @buf.rewind
236
+ doc
244
237
  end
245
238
 
246
239
  # For debugging.