summaryrefslogtreecommitdiff
path: root/libodbcpp/odbc-modifycommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libodbcpp/odbc-modifycommand.cpp')
-rw-r--r--libodbcpp/odbc-modifycommand.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/libodbcpp/odbc-modifycommand.cpp b/libodbcpp/odbc-modifycommand.cpp
new file mode 100644
index 0000000..5d483c5
--- /dev/null
+++ b/libodbcpp/odbc-modifycommand.cpp
@@ -0,0 +1,40 @@
+#include "odbc-modifycommand.h"
+#include "odbc-error.h"
+
+ODBC::ModifyCommand::ModifyCommand(const ODBC::Connection & c, const std::string & sql) :
+ DB::Command(sql),
+ ODBC::Command(c, sql),
+ DB::ModifyCommand(sql)
+{
+}
+
+ODBC::ModifyCommand::~ModifyCommand()
+{
+}
+
+unsigned int
+ODBC::ModifyCommand::execute(bool anc)
+{
+ if (connection.txIsAborted()) {
+ throw Error("Transaction has been aborted, not issuing any more commands");
+ }
+ RETCODE rc = SQLExecute(hStmt);
+ if (!SQL_SUCCEEDED(rc)) {
+ if (rc != SQL_NO_DATA || !anc) {
+ connection.abortTx();
+ throw Error(rc, SQL_HANDLE_STMT, hStmt, "ODBC::ModifyCommand::execute SQLExecute");
+ }
+ }
+ SQLLEN rows;
+ rc = SQLRowCount(hStmt, &rows);
+ if (!SQL_SUCCEEDED(rc)) {
+ connection.abortTx();
+ throw Error(rc, SQL_HANDLE_STMT, hStmt, "ODBC::ModifyCommand::execute SQLRowCount");
+ }
+ if (rows > 0 || anc) {
+ return rows;
+ }
+ connection.abortTx();
+ throw Error("No rows affected");
+}
+