template <typename T> T readType(BufReader* reader, bool inverted) { // TODO for C++11 to static_assert that T is integral T t = ConstDataView(static_cast<const char*>(reader->skip(sizeof(T)))).readNative<T>(); if (inverted) return ~t; return t; }
std::string BSONElement::_asCode() const { switch (type()) { case mongo::String: case Code: return std::string(valuestr(), valuestrsize() - 1); case CodeWScope: return std::string(codeWScopeCode(), ConstDataView(valuestr()).read<LittleEndian<int>>() - 1); default: log() << "can't convert type: " << (int)(type()) << " to code" << std::endl; } uassert(10062, "not code", 0); return ""; }
bool TerarkDbRecordStore::findRecord(OperationContext* txn, const RecordId& id, RecordData* out) const { if (id.isNull()) return false; llong recIdx = id.repr() - 1; CompositeTable* tab = m_table->m_tab.get(); auto& td = m_table->getMyThreadData(); tab->getValue(recIdx, &td.m_buf, &*td.m_dbCtx); SharedBuffer bson = td.m_coder.decode(&tab->rowSchema(), td.m_buf); // size_t bufsize = sizeof(SharedBuffer::Holder) + bson.objsize(); int bufsize = ConstDataView(bson.get()).read<LittleEndian<int>>(); *out = RecordData(bson, bufsize); return true; }
void ValidateInterimFileHasData(const boost::filesystem::path& dir, bool hasData) { char buf[sizeof(std::int32_t)]; auto interimFile = FTDCUtil::getInterimFile(dir); ASSERT_EQUALS(boost::filesystem::exists(interimFile), hasData); if (!hasData) { return; } std::fstream stream(interimFile.c_str()); stream.read(&buf[0], sizeof(buf)); ASSERT_EQUALS(4, stream.gcount()); std::uint32_t bsonLength = ConstDataView(buf).read<LittleEndian<std::int32_t>>(); ASSERT_EQUALS(static_cast<bool>(bsonLength), hasData); }
StatusWith<BSONObj> FTDCFileReader::readDocument() { if (!_stream.is_open()) { return {ErrorCodes::FileNotOpen, "open() needs to be called first."}; } char buf[sizeof(std::int32_t)]; _stream.read(buf, sizeof(buf)); if (sizeof(buf) != _stream.gcount()) { // Did we read exactly zero bytes and hit the eof? // Then return an empty document to indicate we are done reading the file. if (0 == _stream.gcount() && _stream.eof()) { return BSONObj(); } return {ErrorCodes::FileStreamFailed, str::stream() << "Failed to read 4 bytes from file \'" << _file.generic_string() << "\'"}; } std::uint32_t bsonLength = ConstDataView(buf).read<LittleEndian<std::int32_t>>(); // Reads past the end of the file will be caught below // The interim file sentinel is 8 bytes of zero. if (bsonLength == 0) { return BSONObj(); } // Reads past the end of the file will be caught below if (bsonLength > _fileSize || bsonLength < BSONObj::kMinBSONLength) { return {ErrorCodes::InvalidLength, str::stream() << "Invalid BSON length found in file \'" << _file.generic_string() << "\'"}; } // Read the BSON document _buffer.resize(bsonLength); // Stuff the length into the front memcpy(_buffer.data(), buf, sizeof(std::int32_t)); // Read the length - 4 bytes from the file std::int32_t readSize = bsonLength - sizeof(std::int32_t); _stream.read(_buffer.data() + sizeof(std::int32_t), readSize); if (readSize != _stream.gcount()) { return {ErrorCodes::FileStreamFailed, str::stream() << "Failed to read " << readSize << " bytes from file \'" << _file.generic_string() << "\'"}; } ConstDataRange cdr(_buffer.data(), _buffer.data() + bsonLength); // TODO: Validated only validates objects based on a flag which is the default at the moment auto swl = cdr.read<Validated<BSONObj>>(); if (!swl.isOK()) { return swl.getStatus(); } return {swl.getValue().val}; }
BSONObj BSONElement::codeWScopeObject() const { verify(type() == CodeWScope); int strSizeWNull = ConstDataView(value() + 4).read<LittleEndian<int>>(); return BSONObj(value() + 4 + 4 + strSizeWNull); }