2
* Copyright (C) 2012 10gen Inc.
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU Affero General Public License, version 3,
6
* as published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Affero General Public License for more details.
13
* You should have received a copy of the GNU Affero General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
#include "mongo/s/field_parser.h"
18
#include "mongo/util/mongoutils/str.h"
22
using mongoutils::str::stream;
25
void _genFieldErrMsg(const BSONObj& doc,
26
const BSONField<T>& field,
27
const string expected,
31
*errMsg = stream() << "wrong type for '" << field() << "' field, expected " << expected
32
<< ", found " << doc[field.name()].toString();
35
FieldParser::FieldState FieldParser::extract(BSONObj doc,
36
const BSONField<bool>& field,
40
BSONElement elem = doc[field.name()];
42
if (field.hasDefault()) {
43
*out = field.getDefault();
51
if (elem.type() == Bool) {
52
*out = elem.boolean();
56
_genFieldErrMsg(doc, field, "boolean", errMsg);
60
FieldParser::FieldState FieldParser::extract(BSONObj doc,
61
const BSONField<BSONArray>& field,
65
BSONElement elem = doc[field.name()];
67
if (field.hasDefault()) {
68
*out = field.getDefault();
76
if (elem.type() == Array) {
77
*out = BSONArray(elem.embeddedObject().getOwned());
81
_genFieldErrMsg(doc, field, "array", errMsg);
85
FieldParser::FieldState FieldParser::extract(BSONObj doc,
86
const BSONField<BSONObj>& field,
90
BSONElement elem = doc[field.name()];
92
if (field.hasDefault()) {
93
*out = field.getDefault();
101
if (elem.type() == Object) {
102
*out = elem.embeddedObject().getOwned();
106
_genFieldErrMsg(doc, field, "object", errMsg);
107
return FIELD_INVALID;
110
FieldParser::FieldState FieldParser::extract(BSONObj doc,
111
const BSONField<Date_t>& field,
115
BSONElement elem = doc[field.name()];
117
if (field.hasDefault()) {
118
*out = field.getDefault();
119
return FIELD_DEFAULT;
126
if (elem.type() == Date) {
131
_genFieldErrMsg(doc, field, "date or timestamp", errMsg);
132
return FIELD_INVALID;
135
FieldParser::FieldState FieldParser::extract(BSONObj doc,
136
const BSONField<string>& field,
140
BSONElement elem = doc[field.name()];
142
if (field.hasDefault()) {
143
*out = field.getDefault();
144
return FIELD_DEFAULT;
151
if (elem.type() == String) {
152
*out = elem.valuestr();
156
_genFieldErrMsg(doc, field, "string", errMsg);
157
return FIELD_INVALID;
160
FieldParser::FieldState FieldParser::extract(BSONObj doc,
161
const BSONField<OID>& field,
165
BSONElement elem = doc[field.name()];
167
if (field.hasDefault()) {
168
*out = field.getDefault();
169
return FIELD_DEFAULT;
176
if (elem.type() == jstOID) {
181
_genFieldErrMsg(doc, field, "OID", errMsg);
182
return FIELD_INVALID;
185
FieldParser::FieldState FieldParser::extract(BSONObj doc,
186
const BSONField<int>& field,
190
BSONElement elem = doc[field.name()];
192
if (field.hasDefault()) {
193
*out = field.getDefault();
194
return FIELD_DEFAULT;
201
if (elem.type() == NumberInt) {
202
*out = elem.numberInt();
206
_genFieldErrMsg(doc, field, "integer", errMsg);
207
return FIELD_INVALID;
210
FieldParser::FieldState FieldParser::extractNumber(BSONObj doc,
211
const BSONField<int>& field,
215
BSONElement elem = doc[field.name()];
217
if (field.hasDefault()) {
218
*out = field.getDefault();
219
return FIELD_DEFAULT;
226
if (elem.isNumber()) {
227
*out = elem.numberInt();
231
_genFieldErrMsg(doc, field, "number", errMsg);
232
return FIELD_INVALID;
235
FieldParser::FieldState FieldParser::extract(BSONObj doc,
236
const BSONField<long long>& field,
240
BSONElement elem = doc[field.name()];
242
if (field.hasDefault()) {
243
*out = field.getDefault();
244
return FIELD_DEFAULT;
251
if (elem.type() == NumberLong) {
252
*out = elem.numberLong();
256
_genFieldErrMsg(doc, field, "long", errMsg);
257
return FIELD_INVALID;
260
FieldParser::FieldState FieldParser::extractNumber(BSONObj doc,
261
const BSONField<long long>& field,
265
BSONElement elem = doc[field.name()];
267
if (field.hasDefault()) {
268
*out = field.getDefault();
269
return FIELD_DEFAULT;
276
if (elem.isNumber()) {
277
*out = elem.numberLong();
281
_genFieldErrMsg(doc, field, "number", errMsg);
282
return FIELD_INVALID;