lib/mongo/util/bson.rb in mongo-0.0.1 vs lib/mongo/util/bson.rb in mongo-0.0.2
- old
+ new
@@ -15,10 +15,11 @@
# ++
require 'mongo/util/byte_buffer'
require 'mongo/util/ordered_hash'
require 'mongo/objectid'
+require 'mongo/dbref'
# A BSON seralizer/deserializer.
class BSON
MINKEY = -1
@@ -79,11 +80,13 @@
serialize_boolean_element(@buf, k, v)
when DATE
serialize_date_element(@buf, k, v)
when NULL
serialize_null_element(@buf, k)
- when BINARY, UNDEFINED, REF, SYMBOL, CODE_W_SCOPE
+ when REF
+ serialize_dbref_element(@buf, k, v)
+ when BINARY, UNDEFINED, SYMBOL, CODE_W_SCOPE
# TODO
raise "unimplemented type #{type}"
else
raise "unhandled type #{type}"
end
@@ -102,40 +105,43 @@
doc = {}
while @buf.more?
type = @buf.get
case type
when STRING, CODE
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_string_data(@buf)
when NUMBER
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_number_data(@buf)
when NUMBER_INT
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_number_int_data(@buf)
when OID
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_oid_data(@buf)
when ARRAY
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_array_data(@buf)
when REGEX
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_regex_data(@buf)
when OBJECT
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_object_data(@buf)
when BOOLEAN
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_boolean_data(@buf)
when DATE
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = deserialize_date_data(@buf)
when NULL
- key = deserialize_element_name(@buf)
+ key = deserialize_cstr(@buf)
doc[key] = nil
- when BINARY, UNDEFINED, REF, SYMBOL, CODE_W_SCOPE
+ when REF
+ key = deserialize_cstr(@buf)
+ doc[key] = deserialize_dbref_data(@buf)
+ when BINARY, UNDEFINED, SYMBOL, CODE_W_SCOPE
# TODO
raise "unimplemented type #{type}"
when EOO
break
else
@@ -189,12 +195,12 @@
h.each { |k, v| a[k.to_i] = v }
a
end
def deserialize_regex_data(buf)
- str = deserialize_element_name(buf)
- options_str = deserialize_element_name(buf)
+ str = deserialize_cstr(buf)
+ options_str = deserialize_cstr(buf)
options = 0
options |= Regexp::IGNORECASE if options_str.include?('i')
options |= Regexp::MULTILINE if options_str.include?('m')
options |= Regexp::EXTENDED if options_str.include?('x')
Regexp.new(str, options)
@@ -208,19 +214,34 @@
def deserialize_oid_data(buf)
XGen::Mongo::Driver::ObjectID.new(buf.get(12))
end
+ def deserialize_dbref_data(buf)
+ ns = deserialize_cstr(buf)
+ oid = deserialize_oid_data(buf)
+ # TODO fix parent, field_name, db of DBRef. Does that need to be done here
+ # or by the caller?
+ XGen::Mongo::Driver::DBRef.new(nil, nil, nil, ns, oid)
+ end
+
def serialize_eoo_element(buf)
buf.put(EOO)
end
def serialize_null_element(buf, key)
buf.put(NULL)
self.class.serialize_cstr(buf, key)
end
+ def serialize_dbref_element(buf, key, val)
+ buf.put(REF)
+ self.class.serialize_cstr(buf, key)
+ self.class.serialize_cstr(buf, val.namespace)
+ buf.put_array(val.object_id.to_a)
+ end
+
def serialize_boolean_element(buf, key, val)
buf.put(BOOLEAN)
self.class.serialize_cstr(buf, key)
buf.put(val ? 1 : 0)
end
@@ -296,11 +317,11 @@
# Go back to where we were
buf.position = end_pos
end
- def deserialize_element_name(buf)
+ def deserialize_cstr(buf)
chars = ""
while 1
b = buf.get
break if b == 0
chars << b.chr
@@ -323,9 +344,11 @@
ARRAY
when Regexp
REGEX
when XGen::Mongo::Driver::ObjectID
OID
+ when XGen::Mongo::Driver::DBRef
+ REF
when true, false
BOOLEAN
when Time
DATE
when Hash