mirror of
https://github.com/pocoproject/poco.git
synced 2024-12-21 05:03:36 +01:00
276 lines
7.4 KiB
C++
276 lines
7.4 KiB
C++
//
|
|
// Statement.h
|
|
//
|
|
// $Id: //poco/Main/Data/include/Poco/Data/Statement.h#18 $
|
|
//
|
|
// Library: Data
|
|
// Package: DataCore
|
|
// Module: Statement
|
|
//
|
|
// Definition of the Statement class.
|
|
//
|
|
// Copyright (c) 2006, 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 Data_Statement_INCLUDED
|
|
#define Data_Statement_INCLUDED
|
|
|
|
|
|
#include "Poco/Data/Data.h"
|
|
#include "Poco/Data/StatementImpl.h"
|
|
#include "Poco/Data/Range.h"
|
|
#include "Poco/SharedPtr.h"
|
|
|
|
|
|
namespace Poco {
|
|
namespace Data {
|
|
|
|
|
|
class AbstractBinding;
|
|
class AbstractExtraction;
|
|
class Session;
|
|
class Limit;
|
|
|
|
|
|
class Data_API Statement
|
|
/// A Statement is used to execute SQL statements.
|
|
/// It does not contain code of its own.
|
|
/// Its main purpose is to forward calls to the concrete StatementImpl stored inside.
|
|
{
|
|
public:
|
|
typedef void (*Manipulator)(Statement&);
|
|
|
|
enum Storage
|
|
{
|
|
STORAGE_VECTOR = StatementImpl::STORAGE_VECTOR_IMPL,
|
|
STORAGE_LIST = StatementImpl::STORAGE_LIST_IMPL,
|
|
STORAGE_DEQUE = StatementImpl::STORAGE_DEQUE_IMPL,
|
|
STORAGE_UNKNOWN = StatementImpl::STORAGE_UNKNOWN_IMPL
|
|
};
|
|
|
|
Statement(StatementImpl* pImpl);
|
|
/// Creates the Statement.
|
|
|
|
explicit Statement(Session& session);
|
|
/// Creates the Statement for the given Session.
|
|
///
|
|
/// The following:
|
|
///
|
|
/// Statement stmt(sess);
|
|
/// stmt << "SELECT * FROM Table", ...
|
|
///
|
|
/// is equivalent to:
|
|
///
|
|
/// Statement stmt(sess << "SELECT * FROM Table", ...);
|
|
///
|
|
/// but in some cases better readable.
|
|
|
|
~Statement();
|
|
/// Destroys the Statement.
|
|
|
|
Statement(const Statement& stmt);
|
|
/// Copy constructor
|
|
|
|
Statement& operator = (const Statement& stmt);
|
|
/// Assignment operator.
|
|
|
|
void swap(Statement& other);
|
|
/// Swaps the statement with another one.
|
|
|
|
template <typename T>
|
|
Statement& operator << (const T& t)
|
|
/// Concatenates the send data to a string version of the SQL statement.
|
|
{
|
|
_ptr->add(t);
|
|
return *this;
|
|
}
|
|
|
|
Statement& operator , (Manipulator manip);
|
|
/// Handles manipulators, such as now.
|
|
|
|
Statement& operator , (AbstractBinding* info);
|
|
/// Registers the Binding at the Statement
|
|
|
|
Statement& operator , (AbstractExtraction* extract);
|
|
/// Registers objects used for extracting data at the Statement.
|
|
|
|
Statement& operator , (const Limit& extrLimit);
|
|
/// Sets a limit on the maximum number of rows a select is allowed to return.
|
|
///
|
|
/// Set per default to Limit::LIMIT_UNLIMITED which disables the limit.
|
|
|
|
Statement& operator , (const Range& extrRange);
|
|
/// Sets a an etxraction Range on the maximum number of rows a select is allowed to return.
|
|
///
|
|
/// Set per default to Limit::LIMIT_UNLIMITED which disables the range.
|
|
|
|
std::string toString() const;
|
|
/// Creates a string from the accumulated SQL statement
|
|
|
|
Poco::UInt32 execute();
|
|
/// Executes the whole statement. Stops when either a limit is hit or the whole statement was executed.
|
|
/// Returns the number of rows extracted from the Database.
|
|
|
|
bool done();
|
|
/// Returns if the statement was completely executed or if a previously set limit stopped it
|
|
/// and there is more work to do. When no limit is set, it will always - after calling execute() - return true.
|
|
|
|
Statement& reset(Session& session);
|
|
/// Resets the Statement so that it can be filled with a new SQL command.
|
|
|
|
bool canModifyStorage();
|
|
/// Returns true if statement is in a state that allows the internal storage to be modified.
|
|
|
|
Storage storage() const;
|
|
/// Returns the internal storage type for the stamement.
|
|
|
|
void setStorage(const std::string& storage);
|
|
/// Sets the internal storage type for the stamement.
|
|
|
|
const std::string& getStorage() const;
|
|
/// Returns the internal storage type for the stamement.
|
|
|
|
std::size_t extractionCount() const;
|
|
/// Returns the number of extraction storage buffers associated
|
|
/// with the statement.
|
|
|
|
protected:
|
|
const AbstractExtractionVec& extractions() const;
|
|
/// Returns the extractions vector.
|
|
|
|
const MetaColumn& metaColumn(std::size_t pos) const;
|
|
/// Returns the type for the column at specified position.
|
|
|
|
const MetaColumn& metaColumn(const std::string& name) const;
|
|
/// Returns the type for the column with specified name.
|
|
|
|
private:
|
|
typedef Poco::SharedPtr<StatementImpl> StatementImplPtr;
|
|
|
|
bool _executed;
|
|
StatementImplPtr _ptr;
|
|
};
|
|
|
|
|
|
//
|
|
// Manipulators
|
|
//
|
|
void Data_API now(Statement& statement);
|
|
|
|
void Data_API vector(Statement& statement);
|
|
|
|
void Data_API list(Statement& statement);
|
|
|
|
void Data_API deque(Statement& statement);
|
|
|
|
|
|
//
|
|
// inlines
|
|
//
|
|
inline Statement& Statement::operator , (Manipulator manip)
|
|
{
|
|
manip(*this);
|
|
return *this;
|
|
}
|
|
|
|
|
|
inline Statement& Statement::operator , (AbstractBinding* info)
|
|
{
|
|
_ptr->addBinding(info);
|
|
return *this;
|
|
}
|
|
|
|
|
|
inline Statement& Statement::operator , (AbstractExtraction* extract)
|
|
{
|
|
_ptr->addExtract(extract);
|
|
return *this;
|
|
}
|
|
|
|
|
|
inline Statement& Statement::operator , (const Limit& extrLimit)
|
|
{
|
|
_ptr->setExtractionLimit(extrLimit);
|
|
return *this;
|
|
}
|
|
|
|
|
|
inline Statement& Statement::operator , (const Range& extrRange)
|
|
{
|
|
_ptr->setExtractionLimit(extrRange.lower());
|
|
_ptr->setExtractionLimit(extrRange.upper());
|
|
return *this;
|
|
}
|
|
|
|
|
|
inline std::string Statement::toString() const
|
|
{
|
|
return _ptr->toString();
|
|
}
|
|
|
|
|
|
inline const AbstractExtractionVec& Statement::extractions() const
|
|
{
|
|
return _ptr->extractions();
|
|
}
|
|
|
|
|
|
inline const MetaColumn& Statement::metaColumn(std::size_t pos) const
|
|
{
|
|
return _ptr->metaColumn(static_cast<UInt32>(pos));
|
|
}
|
|
|
|
|
|
inline const MetaColumn& Statement::metaColumn(const std::string& name) const
|
|
{
|
|
return _ptr->metaColumn(name);
|
|
}
|
|
|
|
|
|
inline void Statement::setStorage(const std::string& storage)
|
|
{
|
|
_ptr->setStorage(storage);
|
|
}
|
|
|
|
|
|
inline std::size_t Statement::extractionCount() const
|
|
{
|
|
return _ptr->extractionCount();
|
|
}
|
|
|
|
|
|
inline Statement::Storage Statement::storage() const
|
|
{
|
|
return static_cast<Storage>(_ptr->getStorage());
|
|
}
|
|
|
|
|
|
} } // namespace Poco::Data
|
|
|
|
|
|
#endif // Data_Statement_INCLUDED
|