Module: DB Interface Module Group: Data Manipulation Classes
Does not inherit
acquire() asString() clear() errorHandler() |
execute() isReady() isValid() operator=() |
release() RWDBUpdater() set() setErrorHandler() |
status() table() where() |
#include <rw/db/updater.h> RWDBUpdater updater = myTable.updater();
RWDBUpdater is an encapsulation of an SQL UPDATE statement. Its methods provide an application with explicit control over the UPDATE statement's SET and WHERE clauses.
The insertion operator << is used to add encapsulated SET clauses to an RWDBUpdater; the where() method is used to specify a WHERE clause. The items which are inserted into an RWDBUpdater are RWDBAssignments, which are created by the assign() method of RWDBColumn. The WHERE clause is encapsulated by an RWDBCriterion, which is some number of RWDBExprs combined with logical operators.
An UPDATE statement does not normally produce results. However, the DB Interface Module recognizes that some database vendors provide triggers, which can cause results to be generated by an UPDATE statement. Consequently, RWDBUpdater's execute() method returns an RWDBResult, which is a sequence of zero or more RWDBTables. Applications are not obliged to request any tables from the returned object.
RWDBUpdater is designed around the Interface/Implementation paradigm. An RWDBUpdater instance is an interface to a reference-counted implementation; copy constructors and assignment operators produce additional references to a shared implementation. An RWDBUpdater's implementation is a base class from which a family of database-specific updater implementations is derived.
This example uses an RWDBUpdater to increment the number column of the Inventory table by 50 wherever red is found in the color column.
RWDBTable inventory = myDbase.table("Inventory"); RWDBConnection connection = myDbase.connection(); RWDBUpdater update = inventory.updater(); RWDBColumn number = inventory["number"]; update << number.assign(number + 50); update.where(inventory["color"] == "red"); update.execute(connection);
This example accomplishes the same task as Example 1, but provides bindings to an application variable. This allows the application to repeatedly execute the update with different values without reshifting in values.
RWDBTable inventory = myDbase.table("Inventory"); RWDBConnection connection = myDbase.connection(); RWDBUpdater update = inventory.updater(); RWDBColumn number = inventory["number"]; int increment = 50; RWCString color = "red"; update << number.assign( number + RWDBBoundExpr( &increment) ); update.where( inventory["color"] == RWDBBoundExpr(&color) ); update.execute(connection); increment = 100; color = "gold"; update.execute(connection);
The encapsulated WHERE clause of an RWDBUpdater is an RWDBCriterion, which is composed of RWDBExprs. Each encapsulated SET clause is an RWDBAssignment, produced by the assign() method of RWDBColumn. See RWDBAssignment, RWDBCriterion, RWDBExpr, and RWDBColumn for details.
The result of RWDBUpdater::execute() is an RWDBResult, which represents a sequence of zero or more RWDBTables. See RWDBResult and RWDBTable for details.
RWDBUpdater();
The default constructor creates an RWDBUpdater whose status is RWDBStatus::notInitialized. This constructor is provided as a convenience, for example, for declaring an array of RWDBUpdaters. Usable RWDBUpdaters are obtained from RWDBTables.
RWDBUpdater(const RWDBUpdater& upd);
Copy constructor. Self shares an implementation with upd.
RWDBUpdater& operator=(const RWDBUpdater& upd);
Assignment operator. Self shared an implementation with upd.
void acquire() const;
Attempts to acquire the internal mutex lock. If the mutex is already locked by another thread, the function blocks until the mutex is released. This function can be called from a const object. Note: in nonmultithreaded builds, this function evaluates to a no-op.
RWCString asString() const;
Returns the SQL equivalent of:
UPDATE table SET ... [ WHERE ...]
This method returns an SQL statement that would be produced by executing self with an implicit connection. This method however does not produce an implicit connection. It uses the time zone setting of the producer RWDBDatabase instance.
The behavior of this asString() method depends upon the RWDBDatabase::verboseAsString() setting in the producer RWDBDatabase instance.
If verboseAsString() is false, the SQL returned is the same as that passed to the database for execution. This is the default.
If verboseAsString() is true, any placeholders in the returned SQL are replaced with their bound values.
NOTE -- When the RWDBDatabase::verboseAsString() option is set to true, the SQL returned by this method may not be a valid SQL statement. However, this method's return value is not necessarily the same SQL that is sent to the database for execution. For example, if an RWDBBlob object is bound, calling asString() with RWDBDatabase::verboseAsString() set to true will result in a string with blob data returned as hex numbers, such as 0x0A32F5.
RWCString asString(bool verbose) const;
Returns the SQL equivalent of:
UPDATE table SET ... [ WHERE ...]
This method returns an SQL statement that would be produced by executing self with an implicit connection. This method however does not produce an implicit connection. It uses the time zone setting of the producer RWDBDatabase instance.
The behavior of this method depends on the value of verbose, and is independent of the RWDBDatabase::verboseAsString() setting.
If verbose is false, the SQL returned is the same as that passed to the database for execution.
If verbose is true, any placeholders in the returned SQL are replaced with their bound values although the SQL passed to the database for execution will not be affected.
NOTE -- The SQL returned by this method when verbose is true may not be a valid SQL statement. However, this is not necessarily the same SQL sent to the database for execution. For example, if an RWDBBlob object is bound, calling asString(true) will result in a string with blob data returned as hex numbers, such as 0x0A32F5.
RWCString asString(const RWDBConnector conn) const;
Returns the SQL equivalent of:
UPDATE table SET ... [ WHERE ...]
This method returns an SQL statement that would be produced by executing self with conn. It uses the time zone setting of the RWDBConnection instance conn, which can be set programmatically with RWDBConnection::timeZone().
The behavior of this asString() method depends upon the RWDBDatabase::verboseAsString() setting in the producer RWDBDatabase instance.
If verboseAsString() is false, the SQL returned is the same as that passed to the database for execution. This is the default.
If verboseAsString() is true, any placeholders in the returned SQL are replaced with their bound values.
NOTE -- When the RWDBDatabase::verboseAsString() option is set to true, the SQL returned by this method may not be a valid SQL statement. However, this method's return value is not necessarily the same SQL that is sent to the database for execution. For example, if an RWDBBlob object is bound, calling asString() with RWDBDatabase::verboseAsString() set to true will result in a string with blob data returned as hex numbers, such as 0x0A32F5.
RWCString asString(const RWDBConnector conn, bool verbose) const;
Returns the SQL equivalent of:
UPDATE table SET ... [ WHERE ...]
This method returns an SQL statement that would be produced by executing self with conn. It uses the time zone setting of the RWDBConnection instance conn, which can be set programmatically with RWDBConnection::timeZone().
The behavior of this method depends on the value of verbose, and is independent of the RWDBDatabase::verboseAsString() setting.
If verbose is false, the SQL returned is the same as that passed to the database for execution.
If verbose is true, any placeholders in the returned SQL are replaced with their bound values although the SQL passed to the database for execution will not be affected.
NOTE -- The SQL returned by this method when verbose is true may not be a valid SQL statement. However, this is not necessarily the same SQL sent to the database for execution. For example, if an RWDBBlob object is bound, calling asString(true) will result in a string with blob data returned as hex numbers, such as 0x0A32F5.
RWDBStatus clear();
Clears self's list of assignments, WHERE clauses, and internal controls.
RWDBStatus::ErrorHandler errorHandler() const;
Returns the error handler attached to self.
RWDBResult execute();
Uses a default database connection to cause the SQL statement encapsulated by self to be executed.
RWDBResult execute(const RWDBConnection& connection);
Uses the supplied connection to cause the SQL statement encapsulated by self to be executed. This function can behave asynchronously if executed using an asynchronous connection.
bool isReady() const;
This function returns true if the object is in ready state, indicating that accessing the object will not block. Accessing a nonready object may potentially block.
bool isValid() const;
Returns true if self's status is RWDBStatus::ok, otherwise returns false. Does not return false if the previous executed statement failed. You must check the status of the RWDBResult returned from execute() instead of the status of the RWDBUpdater object.
void release() const;
Releases a previously acquired mutex. This function can be called from a const object. Note: in nonmultithreaded builds, this function evaluates to a no-op.
RWDBUpdater& set(const RWDBAssignment& assignment);
Adds the encapsulated SET clause represented by assignment to self. Equivalent to inserting assignment into self. Returns a reference to self.
void setErrorHandler(RWDBStatus::ErrorHandler handler);
Installs handler as self's error handler. The supplied handler is inherited by all objects produced by self. By default, the error handler of an RWDBUpdater is inherited from the object that produced it; this method overrides the default. ErrorHandler is declared as a typedef within the scope of RWDBStatus:
typedef void (*ErrorHandler)(const RWDBStatus&);
RWDBStatus status() const;
Returns the current status of self.
RWDBTable table() const;
Returns the RWDBTable that produced self. Returns an RWDBTable whose status is RWDBStatus::notInitialized if self was created with the default constructor.
RWDBCriterion where() const;
Returns a copy of self's RWDBCriterion, an encapsulated SQL WHERE clause. Returns an empty RWDBCriterion if self has no WHERE clause.
RWDBUpdater& where(const RWDBCriterion& criterion);
Specifies criterion as self's SQL WHERE clause. If self already has a WHERE clause, this method replaces it. Specifying an empty criterion clears self's WHERE clause. Notice that an updater without a WHERE clause updates all rows in its table. Returns a reference to self.
RWDBUpdater& operator<<(RWDBUpdater& updater, const RWDBAssignment assignment);
Appends assignment to the encapsulated SET clause in self. Returns a reference to self.
RWDBUpdater& operator[](size_t index);
Sets self's current position to index.
© Copyright Rogue Wave Software, Inc. All Rights Reserved.
Rogue Wave and SourcePro are registered trademarks of Rogue Wave Software, Inc. in the United States and other countries. All other trademarks are the property of their respective owners.
Contact Rogue Wave about documentation or support issues.