diff --git a/MongoDB/include/Poco/MongoDB/Element.h b/MongoDB/include/Poco/MongoDB/Element.h index 5e45bf731..8ad530e9f 100644 --- a/MongoDB/include/Poco/MongoDB/Element.h +++ b/MongoDB/include/Poco/MongoDB/Element.h @@ -291,6 +291,51 @@ inline void BSONWriter::write(NullValue& from) { } +struct SpecialTimestamp { + Poco::Timestamp ts; + Poco::Int32 inc; +}; + +// BSON Timestamp +// spec: int64 +template<> +struct ElementTraits +{ + enum { TypeId = 0x11 }; + + static std::string toString(const SpecialTimestamp& value, int indent = 0) + { + std::string result; + result.append(1, '"'); + result.append(DateTimeFormatter::format(value.ts, "%Y-%m-%dT%H:%M:%s%z")); + result.append(1, ' '); + result.append(NumberFormatter::format(value.inc)); + result.append(1, '"'); + return result; + } +}; + + +template<> +inline void BSONReader::read(SpecialTimestamp& to) +{ + Poco::Int64 value; + _reader >> value; + to.inc = value & 0xffffffff; + value >>= 32; + to.ts = Timestamp::fromEpochTime(static_cast(value)); +} + + +template<> +inline void BSONWriter::write(SpecialTimestamp& from) +{ + Poco::Int64 value = from.ts.epochMicroseconds() / 1000; + value <<= 32; + value += from.inc; + _writer << value; +} + // BSON 64-bit integer // spec: int64 diff --git a/MongoDB/src/Document.cpp b/MongoDB/src/Document.cpp index a3863e30e..080095112 100644 --- a/MongoDB/src/Document.cpp +++ b/MongoDB/src/Document.cpp @@ -96,6 +96,9 @@ void Document::read(BinaryReader& reader) case ElementTraits::TypeId: element = new ConcreteElement(name, Poco::Timestamp()); break; + case ElementTraits::TypeId: + element = new ConcreteElement(name, SpecialTimestamp()); + break; case ElementTraits::TypeId: element = new ConcreteElement(name, NullValue(0)); break; @@ -111,7 +114,7 @@ void Document::read(BinaryReader& reader) default: { std::stringstream ss; - ss << "Element " << name << " contains an unsupported type " << std::hex << (int) type; + ss << "Element " << name << " contains an unsupported type 0x" << std::hex << (int) type; throw Poco::NotImplementedException(ss.str()); } //TODO: x0F -> JavaScript code with scope