2009-02-15 13:24:14 +00:00
|
|
|
# --
|
|
|
|
# Copyright (C) 2008-2009 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.
|
|
|
|
# ++
|
|
|
|
|
2008-11-22 01:00:51 +00:00
|
|
|
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
|
2009-01-04 15:02:32 +00:00
|
|
|
@buf.put_int(@request_id)
|
2008-11-22 01:00:51 +00:00
|
|
|
@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
|