18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
#include "drizzled/cached_directory.h"
23
#include <drizzled/cached_directory.h>
25
25
#include <drizzled/definitions.h>
26
26
#include <drizzled/session.h>
27
27
#include <drizzled/error.h>
28
28
#include <drizzled/gettext.h>
29
29
#include <drizzled/plugin/xa_resource_manager.h>
30
#include "drizzled/xid.h"
30
#include <drizzled/xid.h>
31
#include <drizzled/errmsg_print.h>
32
#include <drizzled/sys_var.h>
35
36
#include <algorithm>
36
37
#include <functional>
44
static std::vector<XaResourceManager *> xa_resource_managers;
42
typedef std::vector<XaResourceManager*> xa_resource_managers_t;
43
static xa_resource_managers_t xa_resource_managers;
46
45
int XaResourceManager::commitOrRollbackXID(XID *xid, bool commit)
48
47
std::vector<int> results;
51
transform(xa_resource_managers.begin(), xa_resource_managers.end(), results.begin(),
52
std::bind2nd(std::mem_fun(&XaResourceManager::xaCommitXid), xid));
54
transform(xa_resource_managers.begin(), xa_resource_managers.end(), results.begin(),
55
std::bind2nd(std::mem_fun(&XaResourceManager::xaRollbackXid), xid));
57
if (std::find_if(results.begin(), results.end(), std::bind2nd(std::equal_to<int>(),0)) == results.end())
48
BOOST_FOREACH(XaResourceManager* it, xa_resource_managers)
49
results.push_back(commit ? it->xaCommitXid(xid) : it->xaRollbackXid(xid));
50
return std::find(results.begin(), results.end(), 0) == results.end();
88
78
XaRecover(XID *trans_list_arg, int trans_len_arg,
89
79
const XaResourceManager::commit_list_set& commit_list_arg,
91
81
: trans_len(trans_len_arg), found_foreign_xids(0), found_my_xids(0),
93
83
trans_list(trans_list_arg), commit_list(commit_list_arg),
94
84
dry_run(dry_run_arg)
97
87
int getForeignXIDs()
99
return found_foreign_xids;
89
return found_foreign_xids;
104
return found_my_xids;
107
97
result_type operator() (argument_type resource_manager)
112
102
while ((got= resource_manager->xaRecover(trans_list, trans_len)) > 0 )
114
104
errmsg_printf(error::INFO,
186
175
xa_resource_managers.end(),
188
177
free(trans_list);
190
179
if (recover_func.getForeignXIDs())
191
180
errmsg_printf(error::WARN,
192
181
_("Found %d prepared XA transactions"),
202
191
"drizzled with the --tc-heuristic-recover switch to "
203
192
"commit or rollback pending transactions."),
204
193
recover_func.getMyXIDs(), opt_tc_log_file);
208
197
if (commit_list.size())
209
198
errmsg_printf(error::INFO, _("Crash recovery finished."));
214
203
bool XaResourceManager::addPlugin(XaResourceManager *resource_manager)