Skip to content

Commit

Permalink
fixed GH #1404: Add Poco::Data::Statement::bind() method
Browse files Browse the repository at this point in the history
  • Loading branch information
obiltschnig committed Nov 8, 2017
1 parent 980c266 commit 88ce18e
Showing 1 changed file with 38 additions and 27 deletions.
65 changes: 38 additions & 27 deletions Data/include/Poco/Data/Statement.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,23 @@ class Limit;


class Data_API Statement
/// A Statement is used to execute SQL statements.
/// 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.
/// Statement execution can be synchronous or asynchronous.
/// Synchronous ececution is achieved through execute() call, while asynchronous is
/// achieved through executeAsync() method call.
/// An asynchronously executing statement should not be copied during the execution.
/// An asynchronously executing statement should not be copied during the execution.
///
/// Note:
///
/// Once set as asynchronous through 'async' manipulator, statement remains
/// asynchronous for all subsequent execution calls, both execute() and executeAsync().
/// However, calling executAsync() on a synchronous statement shall execute
/// However, calling executAsync() on a synchronous statement shall execute
/// asynchronously but without altering the underlying statement's synchronous nature.
///
/// Once asynchronous, a statement can be reverted back to synchronous state in two ways:
///
///
/// 1) By calling setAsync(false)
/// 2) By means of 'sync' or 'reset' manipulators
///
Expand Down Expand Up @@ -101,7 +101,7 @@ class Data_API Statement
/// stmt << "SELECT * FROM Table", ...
///
/// is equivalent to:
///
///
/// Statement stmt(sess << "SELECT * FROM Table", ...);
///
/// but in some cases better readable.
Expand All @@ -110,9 +110,9 @@ class Data_API Statement
/// Destroys the Statement.

Statement(const Statement& stmt);
/// Copy constructor.
/// Copy constructor.
/// If the statement has been executed asynchronously and has not been
/// synchronized prior to copy operation (i.e. is copied while executing),
/// synchronized prior to copy operation (i.e. is copied while executing),
/// this constructor shall synchronize it.

Statement& operator = (const Statement& stmt);
Expand All @@ -121,7 +121,7 @@ class Data_API Statement
void swap(Statement& other);
/// Swaps the statement with another one.

template <typename T>
template <typename T>
Statement& operator << (const T& t)
/// Concatenates data with the SQL statement string.
{
Expand Down Expand Up @@ -155,8 +155,19 @@ class Data_API Statement
return *this;
}

template <typename C>
Statement& bind(const C& value)
/// Adds a binding to the Statement. This can be used to implement
/// generic binding mechanisms and is a nicer syntax for:
///
/// statement , bind(value);
{
(*this) , Keywords::bind(value);
return *this;
}

Statement& operator , (AbstractExtraction::Ptr extract);
/// Registers objects used for extracting data with the Statement by
/// Registers objects used for extracting data with the Statement by
/// calling addExtract().

Statement& operator , (AbstractExtractionVec& extVec);
Expand Down Expand Up @@ -192,19 +203,19 @@ class Data_API Statement
/// Registers a single extraction with the statement.

Statement& operator , (const Bulk& bulk);
/// Sets the bulk execution mode (both binding and extraction) for this
/// statement.Statement must not have any extractors or binders set at the
/// time when this operator is applied.
/// Failure to adhere to the above constraint shall result in
/// Sets the bulk execution mode (both binding and extraction) for this
/// statement.Statement must not have any extractors or binders set at the
/// time when this operator is applied.
/// Failure to adhere to the above constraint shall result in
/// InvalidAccessException.

Statement& operator , (BulkFnType);
/// Sets the bulk execution mode (both binding and extraction) for this
/// statement.Statement must not have any extractors or binders set at the
/// time when this operator is applied.
/// Sets the bulk execution mode (both binding and extraction) for this
/// statement.Statement must not have any extractors or binders set at the
/// time when this operator is applied.
/// Additionally, this function requires limit to be set in order to
/// determine the bulk size.
/// Failure to adhere to the above constraints shall result in
/// Failure to adhere to the above constraints shall result in
/// InvalidAccessException.

Statement& operator , (const Limit& extrLimit);
Expand Down Expand Up @@ -273,29 +284,29 @@ class Data_API Statement
/// Creates a string from the accumulated SQL statement.

std::size_t execute(bool reset = true);
/// Executes the statement synchronously or asynchronously.
/// Executes the statement synchronously or asynchronously.
/// Stops when either a limit is hit or the whole statement was executed.
/// Returns the number of rows extracted from the database (for statements
/// returning data) or number of rows affected (for all other statements).
/// If reset is true (default), associated storage is reset and reused.
/// Otherwise, the results from this execution step are appended.
/// Reset argument has no meaning for unlimited statements that return all rows.
/// If isAsync() returns true, the statement is executed asynchronously
/// If isAsync() returns true, the statement is executed asynchronously
/// and the return value from this function is zero.
/// The result of execution (i.e. number of returned or affected rows) can be
/// The result of execution (i.e. number of returned or affected rows) can be
/// obtained by calling wait() on the statement at a later point in time.

const Result& executeAsync(bool reset = true);
/// Executes the statement asynchronously.
/// Executes the statement asynchronously.
/// Stops when either a limit is hit or the whole statement was executed.
/// Returns immediately. Calling wait() (on either the result returned from this
/// call or the statement itself) returns the number of rows extracted or number
/// Returns immediately. Calling wait() (on either the result returned from this
/// call or the statement itself) returns the number of rows extracted or number
/// of rows affected by the statement execution.
/// When executed on a synchronous statement, this method does not alter the
/// statement's synchronous nature.

void setAsync(bool async = true);
/// Sets the asynchronous flag. If this flag is true, executeAsync() is called
/// Sets the asynchronous flag. If this flag is true, executeAsync() is called
/// from the now() manipulator. This setting does not affect the statement's
/// capability to be executed synchronously by directly calling execute().

Expand All @@ -304,8 +315,8 @@ class Data_API Statement

std::size_t wait(long milliseconds = WAIT_FOREVER);
/// Waits for the execution completion for asynchronous statements or
/// returns immediately for synchronous ones. The return value for
/// asynchronous statement is the execution result (i.e. number of
/// returns immediately for synchronous ones. The return value for
/// asynchronous statement is the execution result (i.e. number of
/// rows retrieved). For synchronous statements, the return value is zero.

bool initialized();
Expand Down Expand Up @@ -799,7 +810,7 @@ inline void swap(Statement& s1, Statement& s2)
namespace std
{
template<>
inline void swap<Poco::Data::Statement>(Poco::Data::Statement& s1,
inline void swap<Poco::Data::Statement>(Poco::Data::Statement& s1,
Poco::Data::Statement& s2)
/// Full template specalization of std:::swap for Statement
{
Expand Down

0 comments on commit 88ce18e

Please sign in to comment.