void Document::write(BinaryWriter& writer) { if ( _elements.empty() ) { writer << 5; } else { std::stringstream sstream; Poco::BinaryWriter tempWriter(sstream); for(ElementSet::iterator it = _elements.begin(); it != _elements.end(); ++it) { tempWriter << static_cast<unsigned char>((*it)->type()); BSONWriter(tempWriter).writeCString((*it)->name()); Element::Ptr element = *it; element->write(tempWriter); } tempWriter.flush(); Poco::Int32 len = static_cast<Poco::Int32>(5 + sstream.tellp()); /* 5 = sizeof(len) + 0-byte */ writer << len; writer.writeRaw(sstream.str()); } writer << '\0'; }
void DeleteRequest::buildRequest(BinaryWriter& writer) { writer << 0; // 0 - reserved for future use BSONWriter(writer).writeCString(_fullCollectionName); writer << _flags; _selector.write(writer); }
void GetMoreRequest::buildRequest(BinaryWriter& writer) { writer << 0; // 0 - reserved for future use BSONWriter(writer).writeCString(_fullCollectionName); writer << _numberToReturn; writer << _cursorID; }
void InsertRequest::buildRequest(BinaryWriter& writer) { //TODO: throw exception when no document is added writer << _flags; BSONWriter(writer).writeCString(_fullCollectionName); for(Document::Vector::iterator it = _documents.begin(); it != _documents.end(); ++it) { (*it)->write(writer); } }
void QueryRequest::buildRequest(BinaryWriter& writer) { writer << _flags; BSONWriter(writer).writeCString(_fullCollectionName); writer << _numberToSkip; writer << _numberToReturn; _selector.write(writer); if ( ! _returnFieldSelector.empty() ) { _returnFieldSelector.write(writer); } }