diff options
author | Aaron <aaron@10gen.com> | 2009-01-29 18:58:47 -0500 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2009-01-29 18:58:47 -0500 |
commit | 01f5ce5434f06f70ff51c5722d249489f516fb83 (patch) | |
tree | b734e94a7a8330d8a6c3cefc4adf698edc38d8b8 /db/json.cpp | |
parent | 1211514a190a20bf733805f4eb54c5a52c5240d3 (diff) | |
download | mongo-01f5ce5434f06f70ff51c5722d249489f516fb83.tar.gz |
Allow unquoted field names, at Dwight's request
Diffstat (limited to 'db/json.cpp')
-rw-r--r-- | db/json.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/db/json.cpp b/db/json.cpp index 50ab40ed391..219305d842b 100644 --- a/db/json.cpp +++ b/db/json.cpp @@ -198,6 +198,15 @@ namespace mongo { ObjectBuilder &b; }; + struct unquotedFieldNameEnd { + unquotedFieldNameEnd( ObjectBuilder &_b ) : b( _b ) {} + void operator() ( const char *start, const char *end ) const { + string name( start, end ); + b.fieldNames.back() = name; + } + ObjectBuilder &b; + }; + struct stringEnd { stringEnd( ObjectBuilder &_b ) : b( _b ) {} void operator() ( const char *start, const char *end ) const { @@ -407,7 +416,10 @@ public: members = pair >> !( ',' >> members ); pair = oid[ oidEnd( self.b ) ] | - str[ fieldNameEnd( self.b ) ] >> ':' >> value; + fieldName >> ':' >> value; + fieldName = + str[ fieldNameEnd( self.b ) ] | + unquotedFieldName[ unquotedFieldNameEnd( self.b ) ]; array = ch_p( '[' )[ arrayStart( self.b ) ] >> !elements >> ']'; elements = value >> !( ch_p( ',' )[ arrayNext( self.b ) ] >> elements ); value = @@ -439,6 +451,8 @@ public: // real_p accepts numbers with nonsignificant zero prefixes, which // aren't allowed in JSON. Oh well. number = real_p[ numberValue( self.b ) ]; + + unquotedFieldName = lexeme_d[ ( alpha_p | ch_p( '$' ) ) >> *( ( alnum_p | ch_p( '$' ) | ch_p( '_' ) ) ) ]; dbref = dbrefS | dbrefT; dbrefS = ch_p( '{' ) >> "\"$ns\"" >> ':' >> @@ -481,7 +495,7 @@ public: } rule< ScannerT > object, members, pair, array, elements, value, str, number, dbref, dbrefS, dbrefT, oid, oidS, oidT, bindata, date, dateS, dateT, - regex, regexS, regexT, quotedOid; + regex, regexS, regexT, quotedOid, fieldName, unquotedFieldName; const rule< ScannerT > &start() const { return object; } |