23 #include <drizzled/session.h>
24 #include <drizzled/statement/rollback_to_savepoint.h>
25 #include <drizzled/transaction_services.h>
26 #include <drizzled/named_savepoint.h>
27 #include <drizzled/util/functors.h>
28 #include <drizzled/session/transactions.h>
36 bool statement::RollbackToSavepoint::execute()
44 if ( (session().options & OPTION_NOT_AUTOCOMMIT) &&
45 (transaction().all.getResourceContexts().empty() ==
true) )
47 if (session().startTransaction() ==
false)
67 deque<NamedSavepoint> &savepoints= transaction().savepoints;
70 if (savepoints.empty())
72 my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
"SAVEPOINT", lex().ident.data());
79 const string &first_savepoint_name= first_savepoint.getName();
80 if (my_strnncoll(system_charset_info,
81 (
unsigned char *) lex().ident.data(),
83 (
unsigned char *) first_savepoint_name.c_str(),
84 first_savepoint_name.size()) == 0)
87 (void) TransactionServices::rollbackToSavepoint(session(), first_savepoint);
89 if (transaction().all.hasModifiedNonTransData())
91 push_warning(&session(),
92 DRIZZLE_ERROR::WARN_LEVEL_WARN,
93 ER_WARNING_NOT_COMPLETE_ROLLBACK,
94 ER(ER_WARNING_NOT_COMPLETE_ROLLBACK));
109 deque<NamedSavepoint> copy_savepoints(savepoints);
110 deque<NamedSavepoint> new_savepoints;
111 while (savepoints.empty() ==
false)
114 const string &sv_name= sv.getName();
116 my_strnncoll(system_charset_info,
117 (
unsigned char *) lex().ident.data(),
119 (
unsigned char *) sv_name.c_str(),
120 sv_name.size()) == 0)
125 (void) TransactionServices::rollbackToSavepoint(session(), sv);
134 new_savepoints.push_back(sv);
136 savepoints.pop_front();
140 if (transaction().all.hasModifiedNonTransData())
142 push_warning(&session(),
143 DRIZZLE_ERROR::WARN_LEVEL_WARN,
144 ER_WARNING_NOT_COMPLETE_ROLLBACK,
145 ER(ER_WARNING_NOT_COMPLETE_ROLLBACK));
148 transaction().savepoints= new_savepoints;
154 transaction().savepoints= copy_savepoints;
155 my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
"SAVEPOINT", lex().ident.data());
void my_ok(ha_rows affected_rows=0, ha_rows found_rows_arg=0, uint64_t passed_id=0, const char *message=NULL)