mirror of
https://github.com/pocoproject/poco.git
synced 2024-12-20 20:56:20 +01:00
176 lines
4.8 KiB
C++
176 lines
4.8 KiB
C++
|
//
|
||
|
// Document.cpp
|
||
|
//
|
||
|
// $Id$
|
||
|
//
|
||
|
// Library: MongoDB
|
||
|
// Package: MongoDB
|
||
|
// Module: Document
|
||
|
//
|
||
|
// Implementation of the Document class.
|
||
|
//
|
||
|
// Copyright (c) 2012, Applied Informatics Software Engineering GmbH.
|
||
|
// and Contributors.
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||
|
// do so, all subject to the following:
|
||
|
//
|
||
|
// The copyright notices in the Software and this entire statement, including
|
||
|
// the above license grant, this restriction and the following disclaimer,
|
||
|
// must be included in all copies of the Software, in whole or in part, and
|
||
|
// all derivative works of the Software, unless such copies or derivative
|
||
|
// works are solely in the form of machine-executable object code generated by
|
||
|
// a source language processor.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
// DEALINGS IN THE SOFTWARE.
|
||
|
//
|
||
|
|
||
|
#include <sstream>
|
||
|
|
||
|
#include "Poco/MongoDB/Document.h"
|
||
|
#include "Poco/MongoDB/Binary.h"
|
||
|
#include "Poco/MongoDB/ObjectId.h"
|
||
|
#include "Poco/MongoDB/Array.h"
|
||
|
|
||
|
namespace Poco
|
||
|
{
|
||
|
namespace MongoDB
|
||
|
{
|
||
|
|
||
|
|
||
|
Document::Document()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
Document::~Document()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void Document::read(BinaryReader& reader)
|
||
|
{
|
||
|
int size;
|
||
|
reader >> size;
|
||
|
|
||
|
unsigned char type;
|
||
|
reader >> type;
|
||
|
|
||
|
while( type != '\0' )
|
||
|
{
|
||
|
Element::Ptr element;
|
||
|
|
||
|
std::string name = BSONReader(reader).readCString();
|
||
|
|
||
|
switch(type)
|
||
|
{
|
||
|
case ElementTraits<double>::TypeId:
|
||
|
element = new ConcreteElement<double>(name, 0);
|
||
|
break;
|
||
|
case ElementTraits<Int32>::TypeId:
|
||
|
element = new ConcreteElement<Int32>(name, 0);
|
||
|
break;
|
||
|
case ElementTraits<std::string>::TypeId:
|
||
|
element = new ConcreteElement<std::string>(name, "");
|
||
|
break;
|
||
|
case ElementTraits<Document::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<Document::Ptr>(name, new Document());
|
||
|
break;
|
||
|
case ElementTraits<Array::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<Array::Ptr>(name, new Array());
|
||
|
break;
|
||
|
case ElementTraits<Binary::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<Binary::Ptr>(name, new Binary());
|
||
|
break;
|
||
|
case ElementTraits<ObjectId::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<ObjectId::Ptr>(name, new ObjectId());
|
||
|
break;
|
||
|
case ElementTraits<bool>::TypeId:
|
||
|
element = new ConcreteElement<bool>(name, false);
|
||
|
break;
|
||
|
case ElementTraits<Poco::Timestamp>::TypeId:
|
||
|
element = new ConcreteElement<Poco::Timestamp>(name, Poco::Timestamp());
|
||
|
break;
|
||
|
case ElementTraits<NullValue>::TypeId:
|
||
|
element = new ConcreteElement<NullValue>(name, NullValue(0));
|
||
|
break;
|
||
|
case ElementTraits<RegularExpression::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<RegularExpression::Ptr>(name, new RegularExpression());
|
||
|
break;
|
||
|
case ElementTraits<JavaScriptCode::Ptr>::TypeId:
|
||
|
element = new ConcreteElement<JavaScriptCode::Ptr>(name, new JavaScriptCode());
|
||
|
break;
|
||
|
case ElementTraits<Int64>::TypeId:
|
||
|
element = new ConcreteElement<Int64>(name, 0);
|
||
|
break;
|
||
|
default:
|
||
|
{
|
||
|
std::stringstream ss;
|
||
|
ss << "Element " << name << " contains an unsupported type " << std::hex << (int) type;
|
||
|
throw Poco::NotImplementedException(ss.str());
|
||
|
}
|
||
|
//TODO: x0F -> JavaScript code with scope
|
||
|
// xFF -> Min Key
|
||
|
// x7F -> Max Key
|
||
|
}
|
||
|
|
||
|
element->read(reader);
|
||
|
_elements.insert(element);
|
||
|
|
||
|
reader >> type;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
std::string Document::toString() const
|
||
|
{
|
||
|
std::ostringstream oss;
|
||
|
for(ElementSet::iterator it = _elements.begin(); it != _elements.end(); ++it)
|
||
|
{
|
||
|
oss << (*it)->name() << " ";
|
||
|
}
|
||
|
return oss.str();
|
||
|
}
|
||
|
|
||
|
|
||
|
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 << (unsigned char) (*it)->type();
|
||
|
BSONWriter(tempWriter).writeCString((*it)->name());
|
||
|
Element::Ptr element = *it;
|
||
|
element->write(tempWriter);
|
||
|
}
|
||
|
tempWriter.flush();
|
||
|
|
||
|
Poco::Int32 len = 5 + sstream.tellp(); /* 5 = sizeof(len) + 0-byte */
|
||
|
writer << len;
|
||
|
writer.writeRaw(sstream.str());
|
||
|
}
|
||
|
writer << '\0';
|
||
|
}
|
||
|
|
||
|
void Document::addElement(Element::Ptr element)
|
||
|
{
|
||
|
_elements.insert(element);
|
||
|
}
|
||
|
|
||
|
}} // Namespace Poco::MongoDB
|