diff --git a/ext/cbson/cbson.c b/ext/cbson/cbson.c index 0d321a0..d1b181f 100644 --- a/ext/cbson/cbson.c +++ b/ext/cbson/cbson.c @@ -280,7 +280,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { case T_STRING: { if (strcmp(rb_obj_classname(value), - "Mongo::Code") == 0) { + "BSON::Code") == 0) { buffer_position length_location, start_position, total_length; int length; write_name_and_type(buffer, key, 0x0F); @@ -324,7 +324,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { { // TODO there has to be a better way to do these checks... const char* cls = rb_obj_classname(value); - if (strcmp(cls, "Mongo::Binary") == 0 || + if (strcmp(cls, "BSON::Binary") == 0 || strcmp(cls, "ByteBuffer") == 0) { const char subtype = strcmp(cls, "ByteBuffer") ? (const char)FIX2INT(rb_funcall(value, rb_intern("subtype"), 0)) : 2; @@ -343,7 +343,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { SAFE_WRITE(buffer, RSTRING_PTR(string_data), length); break; } - if (strcmp(cls, "Mongo::ObjectID") == 0) { + if (strcmp(cls, "BSON::ObjectID") == 0) { VALUE as_array = rb_funcall(value, rb_intern("to_a"), 0); int i; write_name_and_type(buffer, key, 0x07); @@ -353,7 +353,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { } break; } - if (strcmp(cls, "Mongo::DBRef") == 0) { + if (strcmp(cls, "BSON::DBRef") == 0) { buffer_position length_location, start_position, obj_length; VALUE ns, oid; write_name_and_type(buffer, key, 0x03); @@ -377,11 +377,11 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { SAFE_WRITE_AT_POS(buffer, length_location, (const char*)&obj_length, 4); break; } - if (strcmp(cls, "Mongo::MaxKey") == 0) { + if (strcmp(cls, "BSON::MaxKey") == 0) { write_name_and_type(buffer, key, 0x7f); break; } - if (strcmp(cls, "Mongo::MinKey") == 0) { + if (strcmp(cls, "BSON::MinKey") == 0) { write_name_and_type(buffer, key, 0xff); break; } @@ -883,29 +883,29 @@ static VALUE objectid_generate(VALUE self) void Init_cbson() { - VALUE mongo, CBson, Digest, ext_version; + VALUE bson, CBson, Digest, ext_version; Time = rb_const_get(rb_cObject, rb_intern("Time")); - mongo = rb_const_get(rb_cObject, rb_intern("Mongo")); - rb_require("mongo_bson/types/binary"); - Binary = rb_const_get(mongo, rb_intern("Binary")); - rb_require("mongo_bson/types/objectid"); - ObjectID = rb_const_get(mongo, rb_intern("ObjectID")); - rb_require("mongo_bson/types/dbref"); - DBRef = rb_const_get(mongo, rb_intern("DBRef")); - rb_require("mongo_bson/types/code"); - Code = rb_const_get(mongo, rb_intern("Code")); - rb_require("mongo_bson/types/min_max_keys"); - MinKey = rb_const_get(mongo, rb_intern("MinKey")); - MaxKey = rb_const_get(mongo, rb_intern("MaxKey")); - rb_require("mongo_bson/types/regexp_of_holding"); + bson = rb_const_get(rb_cObject, rb_intern("BSON")); + rb_require("bson/types/binary"); + Binary = rb_const_get(bson, rb_intern("Binary")); + rb_require("bson/types/objectid"); + ObjectID = rb_const_get(bson, rb_intern("ObjectID")); + rb_require("bson/types/dbref"); + DBRef = rb_const_get(bson, rb_intern("DBRef")); + rb_require("bson/types/code"); + Code = rb_const_get(bson, rb_intern("Code")); + rb_require("bson/types/min_max_keys"); + MinKey = rb_const_get(bson, rb_intern("MinKey")); + MaxKey = rb_const_get(bson, rb_intern("MaxKey")); + rb_require("bson/types/regexp_of_holding"); Regexp = rb_const_get(rb_cObject, rb_intern("Regexp")); - RegexpOfHolding = rb_const_get(mongo, rb_intern("RegexpOfHolding")); - rb_require("mongo_bson/exceptions"); - InvalidName = rb_const_get(mongo, rb_intern("InvalidName")); - InvalidStringEncoding = rb_const_get(mongo, rb_intern("InvalidStringEncoding")); - InvalidDocument = rb_const_get(mongo, rb_intern("InvalidDocument")); - rb_require("mongo_bson/ordered_hash"); + RegexpOfHolding = rb_const_get(bson, rb_intern("RegexpOfHolding")); + rb_require("bson/exceptions"); + InvalidName = rb_const_get(bson, rb_intern("InvalidName")); + InvalidStringEncoding = rb_const_get(bson, rb_intern("InvalidStringEncoding")); + InvalidDocument = rb_const_get(bson, rb_intern("InvalidDocument")); + rb_require("bson/ordered_hash"); OrderedHash = rb_const_get(rb_cObject, rb_intern("OrderedHash")); CBson = rb_define_module("CBson"); diff --git a/ext/cbson/extconf.rb b/ext/cbson/extconf.rb index ef62db7..039c17d 100644 --- a/ext/cbson/extconf.rb +++ b/ext/cbson/extconf.rb @@ -7,4 +7,4 @@ have_header("ruby/regex.h") || have_header("regex.h") have_header("ruby/encoding.h") dir_config('cbson') -create_makefile('mongo_ext/cbson') +create_makefile('bson_ext/cbson') diff --git a/lib/mongo.rb b/lib/mongo.rb index 6e28dd1..3f6838e 100644 --- a/lib/mongo.rb +++ b/lib/mongo.rb @@ -4,9 +4,6 @@ module Mongo VERSION = "0.19.2" end -require 'mongo_bson' - - module Mongo ASCENDING = 1 DESCENDING = -1 @@ -28,6 +25,8 @@ module Mongo end +require 'bson' + require 'mongo/util/support' require 'mongo/util/core_ext' require 'mongo/util/conversions' diff --git a/lib/mongo/collection.rb b/lib/mongo/collection.rb index ec186a2..05a89a8 100644 --- a/lib/mongo/collection.rb +++ b/lib/mongo/collection.rb @@ -45,18 +45,18 @@ module Mongo name = name.to_s if name.empty? or name.include? ".." - raise InvalidName, "collection names cannot be empty" + raise Mongo::InvalidName, "collection names cannot be empty" end if name.include? "$" - raise InvalidName, "collection names must not contain '$'" unless name =~ /((^\$cmd)|(oplog\.\$main))/ + raise Mongo::InvalidName, "collection names must not contain '$'" unless name =~ /((^\$cmd)|(oplog\.\$main))/ end if name.match(/^\./) or name.match(/\.$/) - raise InvalidName, "collection names must not start or end with '.'" + raise Mongo::InvalidName, "collection names must not start or end with '.'" end @db, @name = db, name @connection = @db.connection - @pk_factory = pk_factory || ObjectID + @pk_factory = pk_factory || BSON::ObjectID @hint = nil end @@ -181,7 +181,7 @@ module Mongo spec = case spec_or_object_id when nil {} - when ObjectID + when BSON::ObjectID {:_id => spec_or_object_id} when Hash spec_or_object_id @@ -260,10 +260,10 @@ module Mongo # @core remove remove-instance_method def remove(selector={}, opts={}) # Initial byte is 0. - message = ByteBuffer.new([0, 0, 0, 0]) - BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}") + message = BSON::ByteBuffer.new([0, 0, 0, 0]) + BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}") message.put_int(0) - message.put_array(BSON_CODER.serialize(selector, false, true).to_a) + message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a) if opts[:safe] @connection.send_message_with_safe_check(Mongo::Constants::OP_DELETE, message, @db.name, @@ -299,14 +299,14 @@ module Mongo # @core update update-instance_method def update(selector, document, options={}) # Initial byte is 0. - message = ByteBuffer.new([0, 0, 0, 0]) - BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}") + message = BSON::ByteBuffer.new([0, 0, 0, 0]) + BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{@name}") update_options = 0 update_options += 1 if options[:upsert] update_options += 2 if options[:multi] message.put_int(update_options) - message.put_array(BSON_CODER.serialize(selector, false, true).to_a) - message.put_array(BSON_CODER.serialize(document, false, true).to_a) + message.put_array(BSON::BSON_CODER.serialize(selector, false, true).to_a) + message.put_array(BSON::BSON_CODER.serialize(document, false, true).to_a) if options[:safe] @connection.send_message_with_safe_check(Mongo::Constants::OP_UPDATE, message, @db.name, "#{@db.name}['#{@name}'].update(#{selector.inspect}, #{document.inspect})") @@ -415,15 +415,15 @@ module Mongo # Perform a map/reduce operation on the current collection. # - # @param [String, Code] map a map function, written in JavaScript. - # @param [String, Code] reduce a reduce function, written in JavaScript. + # @param [String, BSON::Code] map a map function, written in JavaScript. + # @param [String, BSON::Code] reduce a reduce function, written in JavaScript. # # @option opts [Hash] :query ({}) a query selector document, like what's passed to #find, to limit # the operation to a subset of the collection. # @option opts [Array] :sort ([]) an array of [key, direction] pairs to sort by. Direction should # be specified as Mongo::ASCENDING (or :ascending / :asc) or Mongo::DESCENDING (or :descending / :desc) # @option opts [Integer] :limit (nil) if passing a query, number of objects to return from the collection. - # @option opts [String, Code] :finalize (nil) a javascript function to apply to the result set after the + # @option opts [String, BSON::Code] :finalize (nil) a javascript function to apply to the result set after the # map/reduce operation has finished. # @option opts [String] :out (nil) the name of the output collection. If specified, the collection will not be treated as temporary. # @option opts [Boolean] :keeptemp (false) if true, the generated collection will be persisted. default is false. @@ -435,8 +435,8 @@ module Mongo # # @core mapreduce map_reduce-instance_method def map_reduce(map, reduce, opts={}) - map = Code.new(map) unless map.is_a?(Code) - reduce = Code.new(reduce) unless reduce.is_a?(Code) + map = BSON::Code.new(map) unless map.is_a?(BSON::Code) + reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code) hash = OrderedHash.new hash['mapreduce'] = self.name @@ -454,12 +454,12 @@ module Mongo # Perform a group aggregation. # - # @param [Array, String, Code, Nil] :key either 1) an array of fields to group by, + # @param [Array, String, BSON::Code, Nil] :key either 1) an array of fields to group by, # 2) a javascript function to generate the key object, or 3) nil. # @param [Hash] condition an optional document specifying a query to limit the documents over which group is run. # @param [Hash] initial initial value of the aggregation counter object - # @param [String, Code] reduce aggregation function, in JavaScript - # @param [String, Code] finalize :: optional. a JavaScript function that receives and modifies + # @param [String, BSON::Code] reduce aggregation function, in JavaScript + # @param [String, BSON::Code] finalize :: optional. a JavaScript function that receives and modifies # each of the resultant grouped objects. Available only when group is run # with command set to true. # @param [Nil] deprecated this param in a placeholder for a deprecated param. It will be removed @@ -475,7 +475,7 @@ module Mongo "See http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method for details." end - reduce = Code.new(reduce) unless reduce.is_a?(Code) + reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code) group_command = { "group" => { @@ -493,7 +493,7 @@ module Mongo key.each { |k| key_value[k] = 1 } else key_type = "$keyf" - key_value = key.is_a?(Code) ? key : Code.new(key) + key_value = key.is_a?(BSON::Code) ? key : BSON::Code.new(key) end group_command["group"][key_type] = key_value @@ -501,9 +501,9 @@ module Mongo # only add finalize if specified # check to see if users have sent the finalizer as the last argument. - finalize = deprecated if deprecated.is_a?(String) || deprecated.is_a?(Code) - finalize = Code.new(finalize) if finalize.is_a?(String) - if finalize.is_a?(Code) + finalize = deprecated if deprecated.is_a?(String) || deprecated.is_a?(BSON::Code) + finalize = BSON::Code.new(finalize) if finalize.is_a?(String) + if finalize.is_a?(BSON::Code) group_command['group']['finalize'] = finalize end @@ -631,9 +631,9 @@ module Mongo # +check_keys+ setting. def insert_documents(documents, collection_name=@name, check_keys=true, safe=false) # Initial byte is 0. - message = ByteBuffer.new([0, 0, 0, 0]) - BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}") - documents.each { |doc| message.put_array(BSON_CODER.serialize(doc, check_keys, true).to_a) } + message = BSON::ByteBuffer.new([0, 0, 0, 0]) + BSON::BSON_RUBY.serialize_cstr(message, "#{@db.name}.#{collection_name}") + documents.each { |doc| message.put_array(BSON::BSON_CODER.serialize(doc, check_keys, true).to_a) } if safe @connection.send_message_with_safe_check(Mongo::Constants::OP_INSERT, message, @db.name, "#{@db.name}['#{collection_name}'].insert(#{documents.inspect})") diff --git a/lib/mongo/connection.rb b/lib/mongo/connection.rb index 2c507a3..8260423 100644 --- a/lib/mongo/connection.rb +++ b/lib/mongo/connection.rb @@ -344,7 +344,7 @@ module Mongo # Send a message to MongoDB, adding the necessary headers. # # @param [Integer] operation a MongoDB opcode. - # @param [ByteBuffer] message a message to send to the database. + # @param [BSON::ByteBuffer] message a message to send to the database. # @param [String] log_message text version of +message+ for logging. # # @return [True] @@ -363,7 +363,7 @@ module Mongo # an exception if the operation has failed. # # @param [Integer] operation a MongoDB opcode. - # @param [ByteBuffer] message a message to send to the database. + # @param [BSON::ByteBuffer] message a message to send to the database. # @param [String] db_name the name of the database. used on call to get_last_error. # @param [String] log_message text version of +message+ for logging. # @@ -394,7 +394,7 @@ module Mongo # Sends a message to the database and waits for the response. # # @param [Integer] operation a MongoDB opcode. - # @param [ByteBuffer] message a message to send to the database. + # @param [BSON::ByteBuffer] message a message to send to the database. # @param [String] log_message text version of +message+ for logging. # @param [Socket] socket a socket to use in lieu of checking out a new one. # @@ -625,7 +625,7 @@ module Mongo end def receive_header(sock) - header = ByteBuffer.new + header = BSON::ByteBuffer.new header.put_array(receive_message_on_socket(16, sock).unpack("C*")) unless header.size == STANDARD_HEADER_SIZE raise "Short read for DB response header: " + @@ -639,7 +639,7 @@ module Mongo end def receive_response_header(sock) - header_buf = ByteBuffer.new + header_buf = BSON::ByteBuffer.new header_buf.put_array(receive_message_on_socket(RESPONSE_HEADER_SIZE, sock).unpack("C*")) if header_buf.length != RESPONSE_HEADER_SIZE raise "Short read for DB response header; " + @@ -657,32 +657,32 @@ module Mongo docs = [] number_remaining = number_received while number_remaining > 0 do - buf = ByteBuffer.new + buf = BSON::ByteBuffer.new buf.put_array(receive_message_on_socket(4, sock).unpack("C*")) buf.rewind size = buf.get_int buf.put_array(receive_message_on_socket(size - 4, sock).unpack("C*"), 4) number_remaining -= 1 buf.rewind - docs << BSON_CODER.deserialize(buf) + docs << BSON::BSON_CODER.deserialize(buf) end [docs, number_received, cursor_id] end def last_error_message(db_name) - message = ByteBuffer.new + message = BSON::ByteBuffer.new message.put_int(0) - BSON_RUBY.serialize_cstr(message, "#{db_name}.$cmd") + BSON::BSON_RUBY.serialize_cstr(message, "#{db_name}.$cmd") message.put_int(0) message.put_int(-1) - message.put_array(BSON_CODER.serialize({:getlasterror => 1}, false).unpack("C*")) + message.put_array(BSON::BSON_CODER.serialize({:getlasterror => 1}, false).unpack("C*")) add_message_headers(Mongo::Constants::OP_QUERY, message) end # Prepares a message for transmission to MongoDB by # constructing a valid message header. def add_message_headers(operation, message) - headers = ByteBuffer.new + headers = BSON::ByteBuffer.new # Message size. headers.put_int(16 + message.size) diff --git a/lib/mongo/cursor.rb b/lib/mongo/cursor.rb index 1a4ca60..6137794 100644 --- a/lib/mongo/cursor.rb +++ b/lib/mongo/cursor.rb @@ -227,7 +227,7 @@ module Mongo # @return [True] def close if @cursor_id - message = ByteBuffer.new([0, 0, 0, 0]) + message = BSON::ByteBuffer.new([0, 0, 0, 0]) message.put_int(1) message.put_long(@cursor_id) @connection.send_message(Mongo::Constants::OP_KILL_CURSORS, message, "cursor.close") @@ -311,11 +311,11 @@ module Mongo def refill_via_get_more return if send_initial_query || @cursor_id.zero? - message = ByteBuffer.new([0, 0, 0, 0]) + message = BSON::ByteBuffer.new([0, 0, 0, 0]) # DB name. db_name = @admin ? 'admin' : @db.name - BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}") + BSON::BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}") # Number of results to return; db decides for now. message.put_int(0) @@ -343,15 +343,15 @@ module Mongo end def construct_query_message - message = ByteBuffer.new + message = BSON::ByteBuffer.new message.put_int(query_opts) db_name = @admin ? 'admin' : @db.name - BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}") + BSON::BSON_RUBY.serialize_cstr(message, "#{db_name}.#{@collection.name}") message.put_int(@skip) message.put_int(@limit) spec = query_contains_special_fields? ? construct_query_spec : @selector - message.put_array(BSON_CODER.serialize(spec, false).to_a) - message.put_array(BSON_CODER.serialize(@fields, false).to_a) if @fields + message.put_array(BSON::BSON_CODER.serialize(spec, false).to_a) + message.put_array(BSON::BSON_CODER.serialize(@fields, false).to_a) if @fields message end diff --git a/lib/mongo/gridfs/chunk.rb b/lib/mongo/gridfs/chunk.rb index 246b0d1..357770c 100644 --- a/lib/mongo/gridfs/chunk.rb +++ b/lib/mongo/gridfs/chunk.rb @@ -14,9 +14,9 @@ # limitations under the License. # ++ -require 'mongo_bson/types/objectid' -require 'mongo_bson/byte_buffer' -require 'mongo_bson/ordered_hash' +require 'bson/types/objectid' +require 'bson/byte_buffer' +require 'bson/ordered_hash' module GridFS diff --git a/lib/mongo/gridfs/grid_io.rb b/lib/mongo/gridfs/grid_io.rb index 6429dfa..22f0fa8 100644 --- a/lib/mongo/gridfs/grid_io.rb +++ b/lib/mongo/gridfs/grid_io.rb @@ -163,7 +163,7 @@ module Mongo # This method will be invoked automatically when # on GridIO#open is passed a block. Otherwise, it must be called manually. # - # @return [Mongo::ObjectID] + # @return [BSON::ObjectID] def close if @mode[0] == ?w if @current_chunk['n'].zero? && @chunk_position.zero? @@ -183,7 +183,7 @@ module Mongo def create_chunk(n) chunk = OrderedHash.new - chunk['_id'] = Mongo::ObjectID.new + chunk['_id'] = BSON::ObjectID.new chunk['n'] = n chunk['files_id'] = @files_id chunk['data'] = '' @@ -261,7 +261,7 @@ module Mongo end chunk_available = @chunk_size - @chunk_position step_size = (to_write > chunk_available) ? chunk_available : to_write - @current_chunk['data'] = Binary.new((@current_chunk['data'].to_s << string[-to_write, step_size]).unpack("c*")) + @current_chunk['data'] = BSON::Binary.new((@current_chunk['data'].to_s << string[-to_write, step_size]).unpack("c*")) @chunk_position += step_size to_write -= step_size save_chunk(@current_chunk) @@ -290,7 +290,7 @@ module Mongo # Initialize the class for writing a file. def init_write(opts) - @files_id = opts[:_id] || Mongo::ObjectID.new + @files_id = opts[:_id] || BSON::ObjectID.new @content_type = opts[:content_type] || (defined? MIME) && get_content_type || DEFAULT_CONTENT_TYPE @chunk_size = opts[:chunk_size] || DEFAULT_CHUNK_SIZE @metadata = opts[:metadata] if opts[:metadata] diff --git a/lib/mongo/gridfs/grid_store.rb b/lib/mongo/gridfs/grid_store.rb index e4ff276..d79b2bb 100644 --- a/lib/mongo/gridfs/grid_store.rb +++ b/lib/mongo/gridfs/grid_store.rb @@ -14,8 +14,8 @@ # limitations under the License. # ++ -require 'mongo_bson/types/objectid' -require 'mongo_bson/ordered_hash' +require 'bson/types/objectid' +require 'bson/ordered_hash' require 'mongo/gridfs/chunk' module GridFS diff --git a/lib/mongo_bson.rb b/lib/mongo_bson.rb deleted file mode 100644 index f237d88..0000000 --- a/lib/mongo_bson.rb +++ /dev/null @@ -1,65 +0,0 @@ -$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) - -module Mongo - module BSON - VERSION = "0.19.2" - def self.serialize(obj, check_keys=false, move_id=false) - warn "BSON has been deprecated. Use Mongo::BSON_CODER instead." - BSON_CODER.serialize(obj, check_keys, move_id) - end - - - def self.deserialize(buf=nil) - warn "BSON has been deprecated. Use Mongo::BSON_CODER instead." - BSON_CODER.deserialize(buf) - end - end -end - -# This just exists for deprecation warnings. Will be removed in an upcoming version. -module BSON - def self.serialize(obj, check_keys=false, move_id=false) - warn "BSON has been deprecated. Use Mongo::BSON_CODER instead." - BSON_CODER.serialize(obj, check_keys, move_id) - end - - - def self.deserialize(buf=nil) - warn "BSON has been deprecated. Use Mongo::BSON_CODER instead." - BSON_CODER.deserialize(buf) - end -end - - -begin - # Need this for running test with and without c ext in Ruby 1.9. - raise LoadError if ENV['TEST_MODE'] && !ENV['C_EXT'] - require 'mongo_ext/cbson' - raise LoadError unless defined?(CBson::VERSION) && CBson::VERSION == Mongo::BSON::VERSION - require 'mongo_bson/bson_c' - module Mongo - BSON_CODER = BSON_C - end -rescue LoadError - require 'mongo_bson/bson_ruby' - module Mongo - BSON_CODER = BSON_RUBY - end - warn "\n**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance." - warn " You can install the extension as follows:\n gem install mongo_ext\n" - warn " If you continue to receive this message after installing, make sure that the" - warn " mongo_ext gem is in your load path and that the mongo_ext and mongo gems are of the same version.\n" -end - -require 'mongo_bson/types/binary' -require 'mongo_bson/types/code' -require 'mongo_bson/types/dbref' -require 'mongo_bson/types/objectid' -require 'mongo_bson/types/regexp_of_holding' -require 'mongo_bson/types/min_max_keys' - -require 'base64' -require 'mongo_bson/ordered_hash' -require 'mongo_bson/byte_buffer' -require 'mongo_bson/bson_ruby' -require 'mongo_bson/exceptions' diff --git a/lib/mongo_bson/bson_c.rb b/lib/mongo_bson/bson_c.rb deleted file mode 100644 index dcdddec..0000000 --- a/lib/mongo_bson/bson_c.rb +++ /dev/null @@ -1,20 +0,0 @@ -# A thin wrapper for the CBson class -module Mongo - class BSON_C - - def self.serialize(obj, check_keys=false, move_id=false) - ByteBuffer.new(CBson.serialize(obj, check_keys, move_id)) - end - - def self.deserialize(buf=nil) - if buf.is_a? String - to_deserialize = ByteBuffer.new(buf) if buf - else - buf = ByteBuffer.new(buf.to_a) if buf - end - buf.rewind - CBson.deserialize(buf.to_s) - end - - end -end diff --git a/lib/mongo_bson/bson_ruby.rb b/lib/mongo_bson/bson_ruby.rb deleted file mode 100644 index 945424a..0000000 --- a/lib/mongo_bson/bson_ruby.rb +++ /dev/null @@ -1,601 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU Affero General Public License, version 3, as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License -# for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# ++ - -module Mongo - # A BSON seralizer/deserializer in pure Ruby. - class BSON_RUBY - - # why was this necessary? - #include Mongo - - MINKEY = -1 - EOO = 0 - NUMBER = 1 - STRING = 2 - OBJECT = 3 - ARRAY = 4 - BINARY = 5 - UNDEFINED = 6 - OID = 7 - BOOLEAN = 8 - DATE = 9 - NULL = 10 - REGEX = 11 - REF = 12 - CODE = 13 - SYMBOL = 14 - CODE_W_SCOPE = 15 - NUMBER_INT = 16 - TIMESTAMP = 17 - NUMBER_LONG = 18 - MAXKEY = 127 - - def initialize - @buf = ByteBuffer.new - end - - if RUBY_VERSION >= '1.9' - def self.to_utf8(str) - str.encode("utf-8") - end - else - def self.to_utf8(str) - begin - str.unpack("U*") - rescue => ex - raise InvalidStringEncoding, "String not valid utf-8: #{str}" - end - str - end - end - - def self.serialize_cstr(buf, val) - buf.put_array(to_utf8(val.to_s).unpack("C*") << 0) - end - - def self.serialize_key(buf, key) - raise InvalidDocument, "Key names / regex patterns must not contain the NULL byte" if key.include? "\x00" - self.serialize_cstr(buf, key) - end - - def to_a - @buf.to_a - end - - def to_s - @buf.to_s - end - - # Serializes an object. - # Implemented to ensure an API compatible with BSON extension. - def self.serialize(obj, check_keys=false, move_id=false) - new.serialize(obj, check_keys, move_id) - end - - def self.deserialize(buf=nil) - new.deserialize(buf) - end - - def serialize(obj, check_keys=false, move_id=false) - raise "Document is null" unless obj - - @buf.rewind - # put in a placeholder for the total size - @buf.put_int(0) - - # Write key/value pairs. Always write _id first if it exists. - if move_id - if obj.has_key? '_id' - serialize_key_value('_id', obj['_id'], false) - elsif obj.has_key? :_id - serialize_key_value('_id', obj[:_id], false) - end - obj.each {|k, v| serialize_key_value(k, v, check_keys) unless k == '_id' || k == :_id } - else - if obj.has_key?('_id') && obj.has_key?(:_id) - obj['_id'] = obj.delete(:_id) - end - obj.each {|k, v| serialize_key_value(k, v, check_keys) } - end - - serialize_eoo_element(@buf) - if @buf.size > 4 * 1024 * 1024 - raise InvalidDocument, "Document is too large (#{@buf.size}). BSON documents are limited to 4MB (#{4 * 1024 * 1024})." - end - @buf.put_int(@buf.size, 0) - self - end - - # Returns the array stored in the buffer. - # Implemented to ensure an API compatible with BSON extension. - def unpack(arg) - @buf.to_a - end - - def serialize_key_value(k, v, check_keys) - k = k.to_s - if check_keys - if k[0] == ?$ - raise InvalidName.new("key #{k} must not start with '$'") - end - if k.include? ?. - raise InvalidName.new("key #{k} must not contain '.'") - end - end - type = bson_type(v) - case type - when STRING, SYMBOL - serialize_string_element(@buf, k, v, type) - when NUMBER, NUMBER_INT - serialize_number_element(@buf, k, v, type) - when OBJECT - serialize_object_element(@buf, k, v, check_keys) - when OID - serialize_oid_element(@buf, k, v) - when ARRAY - serialize_array_element(@buf, k, v, check_keys) - when REGEX - serialize_regex_element(@buf, k, v) - when BOOLEAN - serialize_boolean_element(@buf, k, v) - when DATE - serialize_date_element(@buf, k, v) - when NULL - serialize_null_element(@buf, k) - when REF - serialize_dbref_element(@buf, k, v) - when BINARY - serialize_binary_element(@buf, k, v) - when UNDEFINED - serialize_null_element(@buf, k) - when CODE_W_SCOPE - serialize_code_w_scope(@buf, k, v) - when MAXKEY - serialize_max_key_element(@buf, k) - when MINKEY - serialize_min_key_element(@buf, k) - else - raise "unhandled type #{type}" - end - end - - def deserialize(buf=nil) - # If buf is nil, use @buf, assumed to contain already-serialized BSON. - # This is only true during testing. - if buf.is_a? String - @buf = ByteBuffer.new(buf) if buf - else - @buf = ByteBuffer.new(buf.to_a) if buf - end - @buf.rewind - @buf.get_int # eat message size - doc = OrderedHash.new - while @buf.more? - type = @buf.get - case type - when STRING, CODE - key = deserialize_cstr(@buf) - doc[key] = deserialize_string_data(@buf) - when SYMBOL - key = deserialize_cstr(@buf) - doc[key] = deserialize_string_data(@buf).intern - when NUMBER - key = deserialize_cstr(@buf) - doc[key] = deserialize_number_data(@buf) - when NUMBER_INT - key = deserialize_cstr(@buf) - doc[key] = deserialize_number_int_data(@buf) - when NUMBER_LONG - key = deserialize_cstr(@buf) - doc[key] = deserialize_number_long_data(@buf) - when OID - key = deserialize_cstr(@buf) - doc[key] = deserialize_oid_data(@buf) - when ARRAY - key = deserialize_cstr(@buf) - doc[key] = deserialize_array_data(@buf) - when REGEX - key = deserialize_cstr(@buf) - doc[key] = deserialize_regex_data(@buf) - when OBJECT - key = deserialize_cstr(@buf) - doc[key] = deserialize_object_data(@buf) - when BOOLEAN - key = deserialize_cstr(@buf) - doc[key] = deserialize_boolean_data(@buf) - when DATE - key = deserialize_cstr(@buf) - doc[key] = deserialize_date_data(@buf) - when NULL - key = deserialize_cstr(@buf) - doc[key] = nil - when UNDEFINED - key = deserialize_cstr(@buf) - doc[key] = nil - when REF - key = deserialize_cstr(@buf) - doc[key] = deserialize_dbref_data(@buf) - when BINARY - key = deserialize_cstr(@buf) - doc[key] = deserialize_binary_data(@buf) - when CODE_W_SCOPE - key = deserialize_cstr(@buf) - doc[key] = deserialize_code_w_scope_data(@buf) - when TIMESTAMP - key = deserialize_cstr(@buf) - doc[key] = [deserialize_number_int_data(@buf), - deserialize_number_int_data(@buf)] - when MAXKEY - key = deserialize_cstr(@buf) - doc[key] = MaxKey.new - when MINKEY, 255 # This is currently easier than unpack the type byte as an unsigned char. - key = deserialize_cstr(@buf) - doc[key] = MinKey.new - when EOO - break - else - raise "Unknown type #{type}, key = #{key}" - end - end - @buf.rewind - doc - end - - # For debugging. - def hex_dump - str = '' - @buf.to_a.each_with_index { |b,i| - if (i % 8) == 0 - str << "\n" if i > 0 - str << '%4d: ' % i - else - str << ' ' - end - str << '%02X' % b - } - str - end - - def deserialize_date_data(buf) - unsigned = buf.get_long() - # see note for deserialize_number_long_data below - milliseconds = unsigned >= 2 ** 64 / 2 ? unsigned - 2**64 : unsigned - Time.at(milliseconds.to_f / 1000.0).utc # at() takes fractional seconds - end - - def deserialize_boolean_data(buf) - buf.get == 1 - end - - def deserialize_number_data(buf) - buf.get_double - end - - def deserialize_number_int_data(buf) - # sometimes ruby makes me angry... why would the same code pack as signed - # but unpack as unsigned - unsigned = buf.get_int - unsigned >= 2**32 / 2 ? unsigned - 2**32 : unsigned - end - - def deserialize_number_long_data(buf) - # same note as above applies here... - unsigned = buf.get_long - unsigned >= 2 ** 64 / 2 ? unsigned - 2**64 : unsigned - end - - def deserialize_object_data(buf) - size = buf.get_int - buf.position -= 4 - object = BSON_CODER.new().deserialize(buf.get(size)) - if object.has_key? "$ref" - DBRef.new(object["$ref"], object["$id"]) - else - object - end - end - - def deserialize_array_data(buf) - h = deserialize_object_data(buf) - a = [] - h.each { |k, v| a[k.to_i] = v } - a - end - - def deserialize_regex_data(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') - options_str.gsub!(/[imx]/, '') # Now remove the three we understand - if options_str == '' - Regexp.new(str, options) - else - warn("Using deprecated Regexp options #{options_str}; future versions of this MongoDB driver will support only i, m, and x. See deprecated class RegexpOfHolding for more info.") - RegexpOfHolding.new(str, options, options_str) - end - end - - def deserialize_string_data(buf) - len = buf.get_int - bytes = buf.get(len) - str = bytes[0..-2] - if str.respond_to? "pack" - str = str.pack("C*") - end - if RUBY_VERSION >= '1.9' - str.force_encoding("utf-8") - end - str - end - - def deserialize_code_w_scope_data(buf) - buf.get_int - len = buf.get_int - code = buf.get(len)[0..-2] - if code.respond_to? "pack" - code = code.pack("C*") - end - if RUBY_VERSION >= '1.9' - code.force_encoding("utf-8") - end - - scope_size = buf.get_int - buf.position -= 4 - scope = BSON_CODER.new().deserialize(buf.get(scope_size)) - - Code.new(code, scope) - end - - def deserialize_oid_data(buf) - ObjectID.new(buf.get(12)) - end - - def deserialize_dbref_data(buf) - ns = deserialize_string_data(buf) - oid = deserialize_oid_data(buf) - DBRef.new(ns, oid) - end - - def deserialize_binary_data(buf) - len = buf.get_int - type = buf.get - len = buf.get_int if type == Binary::SUBTYPE_BYTES - Binary.new(buf.get(len), type) - end - - def serialize_eoo_element(buf) - buf.put(EOO) - end - - def serialize_null_element(buf, key) - buf.put(NULL) - self.class.serialize_key(buf, key) - end - - def serialize_dbref_element(buf, key, val) - oh = OrderedHash.new - oh['$ref'] = val.namespace - oh['$id'] = val.object_id - serialize_object_element(buf, key, oh, false) - end - - def serialize_binary_element(buf, key, val) - buf.put(BINARY) - self.class.serialize_key(buf, key) - - bytes = val.to_a - num_bytes = bytes.length - subtype = val.respond_to?(:subtype) ? val.subtype : Binary::SUBTYPE_BYTES - if subtype == Binary::SUBTYPE_BYTES - buf.put_int(num_bytes + 4) - buf.put(subtype) - buf.put_int(num_bytes) - buf.put_array(bytes) - else - buf.put_int(num_bytes) - buf.put(subtype) - buf.put_array(bytes) - end - end - - def serialize_boolean_element(buf, key, val) - buf.put(BOOLEAN) - self.class.serialize_key(buf, key) - buf.put(val ? 1 : 0) - end - - def serialize_date_element(buf, key, val) - buf.put(DATE) - self.class.serialize_key(buf, key) - millisecs = (val.to_f * 1000).to_i - buf.put_long(millisecs) - end - - def serialize_number_element(buf, key, val, type) - if type == NUMBER - buf.put(type) - self.class.serialize_key(buf, key) - buf.put_double(val) - else - if val > 2**64 / 2 - 1 or val < -2**64 / 2 - raise RangeError.new("MongoDB can only handle 8-byte ints") - end - if val > 2**32 / 2 - 1 or val < -2**32 / 2 - buf.put(NUMBER_LONG) - self.class.serialize_key(buf, key) - buf.put_long(val) - else - buf.put(type) - self.class.serialize_key(buf, key) - buf.put_int(val) - end - end - end - - def serialize_object_element(buf, key, val, check_keys, opcode=OBJECT) - buf.put(opcode) - self.class.serialize_key(buf, key) - buf.put_array(BSON_CODER.new.serialize(val, check_keys).to_a) - end - - def serialize_array_element(buf, key, val, check_keys) - # Turn array into hash with integer indices as keys - h = OrderedHash.new - i = 0 - val.each { |v| h[i] = v; i += 1 } - serialize_object_element(buf, key, h, check_keys, ARRAY) - end - - def serialize_regex_element(buf, key, val) - buf.put(REGEX) - self.class.serialize_key(buf, key) - - str = val.source - # We use serialize_key here since regex patterns aren't prefixed with - # length (can't contain the NULL byte). - self.class.serialize_key(buf, str) - - options = val.options - options_str = '' - options_str << 'i' if ((options & Regexp::IGNORECASE) != 0) - options_str << 'm' if ((options & Regexp::MULTILINE) != 0) - options_str << 'x' if ((options & Regexp::EXTENDED) != 0) - options_str << val.extra_options_str if val.respond_to?(:extra_options_str) - # Must store option chars in alphabetical order - self.class.serialize_cstr(buf, options_str.split(//).sort.uniq.join) - end - - def serialize_max_key_element(buf, key) - buf.put(MAXKEY) - self.class.serialize_key(buf, key) - end - - def serialize_min_key_element(buf, key) - buf.put(MINKEY) - self.class.serialize_key(buf, key) - end - - def serialize_oid_element(buf, key, val) - buf.put(OID) - self.class.serialize_key(buf, key) - - buf.put_array(val.to_a) - end - - def serialize_string_element(buf, key, val, type) - buf.put(type) - self.class.serialize_key(buf, key) - - # Make a hole for the length - len_pos = buf.position - buf.put_int(0) - - # Save the string - start_pos = buf.position - self.class.serialize_cstr(buf, val) - end_pos = buf.position - - # Put the string size in front - buf.put_int(end_pos - start_pos, len_pos) - - # Go back to where we were - buf.position = end_pos - end - - def serialize_code_w_scope(buf, key, val) - buf.put(CODE_W_SCOPE) - self.class.serialize_key(buf, key) - - # Make a hole for the length - len_pos = buf.position - buf.put_int(0) - - buf.put_int(val.length + 1) - self.class.serialize_cstr(buf, val) - buf.put_array(BSON_CODER.new.serialize(val.scope).to_a) - - end_pos = buf.position - buf.put_int(end_pos - len_pos, len_pos) - buf.position = end_pos - end - - def deserialize_cstr(buf) - chars = "" - while true - b = buf.get - break if b == 0 - chars << b.chr - end - if RUBY_VERSION >= '1.9' - chars.force_encoding("utf-8") # Mongo stores UTF-8 - end - chars - end - - def bson_type(o) - case o - when nil - NULL - when Integer - NUMBER_INT - when Float - NUMBER - when ByteBuffer - BINARY - when Code - CODE_W_SCOPE - when String - STRING - when Array - ARRAY - when Regexp - REGEX - when ObjectID - OID - when DBRef - REF - when true, false - BOOLEAN - when Time - DATE - when Hash - OBJECT - when Symbol - SYMBOL - when MaxKey - MAXKEY - when MinKey - MINKEY - when Numeric - raise InvalidDocument, "Cannot serialize the Numeric type #{o.class} as BSON; only Fixum, Bignum, and Float are supported." - when Date, DateTime - raise InvalidDocument, "#{o.class} is not currently supported; " + - "use a UTC Time instance instead." - else - if defined?(ActiveSupport::TimeWithZone) && o.is_a?(ActiveSupport::TimeWithZone) - raise InvalidDocument, "ActiveSupport::TimeWithZone is not currently supported; " + - "use a UTC Time instance instead." - else - raise InvalidDocument, "Cannot serialize #{o.class} as a BSON type; it either isn't supported or won't translate to BSON." - end - end - end - - end -end diff --git a/lib/mongo_bson/byte_buffer.rb b/lib/mongo_bson/byte_buffer.rb deleted file mode 100644 index 25e9075..0000000 --- a/lib/mongo_bson/byte_buffer.rb +++ /dev/null @@ -1,222 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -# A byte buffer. -class ByteBuffer - - # Commonly-used integers. - INT_LOOKUP = { - 0 => [0, 0, 0, 0], - 1 => [1, 0, 0, 0], - 2 => [2, 0, 0, 0], - 3 => [3, 0, 0, 0], - 4 => [4, 0, 0, 0], - 2001 => [209, 7, 0, 0], - 2002 => [210, 7, 0, 0], - 2004 => [212, 7, 0, 0], - 2005 => [213, 7, 0, 0], - 2006 => [214, 7, 0, 0] - } - - attr_reader :order - - def initialize(initial_data=[]) - @buf = initial_data - @cursor = @buf.length - @order = :little_endian - @int_pack_order = 'V' - @double_pack_order = 'E' - end - - if RUBY_VERSION >= '1.9' - def self.to_utf8(str) - str.encode("utf-8") - end - else - def self.to_utf8(str) - begin - str.unpack("U*") - rescue => ex - raise InvalidStringEncoding, "String not valid utf-8: #{str}" - end - str - end - end - - def self.serialize_cstr(buf, val) - buf.put_array(to_utf8(val.to_s).unpack("C*") + [0]) - end - - # +endianness+ should be :little_endian or :big_endian. Default is :little_endian - def order=(endianness) - @order = endianness - @int_pack_order = endianness == :little_endian ? 'V' : 'N' - @double_pack_order = endianness == :little_endian ? 'E' : 'G' - end - - def rewind - @cursor = 0 - end - - def position - @cursor - end - - def position=(val) - @cursor = val - end - - def clear - @buf = [] - rewind - end - - def size - @buf.size - end - alias_method :length, :size - - # Appends a second ByteBuffer object, +buffer+, to the current buffer. - def append!(buffer) - @buf = @buf + buffer.to_a - self - end - - # Prepends a second ByteBuffer object, +buffer+, to the current buffer. - def prepend!(buffer) - @buf = buffer.to_a + @buf - self - end - - def put(byte, offset=nil) - @cursor = offset if offset - @buf[@cursor] = byte - @cursor += 1 - end - - def put_array(array, offset=nil) - @cursor = offset if offset - @buf[@cursor, array.length] = array - @cursor += array.length - end - - def put_int(i, offset=nil) - unless a = INT_LOOKUP[i] - a = [] - [i].pack(@int_pack_order).each_byte { |b| a << b } - end - put_array(a, offset) - end - - def put_long(i, offset=nil) - offset = @cursor unless offset - if @int_pack_order == 'N' - put_int(i >> 32, offset) - put_int(i & 0xffffffff, offset + 4) - else - put_int(i & 0xffffffff, offset) - put_int(i >> 32, offset + 4) - end - end - - def put_double(d, offset=nil) - a = [] - [d].pack(@double_pack_order).each_byte { |b| a << b } - put_array(a, offset) - end - - # If +size+ == nil, returns one byte. Else returns array of bytes of length - # # +size+. - def get(len=nil) - one_byte = len.nil? - len ||= 1 - check_read_length(len) - start = @cursor - @cursor += len - if one_byte - @buf[start] - else - if @buf.respond_to? "unpack" - @buf[start, len].unpack("C*") - else - @buf[start, len] - end - end - end - - def get_int - check_read_length(4) - vals = "" - (@cursor..@cursor+3).each { |i| vals << @buf[i].chr } - @cursor += 4 - vals.unpack(@int_pack_order)[0] - end - - def get_long - i1 = get_int - i2 = get_int - if @int_pack_order == 'N' - (i1 << 32) + i2 - else - (i2 << 32) + i1 - end - end - - def get_double - check_read_length(8) - vals = "" - (@cursor..@cursor+7).each { |i| vals << @buf[i].chr } - @cursor += 8 - vals.unpack(@double_pack_order)[0] - end - - def more? - @cursor < @buf.size - end - - def to_a - if @buf.respond_to? "unpack" - @buf.unpack("C*") - else - @buf - end - end - - def unpack(args) - to_a - end - - def to_s - if @buf.respond_to? :fast_pack - @buf.fast_pack - elsif @buf.respond_to? "pack" - @buf.pack("C*") - else - @buf - end - end - - def dump - @buf.each_with_index { |c, i| $stderr.puts "#{'%04d' % i}: #{'%02x' % c} #{'%03o' % c} #{'%s' % c.chr} #{'%3d' % c}" } - end - - private - - def check_read_length(len) - raise "attempt to read past end of buffer" if @cursor + len > @buf.length - end - -end diff --git a/lib/mongo_bson/exceptions.rb b/lib/mongo_bson/exceptions.rb deleted file mode 100644 index 10f5dcb..0000000 --- a/lib/mongo_bson/exceptions.rb +++ /dev/null @@ -1,36 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -module Mongo - # Generic Mongo Ruby Driver exception class. - class MongoRubyError < StandardError; end - - # Raised when MongoDB itself has returned an error. - class MongoDBError < RuntimeError; end - - # Raised when given a string is not valid utf-8 (Ruby 1.8 only). - class InvalidStringEncoding < MongoRubyError; end - - # Raised when attempting to initialize an invalid ObjectID. - class InvalidObjectID < MongoRubyError; end - - # Raised when trying to insert a document that exceeds the 4MB limit or - # when the document contains objects that can't be serialized as BSON. - class InvalidDocument < MongoDBError; end - - # Raised when an invalid name is used. - class InvalidName < RuntimeError; end -end diff --git a/lib/mongo_bson/ordered_hash.rb b/lib/mongo_bson/ordered_hash.rb deleted file mode 100644 index 88a08eb..0000000 --- a/lib/mongo_bson/ordered_hash.rb +++ /dev/null @@ -1,140 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -# A hash in which the order of keys are preserved. -# -# Under Ruby 1.9 and greater, this class has no added methods because Ruby's -# Hash already keeps its keys ordered by order of insertion. -class OrderedHash < Hash - - def ==(other) - begin - !other.nil? && - keys == other.keys && - values == other.values - rescue - false - end - end - - # We only need the body of this class if the RUBY_VERSION is before 1.9 - if RUBY_VERSION < '1.9' - attr_accessor :ordered_keys - - def self.[] *args - oh = OrderedHash.new - if Hash === args[0] - oh.merge! args[0] - elsif (args.size % 2) != 0 - raise ArgumentError, "odd number of elements for Hash" - else - 0.step(args.size - 1, 2) do |key| - value = key + 1 - oh[args[key]] = args[value] - end - end - oh - end - - def initialize(*a, &b) - super - @ordered_keys = [] - end - - def keys - @ordered_keys || [] - end - - def []=(key, value) - @ordered_keys ||= [] - @ordered_keys << key unless @ordered_keys.include?(key) - super(key, value) - end - - def each - @ordered_keys ||= [] - @ordered_keys.each { |k| yield k, self[k] } - self - end - alias :each_pair :each - - def to_a - @ordered_keys ||= [] - @ordered_keys.map { |k| [k, self[k]] } - end - - def values - collect { |k, v| v } - end - - def merge(other) - oh = self.dup - oh.merge!(other) - oh - end - - def merge!(other) - @ordered_keys ||= [] - @ordered_keys += other.keys # unordered if not an OrderedHash - @ordered_keys.uniq! - super(other) - end - - alias :update :merge! - - def inspect - str = '{' - str << (@ordered_keys || []).collect { |k| "\"#{k}\"=>#{self.[](k).inspect}" }.join(", ") - str << '}' - end - - def delete(key, &block) - @ordered_keys.delete(key) if @ordered_keys - super - end - - def delete_if(&block) - self.each { |k,v| - if yield k, v - delete(k) - end - } - end - - def clear - super - @ordered_keys = [] - end - - def hash - code = 17 - each_pair do |key, value| - code = 37 * code + key.hash - code = 37 * code + value.hash - end - code & 0x7fffffff - end - - def eql?(o) - if o.instance_of? OrderedHash - self.hash == o.hash - else - false - end - end - - end -end diff --git a/lib/mongo_bson/types/binary.rb b/lib/mongo_bson/types/binary.rb deleted file mode 100644 index e754c23..0000000 --- a/lib/mongo_bson/types/binary.rb +++ /dev/null @@ -1,54 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -require 'mongo_bson/byte_buffer' - -module Mongo - - # An array of binary bytes with a MongoDB subtype. See the subtype - # constants for reference. - # - # Use this class when storing binary data in documents. - class Binary < ByteBuffer - - SUBTYPE_BYTES = 0x02 - SUBTYPE_UUID = 0x03 - SUBTYPE_MD5 = 0x05 - SUBTYPE_USER_DEFINED = 0x80 - - # One of the SUBTYPE_* constants. Default is SUBTYPE_BYTES. - attr_accessor :subtype - - # Create a buffer for storing binary data in MongoDB. - # - # @param [Array, String] data to story as BSON binary. If a string is given, the value will be - # concerted to an array of bytes using String#unpack("c*"). - # @param [Fixnum] one of four values specifying a BSON binary subtype. Possible values are - # SUBTYPE_BYTES, SUBTYPE_UUID, SUBTYPE_MD5, and SUBTYPE_USER_DEFINED. - # - # @see http://www.mongodb.org/display/DOCS/BSON#BSON-noteondatabinary BSON binary subtypes. - def initialize(data=[], subtype=SUBTYPE_BYTES) - data = data.unpack("c*") if data.is_a?(String) - super(data) - @subtype = subtype - end - - def inspect - "" - end - - end -end diff --git a/lib/mongo_bson/types/code.rb b/lib/mongo_bson/types/code.rb deleted file mode 100644 index c95197d..0000000 --- a/lib/mongo_bson/types/code.rb +++ /dev/null @@ -1,36 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -module Mongo - - # JavaScript code to be evaluated by MongoDB. - class Code < String - - # Hash mapping identifiers to their values - attr_accessor :scope - - # Wrap code to be evaluated by MongoDB. - # - # @param [String] code the JavaScript code. - # @param [Hash] a document mapping identifiers to values, which - # represent the scope in which the code is to be executed. - def initialize(code, scope={}) - super(code) - @scope = scope - end - - end -end diff --git a/lib/mongo_bson/types/dbref.rb b/lib/mongo_bson/types/dbref.rb deleted file mode 100644 index e86a994..0000000 --- a/lib/mongo_bson/types/dbref.rb +++ /dev/null @@ -1,40 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -module Mongo - - # A reference to another object in a MongoDB database. - class DBRef - - attr_reader :namespace, :object_id - - # Create a DBRef. Use this class in conjunction with DB#dereference. - # - # @param [String] a collection name - # @param [ObjectID] an object id - # - # @core dbrefs constructor_details - def initialize(namespace, object_id) - @namespace = namespace - @object_id = object_id - end - - def to_s - "ns: #{namespace}, id: #{object_id}" - end - - end -end diff --git a/lib/mongo_bson/types/min_max_keys.rb b/lib/mongo_bson/types/min_max_keys.rb deleted file mode 100644 index 439892c..0000000 --- a/lib/mongo_bson/types/min_max_keys.rb +++ /dev/null @@ -1,58 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -module Mongo - - # A class representing the BSON MaxKey type. MaxKey will always compare greater than - # all other BSON types and values. - # - # @example Sorting (assume @numbers is a collection): - # - # >> @numbers.save({"n" => Mongo::MaxKey.new}) - # >> @numbers.save({"n" => 0}) - # >> @numbers.save({"n" => 5_000_000}) - # >> @numbers.find.sort("n").to_a - # => [{"_id"=>4b5a050c238d3bace2000004, "n"=>0}, - # {"_id"=>4b5a04e6238d3bace2000002, "n"=>5_000_000}, - # {"_id"=>4b5a04ea238d3bace2000003, "n"=>#}, - # ] - class MaxKey - - def ==(obj) - obj.class == MaxKey - end - end - - # A class representing the BSON MinKey type. MinKey will always compare less than - # all other BSON types and values. - # - # @example Sorting (assume @numbers is a collection): - # - # >> @numbers.save({"n" => Mongo::MinKey.new}) - # >> @numbers.save({"n" => -1_000_000}) - # >> @numbers.save({"n" => 1_000_000}) - # >> @numbers.find.sort("n").to_a - # => [{"_id"=>4b5a050c238d3bace2000004, "n"=>#}, - # {"_id"=>4b5a04e6238d3bace2000002, "n"=>-1_000_000}, - # {"_id"=>4b5a04ea238d3bace2000003, "n"=>1_000_000}, - # ] - class MinKey - - def ==(obj) - obj.class == MinKey - end - end -end diff --git a/lib/mongo_bson/types/objectid.rb b/lib/mongo_bson/types/objectid.rb deleted file mode 100644 index 7339e99..0000000 --- a/lib/mongo_bson/types/objectid.rb +++ /dev/null @@ -1,180 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -require 'thread' -require 'socket' -require 'digest/md5' - -module Mongo - - # Generates MongoDB object ids. - # - # @core objectids - class ObjectID - @@lock = Mutex.new - @@index = 0 - - # Create a new object id. If no parameter is given, an id corresponding - # to the ObjectID BSON data type will be created. This is a 12-byte value - # consisting of a 4-byte timestamp, a 3-byte machine id, a 2-byte process id, - # and a 3-byte counter. - # - # @param [Array] data should be an array of bytes. If you want - # to generate a standard MongoDB object id, leave this argument blank. - def initialize(data=nil) - @data = data || generate - end - - # Determine if the supplied string is legal. Legal strings will - # consist of 24 hexadecimal characters. - # - # @param [String] str - # - # @return [Boolean] - def self.legal?(str) - len = 24 - str =~ /([0-9a-f]+)/i - match = $1 - str && str.length == len && match == str - end - - # Create an object id from the given time. This is useful for doing range - # queries; it works because MongoDB's object ids begin - # with a timestamp. - # - # @param [Time] time a utc time to encode as an object id. - # - # @return [Mongo::ObjectID] - # - # @example Return all document created before Jan 1, 2010. - # time = Time.utc(2010, 1, 1) - # time_id = ObjectID.from_time(time) - # collection.find({'_id' => {'$lt' => time_id}}) - def self.from_time(time) - self.new([time.to_i,0,0].pack("NNN").unpack("C12")) - end - - # Adds a primary key to the given document if needed. - # - # @param [Hash] doc a document requiring an _id. - # - # @return [Mongo::ObjectID, Object] returns a newly-created or - # current _id for the given document. - def self.create_pk(doc) - doc.has_key?(:_id) || doc.has_key?('_id') ? doc : doc.merge!(:_id => self.new) - end - - # Check equality of this object id with another. - # - # @param [Mongo::ObjectID] object_id - def eql?(object_id) - @data == object_id.instance_variable_get("@data") - end - alias_method :==, :eql? - - # Get a unique hashcode for this object. - # This is required since we've defined an #eql? method. - # - # @return [Integer] - def hash - @data.hash - end - - # Get an array representation of the object id. - # - # @return [Array] - def to_a - @data.dup - end - - # Given a string representation of an ObjectID, return a new ObjectID - # with that value. - # - # @param [String] str - # - # @return [Mongo::ObjectID] - def self.from_string(str) - raise InvalidObjectID, "illegal ObjectID format" unless legal?(str) - data = [] - 12.times do |i| - data[i] = str[i * 2, 2].to_i(16) - end - self.new(data) - end - - # Get a string representation of this object id. - # - # @return [String] - def to_s - str = ' ' * 24 - 12.times do |i| - str[i * 2, 2] = '%02x' % @data[i] - end - str - end - - def inspect - "ObjectID('#{to_s}')" - end - - # Convert to MongoDB extended JSON format. Since JSON includes type information, - # but lacks an ObjectID type, this JSON format encodes the type using an $id key. - # - # @return [String] the object id represented as MongoDB extended JSON. - def to_json(escaped=false) - "{\"$oid\": \"#{to_s}\"}" - end - - # Return the UTC time at which this ObjectID was generated. This may - # be used in lieu of a created_at timestamp since this information - # is always encoded in the object id. - # - # @return [Time] the time at which this object was created. - def generation_time - Time.at(@data.pack("C4").unpack("N")[0]).utc - end - - private - - # We need to define this method only if CBson isn't loaded. - unless defined? CBson - def generate - oid = '' - - # 4 bytes current time - time = Time.new.to_i - oid += [time].pack("N") - - # 3 bytes machine - oid += Digest::MD5.digest(Socket.gethostname)[0, 3] - - # 2 bytes pid - oid += [Process.pid % 0xFFFF].pack("n") - - # 3 bytes inc - oid += [get_inc].pack("N")[1, 3] - - oid.unpack("C12") - end - end - - def get_inc - @@lock.synchronize do - @@index = (@@index + 1) % 0xFFFFFF - end - end - end -end diff --git a/lib/mongo_bson/types/regexp_of_holding.rb b/lib/mongo_bson/types/regexp_of_holding.rb deleted file mode 100644 index b36a875..0000000 --- a/lib/mongo_bson/types/regexp_of_holding.rb +++ /dev/null @@ -1,45 +0,0 @@ -# -- -# Copyright (C) 2008-2010 10gen Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ++ - -module Mongo - - # A Regexp that can hold on to extra options and ignore them. Mongo - # regexes may contain option characters beyond 'i', 'm', and 'x'. (Note - # that Mongo only uses those three, but that regexes coming from other - # languages may store different option characters.) - # - # Note that you do not have to use this class at all if you wish to - # store regular expressions in Mongo. The Mongo and Ruby regex option - # flags are the same. Storing regexes is discouraged, in any case. - # - # @deprecated - class RegexpOfHolding < Regexp - - attr_accessor :extra_options_str - - # @deprecated we're no longer supporting this. - # +str+ and +options+ are the same as Regexp. +extra_options_str+ - # contains all the other flags that were in Mongo but we do not use or - # understand. - def initialize(str, options, extra_options_str) - warn "RegexpOfHolding is deprecated; the modifiers i, m, and x will be stored automatically as BSON." + - "If you're only storing the options i, m, and x, you can safely ignore this message." - super(str, options) - @extra_options_str = extra_options_str - end - end - -end diff --git a/test/collection_test.rb b/test/collection_test.rb index 8d00569..051b127 100644 --- a/test/collection_test.rb +++ b/test/collection_test.rb @@ -12,9 +12,9 @@ class TestCollection < Test::Unit::TestCase def test_optional_pk_factory @coll_default_pk = @@db.collection('stuff') - assert_equal Mongo::ObjectID, @coll_default_pk.pk_factory + assert_equal BSON::ObjectID, @coll_default_pk.pk_factory @coll_default_pk = @@db.create_collection('more-stuff') - assert_equal Mongo::ObjectID, @coll_default_pk.pk_factory + assert_equal BSON::ObjectID, @coll_default_pk.pk_factory # Create a db with a pk_factory. @db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost', @@ -27,11 +27,11 @@ class TestCollection < Test::Unit::TestCase end def test_valid_names - assert_raise InvalidName do + assert_raise Mongo::InvalidName do @@db["te$t"] end - assert_raise InvalidName do + assert_raise Mongo::InvalidName do @@db['$main'] end diff --git a/test/conversions_test.rb b/test/conversions_test.rb index 92ded18..3069fe2 100644 --- a/test/conversions_test.rb +++ b/test/conversions_test.rb @@ -1,7 +1,7 @@ require 'test/test_helper' require 'mongo/exceptions' require 'mongo/util/conversions' -require 'mongo_bson/ordered_hash' +require 'bson/ordered_hash' class ConversionsTest < Test::Unit::TestCase include Mongo::Conversions diff --git a/test/mongo_bson/binary_test.rb b/test/mongo_bson/binary_test.rb index cc84126..91a6e76 100644 --- a/test/mongo_bson/binary_test.rb +++ b/test/mongo_bson/binary_test.rb @@ -8,7 +8,7 @@ class BinaryTest < Test::Unit::TestCase end should "not display actual data" do - binary = Mongo::Binary.new(@data) + binary = BSON::Binary.new(@data) assert_equal "", binary.inspect end end diff --git a/test/mongo_bson/bson_test.rb b/test/mongo_bson/bson_test.rb index d37df63..e6e12fe 100644 --- a/test/mongo_bson/bson_test.rb +++ b/test/mongo_bson/bson_test.rb @@ -20,8 +20,7 @@ end class BSONTest < Test::Unit::TestCase - include Mongo - + include BSON def test_deprecated_bson_module doc = {'doc' => 'hello, world'} @@ -31,26 +30,26 @@ class BSONTest < Test::Unit::TestCase def test_string doc = {'doc' => 'hello, world'} - bson = bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_valid_utf8_string doc = {'doc' => 'aé'} - bson = bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_valid_utf8_key doc = {'aé' => 'hello'} - bson = bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_document_length doc = {'name' => 'a' * 5 * 1024 * 1024} assert_raise InvalidDocument do - assert Mongo::BSON_CODER.serialize(doc) + assert BSON::BSON_CODER.serialize(doc) end end @@ -62,7 +61,7 @@ class BSONTest < Test::Unit::TestCase string = Iconv.conv('iso-8859-1', 'utf-8', 'aé') doc = {'doc' => string} assert_raise InvalidStringEncoding do - Mongo::BSON_CODER.serialize(doc) + BSON::BSON_CODER.serialize(doc) end end @@ -70,51 +69,51 @@ class BSONTest < Test::Unit::TestCase key = Iconv.conv('iso-8859-1', 'utf-8', 'aé') doc = {key => 'hello'} assert_raise InvalidStringEncoding do - Mongo::BSON_CODER.serialize(doc) + BSON::BSON_CODER.serialize(doc) end end else def test_non_utf8_string - bson = Mongo::BSON_CODER.serialize({'str' => 'aé'.encode('iso-8859-1')}) - result = Mongo::BSON_CODER.deserialize(bson)['str'] + bson = BSON::BSON_CODER.serialize({'str' => 'aé'.encode('iso-8859-1')}) + result = BSON::BSON_CODER.deserialize(bson)['str'] assert_equal 'aé', result assert_equal 'UTF-8', result.encoding.name end def test_non_utf8_key - bson = Mongo::BSON_CODER.serialize({'aé'.encode('iso-8859-1') => 'hello'}) - assert_equal 'hello', Mongo::BSON_CODER.deserialize(bson)['aé'] + bson = BSON::BSON_CODER.serialize({'aé'.encode('iso-8859-1') => 'hello'}) + assert_equal 'hello', BSON::BSON_CODER.deserialize(bson)['aé'] end end def test_code doc = {'$where' => Code.new('this.a.b < this.b')} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_number doc = {'doc' => 41.99} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_int doc = {'doc' => 42} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) doc = {"doc" => -5600} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) doc = {"doc" => 2147483647} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) doc = {"doc" => -2147483648} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_ordered_hash @@ -123,32 +122,32 @@ class BSONTest < Test::Unit::TestCase doc["a"] = 2 doc["c"] = 3 doc["d"] = 4 - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_object doc = {'doc' => {'age' => 42, 'name' => 'Spongebob', 'shoe_size' => 9.5}} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_oid doc = {'doc' => ObjectID.new} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_array doc = {'doc' => [1, 2, 'a', 'b']} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_regex doc = {'doc' => /foobar/i} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) assert_equal doc, doc2 r = doc2['doc'] @@ -158,9 +157,9 @@ class BSONTest < Test::Unit::TestCase assert_equal 'zywcab', r.extra_options_str doc = {'doc' => r} - bson_doc = Mongo::BSON_CODER.serialize(doc) + bson_doc = BSON::BSON_CODER.serialize(doc) doc2 = nil - doc2 = Mongo::BSON_CODER.deserialize(bson_doc) + doc2 = BSON::BSON_CODER.deserialize(bson_doc) assert_equal doc, doc2 r = doc2['doc'] @@ -170,30 +169,30 @@ class BSONTest < Test::Unit::TestCase def test_boolean doc = {'doc' => true} - bson = Mongo::BSON_CODER.serialize(doc) - assert_equal doc, Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + assert_equal doc, BSON::BSON_CODER.deserialize(bson) end def test_date doc = {'date' => Time.now} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) # Mongo only stores up to the millisecond assert_in_delta doc['date'], doc2['date'], 0.001 end def test_date_returns_as_utc doc = {'date' => Time.now} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) assert doc2['date'].utc? end def test_date_before_epoch begin doc = {'date' => Time.utc(1600)} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) # Mongo only stores up to the millisecond assert_in_delta doc['date'], doc2['date'], 0.001 rescue ArgumentError @@ -208,7 +207,7 @@ class BSONTest < Test::Unit::TestCase [DateTime.now, Date.today, Zone].each do |invalid_date| doc = {:date => invalid_date} begin - bson = Mongo::BSON_CODER.serialize(doc) + bson = BSON::BSON_CODER.serialize(doc) rescue => e ensure if !invalid_date.is_a? Time @@ -223,16 +222,16 @@ class BSONTest < Test::Unit::TestCase oid = ObjectID.new doc = {} doc['dbref'] = DBRef.new('namespace', oid) - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) assert_equal 'namespace', doc2['dbref'].namespace assert_equal oid, doc2['dbref'].object_id end def test_symbol doc = {'sym' => :foo} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) assert_equal :foo, doc2['sym'] end @@ -241,8 +240,8 @@ class BSONTest < Test::Unit::TestCase 'binstring'.each_byte { |b| bin.put(b) } doc = {'bin' => bin} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) bin2 = doc2['bin'] assert_kind_of Binary, bin2 assert_equal 'binstring', bin2.to_s @@ -252,8 +251,8 @@ class BSONTest < Test::Unit::TestCase def test_binary_with_string b = Binary.new('somebinarystring') doc = {'bin' => b} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) bin2 = doc2['bin'] assert_kind_of Binary, bin2 assert_equal 'somebinarystring', bin2.to_s @@ -264,8 +263,8 @@ class BSONTest < Test::Unit::TestCase bin = Binary.new([1, 2, 3, 4, 5], Binary::SUBTYPE_USER_DEFINED) doc = {'bin' => bin} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) bin2 = doc2['bin'] assert_kind_of Binary, bin2 assert_equal [1, 2, 3, 4, 5], bin2.to_a @@ -277,8 +276,8 @@ class BSONTest < Test::Unit::TestCase 5.times { |i| bb.put(i + 1) } doc = {'bin' => bb} - bson = Mongo::BSON_CODER.serialize(doc) - doc2 = Mongo::BSON_CODER.deserialize(bson) + bson = BSON::BSON_CODER.serialize(doc) + doc2 = BSON::BSON_CODER.deserialize(bson) bin2 = doc2['bin'] assert_kind_of Binary, bin2 assert_equal [1, 2, 3, 4, 5], bin2.to_a @@ -289,24 +288,24 @@ class BSONTest < Test::Unit::TestCase val = OrderedHash.new val['not_id'] = 1 val['_id'] = 2 - roundtrip = Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(val, false, true).to_a) + roundtrip = BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(val, false, true).to_a) assert_kind_of OrderedHash, roundtrip assert_equal '_id', roundtrip.keys.first val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'} - roundtrip = Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(val, false, true).to_a) + roundtrip = BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(val, false, true).to_a) assert_kind_of OrderedHash, roundtrip assert_equal '_id', roundtrip.keys.first end def test_nil_id doc = {"_id" => nil} - assert_equal doc, Mongo::BSON_CODER.deserialize(bson = Mongo::BSON_CODER.serialize(doc, false, true).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(bson = BSON::BSON_CODER.serialize(doc, false, true).to_a) end def test_timestamp val = {"test" => [4, 20]} - assert_equal val, Mongo::BSON_CODER.deserialize([0x13, 0x00, 0x00, 0x00, + assert_equal val, BSON::BSON_CODER.deserialize([0x13, 0x00, 0x00, 0x00, 0x11, 0x74, 0x65, 0x73, 0x74, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, @@ -316,29 +315,29 @@ class BSONTest < Test::Unit::TestCase def test_overflow doc = {"x" => 2**75} assert_raise RangeError do - bson = Mongo::BSON_CODER.serialize(doc) + bson = BSON::BSON_CODER.serialize(doc) end doc = {"x" => 9223372036854775} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) doc = {"x" => 9223372036854775807} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) doc["x"] = doc["x"] + 1 assert_raise RangeError do - bson = Mongo::BSON_CODER.serialize(doc) + bson = BSON::BSON_CODER.serialize(doc) end doc = {"x" => -9223372036854775} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) doc = {"x" => -9223372036854775808} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) doc["x"] = doc["x"] - 1 assert_raise RangeError do - bson = Mongo::BSON_CODER.serialize(doc) + bson = BSON::BSON_CODER.serialize(doc) end end @@ -346,7 +345,7 @@ class BSONTest < Test::Unit::TestCase [BigDecimal.new("1.0"), Complex(0, 1), Rational(2, 3)].each do |type| doc = {"x" => type} begin - Mongo::BSON_CODER.serialize(doc) + BSON::BSON_CODER.serialize(doc) rescue => e ensure assert_equal InvalidDocument, e.class @@ -360,12 +359,12 @@ class BSONTest < Test::Unit::TestCase val['not_id'] = 1 val['_id'] = 2 assert val.keys.include?('_id') - Mongo::BSON_CODER.serialize(val) + BSON::BSON_CODER.serialize(val) assert val.keys.include?('_id') val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'} assert val.keys.include?(:_id) - Mongo::BSON_CODER.serialize(val) + BSON::BSON_CODER.serialize(val) assert val.keys.include?(:_id) end @@ -380,50 +379,50 @@ class BSONTest < Test::Unit::TestCase dup = {"_id" => "foo", :_id => "foo"} one = {"_id" => "foo"} - assert_equal Mongo::BSON_CODER.serialize(one).to_a, Mongo::BSON_CODER.serialize(dup).to_a + assert_equal BSON::BSON_CODER.serialize(one).to_a, BSON::BSON_CODER.serialize(dup).to_a end def test_no_duplicate_id_when_moving_id dup = {"_id" => "foo", :_id => "foo"} one = {:_id => "foo"} - assert_equal Mongo::BSON_CODER.serialize(one, false, true).to_s, Mongo::BSON_CODER.serialize(dup, false, true).to_s + assert_equal BSON::BSON_CODER.serialize(one, false, true).to_s, BSON::BSON_CODER.serialize(dup, false, true).to_s end def test_null_character doc = {"a" => "\x00"} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) assert_raise InvalidDocument do - Mongo::BSON_CODER.serialize({"\x00" => "a"}) + BSON::BSON_CODER.serialize({"\x00" => "a"}) end assert_raise InvalidDocument do - Mongo::BSON_CODER.serialize({"a" => (Regexp.compile "ab\x00c")}) + BSON::BSON_CODER.serialize({"a" => (Regexp.compile "ab\x00c")}) end end def test_max_key doc = {"a" => MaxKey.new} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) end def test_min_key doc = {"a" => MinKey.new} - assert_equal doc, Mongo::BSON_CODER.deserialize(Mongo::BSON_CODER.serialize(doc).to_a) + assert_equal doc, BSON::BSON_CODER.deserialize(BSON::BSON_CODER.serialize(doc).to_a) end def test_invalid_object o = Object.new assert_raise InvalidDocument do - Mongo::BSON_CODER.serialize({:foo => o}) + BSON::BSON_CODER.serialize({:foo => o}) end assert_raise InvalidDocument do - Mongo::BSON_CODER.serialize({:foo => Date.today}) + BSON::BSON_CODER.serialize({:foo => Date.today}) end end @@ -436,10 +435,10 @@ class BSONTest < Test::Unit::TestCase assert_equal ")\000\000\000\020_id\000\001\000\000\000\002text" + "\000\004\000\000\000abc\000\002key\000\004\000\000\000abc\000\000", - Mongo::BSON_CODER.serialize(a, false, true).to_s + BSON::BSON_CODER.serialize(a, false, true).to_s assert_equal ")\000\000\000\002text\000\004\000\000\000abc\000\002key" + "\000\004\000\000\000abc\000\020_id\000\001\000\000\000\000", - Mongo::BSON_CODER.serialize(a, false, false).to_s + BSON::BSON_CODER.serialize(a, false, false).to_s end def test_move_id_with_nested_doc @@ -453,11 +452,11 @@ class BSONTest < Test::Unit::TestCase assert_equal ">\000\000\000\020_id\000\003\000\000\000\002text" + "\000\004\000\000\000abc\000\003hash\000\034\000\000" + "\000\002text\000\004\000\000\000abc\000\020_id\000\002\000\000\000\000\000", - Mongo::BSON_CODER.serialize(c, false, true).to_s + BSON::BSON_CODER.serialize(c, false, true).to_s assert_equal ">\000\000\000\002text\000\004\000\000\000abc\000\003hash" + "\000\034\000\000\000\002text\000\004\000\000\000abc\000\020_id" + "\000\002\000\000\000\000\020_id\000\003\000\000\000\000", - Mongo::BSON_CODER.serialize(c, false, false).to_s + BSON::BSON_CODER.serialize(c, false, false).to_s end if defined?(HashWithIndifferentAccess) @@ -467,12 +466,12 @@ class BSONTest < Test::Unit::TestCase embedded['_id'] = ObjectID.new doc['_id'] = ObjectID.new doc['embedded'] = [embedded] - Mongo::BSON_CODER.serialize(doc, false, true).to_a + BSON::BSON_CODER.serialize(doc, false, true).to_a assert doc.has_key?("_id") assert doc['embedded'][0].has_key?("_id") doc['_id'] = ObjectID.new - Mongo::BSON_CODER.serialize(doc, false, true).to_a + BSON::BSON_CODER.serialize(doc, false, true).to_a assert doc.has_key?("_id") end end diff --git a/test/mongo_bson/byte_buffer_test.rb b/test/mongo_bson/byte_buffer_test.rb index 7770a1d..34516d8 100644 --- a/test/mongo_bson/byte_buffer_test.rb +++ b/test/mongo_bson/byte_buffer_test.rb @@ -1,6 +1,7 @@ require 'test/test_helper' class ByteBufferTest < Test::Unit::TestCase + include BSON def setup @buf = ByteBuffer.new diff --git a/test/mongo_bson/objectid_test.rb b/test/mongo_bson/objectid_test.rb index 6cff360..27f841e 100644 --- a/test/mongo_bson/objectid_test.rb +++ b/test/mongo_bson/objectid_test.rb @@ -3,6 +3,7 @@ require 'test/test_helper' class ObjectIDTest < Test::Unit::TestCase include Mongo + include BSON def setup @o = ObjectID.new diff --git a/test/test_helper.rb b/test/test_helper.rb index 06b1ca7..ce71eb1 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -19,11 +19,12 @@ MSG exit end -require 'mongo_ext/cbson' if ENV['C_EXT'] +require 'bson_ext/cbson' if ENV['C_EXT'] # NOTE: most tests assume that MongoDB is running. class Test::Unit::TestCase include Mongo + include BSON # Generic code for rescuing connection failures and retrying operations. # This could be combined with some timeout functionality. diff --git a/test/unit/collection_test.rb b/test/unit/collection_test.rb index aa44d38..56ce4bb 100644 --- a/test/unit/collection_test.rb +++ b/test/unit/collection_test.rb @@ -41,9 +41,9 @@ class CollectionTest < Test::Unit::TestCase @conn = Connection.new('localhost', 27017, :logger => @logger, :connect => false) @db = @conn['testing'] @coll = @db.collection('books') - data = Mongo::Binary.new(("BINARY " * 1000).unpack("c*")) + data = BSON::Binary.new(("BINARY " * 1000).unpack("c*")) @conn.expects(:send_message).with do |op, msg, log| - op == 2002 && log.include?("Mongo::Binary") + op == 2002 && log.include?("BSON::Binary") end @coll.insert({:data => data}) end diff --git a/test/unit/db_test.rb b/test/unit/db_test.rb index 75ddfb0..cc29be9 100644 --- a/test/unit/db_test.rb +++ b/test/unit/db_test.rb @@ -53,7 +53,7 @@ class DBTest < Test::Unit::TestCase should "raise an error if logging out fails" do @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.logout end end @@ -61,35 +61,35 @@ class DBTest < Test::Unit::TestCase should "raise an error if collection creation fails" do @db.expects(:collection_names).returns([]) @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.create_collection("foo") end end should "raise an error if getlasterror fails" do @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.error end end should "raise an error if rename fails" do @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.rename_collection("foo", "bar") end end should "raise an error if drop_index fails" do @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.drop_index("foo", "bar") end end should "raise an error if set_profiling_level fails" do @db.expects(:command).returns({}) - assert_raise MongoDBError do + assert_raise Mongo::MongoDBError do @db.profiling_level = :slow_only end end