summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2013-10-11 09:08:42 -0400
committerScott Hernandez <scotthernandez@gmail.com>2013-10-11 09:08:42 -0400
commitb2bda16ef3c0ad75b0ee63bac65842d4de513470 (patch)
tree69fb96005afa356e30dd1b1386b5709d85df24c6 /src/mongo/db
parent410a9ee2999b1f5ae2bb4d8585f157915adcc7ed (diff)
downloadmongo-b2bda16ef3c0ad75b0ee63bac65842d4de513470.tar.gz
SERVER-11136 - Support json parsing of NumberLong/Int
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/jsobj.cpp12
-rw-r--r--src/mongo/db/json.cpp55
-rw-r--r--src/mongo/db/json.h14
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> )
*/