MongoDB BSON type 0x11 support, fixes #1429

This commit is contained in:
Tomaz Beltram 2016-09-28 10:16:03 +02:00
parent caed8507f4
commit 1852739547
2 changed files with 49 additions and 1 deletions

View File

@ -291,6 +291,51 @@ inline void BSONWriter::write<NullValue>(NullValue& from)
{
}
struct SpecialTimestamp {
Poco::Timestamp ts;
Poco::Int32 inc;
};
// BSON Timestamp
// spec: int64
template<>
struct ElementTraits<SpecialTimestamp>
{
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>(SpecialTimestamp& to)
{
Poco::Int64 value;
_reader >> value;
to.inc = value & 0xffffffff;
value >>= 32;
to.ts = Timestamp::fromEpochTime(static_cast<std::time_t>(value));
}
template<>
inline void BSONWriter::write<SpecialTimestamp>(SpecialTimestamp& from)
{
Poco::Int64 value = from.ts.epochMicroseconds() / 1000;
value <<= 32;
value += from.inc;
_writer << value;
}
// BSON 64-bit integer
// spec: int64

View File

@ -96,6 +96,9 @@ void Document::read(BinaryReader& reader)
case ElementTraits<Poco::Timestamp>::TypeId:
element = new ConcreteElement<Poco::Timestamp>(name, Poco::Timestamp());
break;
case ElementTraits<SpecialTimestamp>::TypeId:
element = new ConcreteElement<SpecialTimestamp>(name, SpecialTimestamp());
break;
case ElementTraits<NullValue>::TypeId:
element = new ConcreteElement<NullValue>(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