#include <algorithm>
#include <cstddef>
#include <cstdint>
#include "binding.hpp"
#include "rust_callbacks.hpp"
#include "sql/xa.h"
namespace {
xa_status_code to_xa_status(int32_t rc) { return rc == 0 ? XA_OK : XAER_RMERR; }
xa_status_code rusty_hton_commit_by_xid(handlerton *, XID *xid) {
return to_xa_status(rust__hton__commit_by_xid(static_cast<const void *>(xid)));
}
xa_status_code rusty_hton_rollback_by_xid(handlerton *, XID *xid) {
return to_xa_status(
rust__hton__rollback_by_xid(static_cast<const void *>(xid)));
}
int rusty_hton_set_prepared_in_tc(handlerton *, THD *thd) {
return rust__hton__set_prepared_in_tc(static_cast<const void *>(thd));
}
xa_status_code rusty_hton_set_prepared_in_tc_by_xid(handlerton *, XID *xid) {
return to_xa_status(
rust__hton__set_prepared_in_tc_by_xid(static_cast<const void *>(xid)));
}
int rusty_hton_recover_prepared_in_tc(handlerton *, Xa_state_list &xa_list) {
return rust__hton__recover_prepared_in_tc(static_cast<void *>(&xa_list));
}
int rusty_hton_recover(handlerton *, XA_recover_txn *xid_list, uint len,
MEM_ROOT *) {
return static_cast<int>(
rust__hton__recover(static_cast<void *>(xid_list), len));
}
}
extern "C" void mysql__xa_state_list__add(void *xa_list_void, int64_t format_id,
const uint8_t *gtrid_ptr,
size_t gtrid_len,
const uint8_t *bqual_ptr,
size_t bqual_len, int32_t state) {
if (!xa_list_void) return;
size_t g = std::min<size_t>(gtrid_len, 64);
size_t b = std::min<size_t>(bqual_len, 64);
XID xid;
xid.set(static_cast<long>(format_id),
reinterpret_cast<const char *>(gtrid_ptr), static_cast<long>(g),
reinterpret_cast<const char *>(bqual_ptr), static_cast<long>(b));
auto *xa_list = static_cast<Xa_state_list *>(xa_list_void);
xa_list->add(xid, static_cast<enum_ha_recover_xa_state>(state));
}
extern "C" void mysql__xa_recover__set_entry(
void *xid_list_void, uint32_t index, int64_t format_id,
const uint8_t *gtrid_ptr, size_t gtrid_len, const uint8_t *bqual_ptr,
size_t bqual_len) {
if (!xid_list_void) return;
size_t g = std::min<size_t>(gtrid_len, 64);
size_t b = std::min<size_t>(bqual_len, 64);
auto *xid_list = static_cast<XA_recover_txn *>(xid_list_void);
xid_list[index].id.set(static_cast<long>(format_id),
reinterpret_cast<const char *>(gtrid_ptr),
static_cast<long>(g),
reinterpret_cast<const char *>(bqual_ptr),
static_cast<long>(b));
xid_list[index].mod_tables = nullptr;
}
void rusty_hton_wire_xa(handlerton *hton) {
hton->commit_by_xid = rusty_hton_commit_by_xid;
hton->rollback_by_xid = rusty_hton_rollback_by_xid;
hton->set_prepared_in_tc = rusty_hton_set_prepared_in_tc;
hton->set_prepared_in_tc_by_xid = rusty_hton_set_prepared_in_tc_by_xid;
hton->recover_prepared_in_tc = rusty_hton_recover_prepared_in_tc;
hton->recover = rusty_hton_recover;
}