BSON數據讀寫C++的API,uma::bson 1.1 發布

jopen 12年前發布 | 16K 次閱讀 BSON

uma::bson是一個DOM風格的C++ API用于讀寫BSON數據。不像MongoDB C++ API,它只公開了一個只讀接口和一個單獨的接口來創建一個BSON展示。這個API能夠讀寫現有的數據。這個API主要設計用于將BSON數據序列化成數據流(文件,socket連接等)或反過來從數據流反序列化成BSON數據。

    #include <uma/bson/Element.h>

#include <uma/bson/Double.h>
#include <uma/bson/String.h>
#include <uma/bson/Document.h>
#include <uma/bson/Array.h>
#include <uma/bson/Undefined.h>
#include <uma/bson/ObjectId.h>
#include <uma/bson/Boolean.h>
#include <uma/bson/Date.h>
#include <uma/bson/Null.h>
#include <uma/bson/RegularExpression.h>
#include <uma/bson/Integer.h>
#include <uma/bson/Timestamp.h>
#include <uma/bson/Long.h>

#include <Poco/FileStream.h>

using uma::bson::Value;
using uma::bson::SharedElement;
using uma::bson::Element;
using uma::bson::Double;
using uma::bson::String;
using uma::bson::Document;
using uma::bson::Array;
using uma::bson::Undefined;
using uma::bson::ObjectId;
using uma::bson::Boolean;
using uma::bson::Date;
using uma::bson::Null;
using uma::bson::RegularExpression;
using uma::bson::Integer;
using uma::bson::Timestamp;
using uma::bson::Long;

void document()
{
  Document emptyDoc( 0 ); // without auto generated _id field
  emptyDoc.set( "prop1", "Property One" );
  emptyDoc.set( "prop2", "Property Two" );

  Array array;
  array << 1.0;
  array << "string value";
  array << Undefined();
  array << true;
  array << date;
  array << Null();
  array << RegularExpression( "^abc", "$(1)" );
  array << 1;
  array << static_cast<int64_t>( 2 );

  Document doc();
  doc.set( "double", 1.0 );
  doc.set( "string", "string value" );
  doc.set( "childDoc", emptyDoc );
  doc.set( "childArray", array );
  doc.set( "undefined", Undefined() );
  doc.set( "boolean", true );
  doc.set( "date", date );
  doc.set( "null", Null() );
  doc.set( "regex", RegularExpression( "^abc", "$(1)" ) );
  doc.set( "integer", 1 );
  doc.set( "long", static_cast<int64_t>( 2 ) );

  assert( doc["double"]->getType() == Value::Type::Double );
  verify( doc );
}

void bson( const Document& doc )
{
  const std::string out( "/tmp/doctest.bson" );
  Poco::FileOutputStream fos( out, std::ios::out | std::ios::binary | std::ios::trunc );
  doc.toBson( fos );
  fos.close();

  Document d = Document::fromFile( out );
  verify( d );
}

void json( const Document& doc )
{
  const std::string out( "/tmp/doctest.json" );
  Poco::FileOutputStream fos( out, std::ios::out | std::ios::binary | std::ios::trunc );
  doc.toJson( fos, true );
  fos.close();

  Poco::FileInputStream fis( out );
  Document d = Document::fromJson( fis );
  verify( d );
}

void verify( const Document& doc )
{
  assert( doc.get( "double" )->getType() == Value::Type::Double );
  assert( doc.get( "double" )->getValue<Double>().getValue() == 1.0 );

  assert( doc.get( "string" )->getType() == Value::Type::String );
  assert( doc.get( "string" )->getValue<String>().getValue() == "string value" );

  assert( doc.get( "undefined" )->getType() == Value::Type::Undefined );

  assert( doc.get( "boolean" )->getType() == Value::Type::Boolean );
  assert( doc.get( "boolean" )->getValue<Boolean>().getValue() == true );

  assert( doc.get( "date" )->getType() == Value::Type::Date );
  assert( doc.get( "date" )->getValue<Date>() == date );

  assert( doc.get( "null" )->getType() == Value::Type::Null );

  assert( doc.get( "regex" )->getType() == Value::Type::RegEx );
  assert( doc.get( "regex" )->getValue<RegularExpression>().getRegex() == "^abc" );
  assert( doc.get( "regex" )->getValue<RegularExpression>().getFlags() == "$(1)" );

  assert( doc.get( "integer" )->getType() == Value::Type::Integer );
  assert( doc.get( "integer" )->getValue<Integer>().getValue() == 1 );

  assert( doc.get( "long" )->getType() == Value::Type::Long );
  assert( doc.get( "long" )->getValue<Long>().getValue() == 2 );
}</pre>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!