summaryrefslogtreecommitdiff
path: root/src/mongo/db/field_parser-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/field_parser-inl.h')
-rw-r--r--src/mongo/db/field_parser-inl.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/mongo/db/field_parser-inl.h b/src/mongo/db/field_parser-inl.h
index a5a5fc025a0..41ab4e1683d 100644
--- a/src/mongo/db/field_parser-inl.h
+++ b/src/mongo/db/field_parser-inl.h
@@ -75,6 +75,40 @@ namespace mongo {
template<typename T>
FieldParser::FieldState FieldParser::extract(BSONObj doc,
+ const BSONField<T*>& field,
+ T** out,
+ string* errMsg)
+ {
+ BSONElement elem = doc[field.name()];
+ if (elem.eoo()) {
+ if (field.hasDefault()) {
+ auto_ptr<T> temp(new T);
+ field.getDefault()->cloneTo(temp.get());
+
+ *out = temp.release();
+ return FIELD_DEFAULT;
+ }
+ else {
+ return FIELD_NONE;
+ }
+ }
+
+ if (elem.type() != Object && elem.type() != Array) {
+ _genFieldErrMsg(doc, field, "Object/Array", errMsg);
+ return FIELD_INVALID;
+ }
+
+ auto_ptr<T> temp(new T);
+ if (!temp->parseBSON(elem.embeddedObject(), errMsg)) {
+ return FIELD_INVALID;
+ }
+
+ *out = temp.release();
+ return FIELD_SET;
+ }
+
+ template<typename T>
+ FieldParser::FieldState FieldParser::extract(BSONObj doc,
const BSONField<T>& field,
T** out,
string* errMsg)