diff options
author | Scott Hernandez <scotthernandez@gmail.com> | 2013-10-11 09:08:42 -0400 |
---|---|---|
committer | Scott Hernandez <scotthernandez@gmail.com> | 2013-10-11 09:08:42 -0400 |
commit | b2bda16ef3c0ad75b0ee63bac65842d4de513470 (patch) | |
tree | 69fb96005afa356e30dd1b1386b5709d85df24c6 /src/mongo/db | |
parent | 410a9ee2999b1f5ae2bb4d8585f157915adcc7ed (diff) | |
download | mongo-b2bda16ef3c0ad75b0ee63bac65842d4de513470.tar.gz |
SERVER-11136 - Support json parsing of NumberLong/Int
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/jsobj.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/json.cpp | 55 | ||||
-rw-r--r-- | src/mongo/db/json.h | 14 |
3 files changed, 80 insertions, 1 deletions
diff --git a/src/mongo/db/jsobj.cpp b/src/mongo/db/jsobj.cpp index 864377cdcab..bee99426f9a 100644 --- a/src/mongo/db/jsobj.cpp +++ b/src/mongo/db/jsobj.cpp @@ -78,9 +78,19 @@ namespace mongo { s << '"' << escape( string(valuestr(), valuestrsize()-1) ) << '"'; break; case NumberLong: - s << _numberLong(); +/* TODO: Enable when SERVER-11135 fixed + if(format == JS) { + s << "NumberLong(" << _numberLong() << ")"; + } + else +*/ + s << _numberLong(); break; case NumberInt: + if(format == JS) { + s << "NumberInt(" << _numberInt() << ")"; + break; + } case NumberDouble: if ( number() >= -numeric_limits< double >::max() && number() <= numeric_limits< double >::max() ) { diff --git a/src/mongo/db/json.cpp b/src/mongo/db/json.cpp index c6df7953c62..d0e2d474f69 100644 --- a/src/mongo/db/json.cpp +++ b/src/mongo/db/json.cpp @@ -112,6 +112,18 @@ namespace mongo { return ret; } } + else if (readToken("NumberLong")) { + Status ret = numberLong(fieldName, builder); + if (ret != Status::OK()) { + return ret; + } + } + else if (readToken("NumberInt")) { + Status ret = numberInt(fieldName, builder); + if (ret != Status::OK()) { + return ret; + } + } else if (readToken("Dbref") || readToken("DBRef")) { Status ret = dbRef(fieldName, builder); if (ret != Status::OK()) { @@ -654,6 +666,49 @@ namespace mongo { return Status::OK(); } + Status JParse::numberLong(const StringData& fieldName, BSONObjBuilder& builder) { + if (!readToken(LPAREN)) { + return parseError("Expecting '('"); + } + errno = 0; + char* endptr; + int64_t val = strtoll(_input, &endptr, 10); + if (errno == ERANGE) { + return parseError("NumberLong out of range"); + } + if (_input == endptr) { + return parseError("Expecting unsigned number in NumberLong"); + } + _input = endptr; + if (!readToken(RPAREN)) { + return parseError("Expecting ')'"); + } + builder.appendNumber(fieldName, val); + return Status::OK(); + } + + Status JParse::numberInt(const StringData& fieldName, BSONObjBuilder& builder) { + if (!readToken(LPAREN)) { + return parseError("Expecting '('"); + } + errno = 0; + char* endptr; + int32_t val = strtol(_input, &endptr, 10); + if (errno == ERANGE) { + return parseError("NumberInt out of range"); + } + if (_input == endptr) { + return parseError("Expecting unsigned number in NumberInt"); + } + _input = endptr; + if (!readToken(RPAREN)) { + return parseError("Expecting ')'"); + } + builder.appendNumber(fieldName, val); + return Status::OK(); + } + + Status JParse::dbRef(const StringData& fieldName, BSONObjBuilder& builder) { BSONObjBuilder subBuilder(builder.subobjStart(fieldName)); diff --git a/src/mongo/db/json.h b/src/mongo/db/json.h index 693a2212336..dc54dcff997 100644 --- a/src/mongo/db/json.h +++ b/src/mongo/db/json.h @@ -71,6 +71,8 @@ namespace mongo { * VALUE : * STRING * | NUMBER + * | NUMBERINT + * | NUMBERLONG * | OBJECT * | ARRAY * @@ -217,6 +219,18 @@ namespace mongo { Status objectId(const StringData& fieldName, BSONObjBuilder&); /* + * NUMBERLONG : + * NumberLong( <number> ) + */ + Status numberLong(const StringData& fieldName, BSONObjBuilder&); + + /* + * NUMBERINT : + * NumberInt( <number> ) + */ + Status numberInt(const StringData& fieldName, BSONObjBuilder&); + + /* * DBREF : * Dbref( <namespace string> , <24 character hex string> ) */ |