#
# Copyright 2014 MongoDB, 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
#
#
# 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.
#
package
MongoDB::Role::_CommandOp;
# MongoDB interface for database command operations
use
version;
our
$VERSION
=
'v0.999.999.3'
;
# TRIAL
use
MongoDB::BSON;
use
MongoDB::Error;
use
MongoDB::_Protocol;
use
Moose::Role;
requires
qw/db_name/
;
use
constant {
MAX_BSON_WIRE_SIZE
=> 16_793_600,
# 16MiB + 16KiB
};
# XXX should pass in a read preference and modify doc accordingly
sub
_send_command {
my
(
$self
,
$link
,
$doc
,
$flags
) =
@_
;
my
$command
=
$self
->bson_codec->encode_one(
$doc
);
my
(
$op_bson
,
$request_id
) =
MongoDB::_Protocol::write_query(
$self
->db_name .
'.$cmd'
,
$command
,
undef
, 0, -1,
$flags
);
if
(
length
(
$op_bson
) > MAX_BSON_WIRE_SIZE ) {
# XXX should this become public?
MongoDB::_CommandSizeError->throw(
message
=>
"database command too large"
,
size
=>
length
$op_bson
,
);
}
# return a raw, parsed result, not an object
return
$self
->_query_and_receive(
$link
,
$op_bson
,
$request_id
,
undef
, 1 )
->{docs}[0];
}
1;