void FieldRef::parse(const StringData& dottedField) {
        if (dottedField.size() == 0) {
            return;
        }

        if (_size != 0) {
            clear();
        }

        // We guarantee that accesses through getPart() will be valid while 'this' is. So we
        // take a copy. We're going to be "chopping" up the copy into c-strings.
        _fieldBase.reset(new char[dottedField.size()+1]);
        dottedField.copyTo( _fieldBase.get(), true );

        // Separate the field parts using '.' as a delimiter.
        char* beg = _fieldBase.get();
        char* cur = beg;
        char* end = beg + dottedField.size();
        while (true) {
            if (cur != end && *cur != '.') {
                cur++;
                continue;
            }

            appendPart(StringData(beg, cur - beg));

            if (cur != end) {
                *cur = '\0';
                beg = ++cur;
                continue;
            }

            break;
        }
    }
Beispiel #2
0
    intrusive_ptr<const RCString> RCString::create(StringData s) {
        const size_t sizeWithNUL = s.size() + 1;
        const size_t bytesNeeded = sizeof(RCString) + sizeWithNUL;
        uassert(16493, str::stream() << "Tried to create string longer than "
                                     << (BSONObjMaxUserSize/1024/1024) << "MB",
                bytesNeeded < static_cast<size_t>(BSONObjMaxUserSize));

        intrusive_ptr<RCString> ptr = new (bytesNeeded) RCString(); // uses custom operator new

        ptr->_size = s.size();
        char* stringStart = reinterpret_cast<char*>(ptr.get()) + sizeof(RCString);
        s.copyTo( stringStart, true );
        return ptr;
    }