69 lines
1.4 KiB
Ruby
69 lines
1.4 KiB
Ruby
|
require 'mongo/util/bson'
|
||
|
require 'mongo/util/byte_buffer'
|
||
|
|
||
|
module XGen
|
||
|
module Mongo
|
||
|
module Driver
|
||
|
|
||
|
class Message
|
||
|
|
||
|
HEADER_SIZE = 16 # size, id, response_to, opcode
|
||
|
|
||
|
@@class_req_id = 0
|
||
|
|
||
|
attr_reader :buf # for testing
|
||
|
|
||
|
def initialize(op)
|
||
|
@op = op
|
||
|
@message_length = HEADER_SIZE
|
||
|
@data_length = 0
|
||
|
@request_id = (@@class_req_id += 1)
|
||
|
@response_id = 0
|
||
|
@buf = ByteBuffer.new
|
||
|
|
||
|
@buf.put_int(16) # holder for length
|
||
|
@buf.put_int(@@class_req_id += 1)
|
||
|
@buf.put_int(0) # response_to
|
||
|
@buf.put_int(op)
|
||
|
end
|
||
|
|
||
|
def write_int(i)
|
||
|
@buf.put_int(i)
|
||
|
update_message_length
|
||
|
end
|
||
|
|
||
|
def write_long(i)
|
||
|
@buf.put_long(i)
|
||
|
update_message_length
|
||
|
end
|
||
|
|
||
|
def write_string(s)
|
||
|
BSON.serialize_cstr(@buf, s)
|
||
|
update_message_length
|
||
|
end
|
||
|
|
||
|
def write_doc(hash)
|
||
|
@buf.put_array(BSON.new.serialize(hash).to_a)
|
||
|
update_message_length
|
||
|
end
|
||
|
|
||
|
def to_a
|
||
|
@buf.to_a
|
||
|
end
|
||
|
|
||
|
def dump
|
||
|
@buf.dump
|
||
|
end
|
||
|
|
||
|
# Do not call. Private, but kept public for testing.
|
||
|
def update_message_length
|
||
|
pos = @buf.position
|
||
|
@buf.put_int(@buf.size, 0)
|
||
|
@buf.position = pos
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|