From dfe27aa917a3c7834b081712baac5b7ad7d5d41d Mon Sep 17 00:00:00 2001 From: fbraem Date: Sat, 16 Feb 2013 19:55:23 +0100 Subject: [PATCH] Cursor class is used to combine query and getmore requests --- MongoDB/include/Poco/MongoDB/Cursor.h | 97 +++++++++++++++++++++++++++ MongoDB/src/Cursor.cpp | 95 ++++++++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 MongoDB/include/Poco/MongoDB/Cursor.h create mode 100644 MongoDB/src/Cursor.cpp diff --git a/MongoDB/include/Poco/MongoDB/Cursor.h b/MongoDB/include/Poco/MongoDB/Cursor.h new file mode 100644 index 000000000..b342e76ad --- /dev/null +++ b/MongoDB/include/Poco/MongoDB/Cursor.h @@ -0,0 +1,97 @@ +// +// Cursor.h +// +// $Id$ +// +// Library: MongoDB +// Package: MongoDB +// Module: Cursor +// +// Definition of the Cursor 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. +// +#ifndef _MongoDB_Cursor_included +#define _MongoDB_Cursor_included + +#include "Poco/MongoDB/MongoDB.h" +#include "Poco/MongoDB/Connection.h" +#include "Poco/MongoDB/QueryRequest.h" +#include "Poco/MongoDB/ResponseMessage.h" + +namespace Poco { +namespace MongoDB { + + +class MongoDB_API Cursor : public Document + /// Cursor is an helper class for querying multiple documents +{ +public: + Cursor(const std::string& dbname, const std::string& collectionName, QueryRequest::Flags flags = QueryRequest::QUERY_NONE); + /// Constructor + + + Cursor(const std::string& fullCollectionName, QueryRequest::Flags flags = QueryRequest::QUERY_NONE); + /// Constructor + + + virtual ~Cursor(); + /// Destructor + + + ResponseMessage& next(Connection& connection); + /// Try to get the next documents. As long as ResponseMessage has a + /// cursor id next can be called to retrieve the next bunch of documents. + /// kill must be called when not all documents are needed. + + + QueryRequest& query(); + /// Returns the associated query + + + void kill(Connection& connection); + /// Kills the cursor and reset it so that it can be reused. + + +private: + + + QueryRequest _query; + + + ResponseMessage _response; +}; + + +inline QueryRequest& Cursor::query() +{ + return _query; +} + + +}} // Namespace Poco::MongoDB + +#endif //_MongoDB_Cursor_included diff --git a/MongoDB/src/Cursor.cpp b/MongoDB/src/Cursor.cpp new file mode 100644 index 000000000..d6a2bb5ac --- /dev/null +++ b/MongoDB/src/Cursor.cpp @@ -0,0 +1,95 @@ +// +// Cursor.cpp +// +// $Id$ +// +// Library: MongoDB +// Package: MongoDB +// Module: Cursor +// +// Implementation of the Cursor 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 "Poco/MongoDB/Cursor.h" +#include "Poco/MongoDB/GetMoreRequest.h" +#include "Poco/MongoDB/KillCursorsRequest.h" + +namespace Poco +{ +namespace MongoDB +{ + + +Cursor::Cursor(const std::string& db, const std::string& collection, QueryRequest::Flags flags) + : _query(db + '.' + collection, flags) +{ +} + + +Cursor::Cursor(const std::string& fullCollectionName, QueryRequest::Flags flags) + : _query(fullCollectionName, flags) +{ +} + + +Cursor::~Cursor() +{ + poco_assert_dbg(_response.cursorID()); +} + + +ResponseMessage& Cursor::next(Connection& connection) +{ + if ( _response.cursorID() == 0 ) + { + connection.sendRequest(_query, _response); + } + else + { + Poco::MongoDB::GetMoreRequest getMore(_query.fullCollectionName(), _response.cursorID()); + getMore.setNumberToReturn(_query.getNumberToReturn()); + _response.clear(); + connection.sendRequest(getMore, _response); + } + return _response; +} + + +void Cursor::kill(Connection& connection) +{ + if ( _response.cursorID() != 0 ) + { + KillCursorsRequest killRequest; + killRequest.cursors().push_back(_response.cursorID()); + connection.sendRequest(killRequest); + } + _response.clear(); +} + +} } // Namespace Poco::MongoDB +