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