mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Upgraded to latest handlersocket code. This fixed LP:766870 "Assertion `next_insert_id == 0' failed with handlersocket"
sql/handler.cc: Added DBUG_ code
This commit is contained in:
@@ -109,7 +109,7 @@ hv_to_strmap(HV *hv, std::map<std::string, std::string>& m_r)
|
||||
static void
|
||||
strrefarr_push_back(std::vector<dena::string_ref>& a_r, SV *sv)
|
||||
{
|
||||
if (sv == 0 || SvTYPE(sv) == SVt_NULL) {
|
||||
if (sv == 0 || SvTYPE(sv) == SVt_NULL) { /* !SvPOK()? */
|
||||
DBG(fprintf(stderr, "strrefarr_push_back: null\n"));
|
||||
return a_r.push_back(dena::string_ref());
|
||||
}
|
||||
@@ -135,7 +135,7 @@ av_to_strrefarr(AV *av, std::vector<dena::string_ref>& a_r)
|
||||
static dena::string_ref
|
||||
sv_get_string_ref(SV *sv)
|
||||
{
|
||||
if (sv == 0) {
|
||||
if (sv == 0 || SvTYPE(sv) == SVt_NULL) { /* !SvPOK()? */
|
||||
return dena::string_ref();
|
||||
}
|
||||
STRLEN vlen = 0;
|
||||
@@ -190,7 +190,8 @@ set_process_verbose_level(const std::map<std::string, std::string>& m)
|
||||
|
||||
static AV *
|
||||
execute_internal(SV *obj, int id, const char *op, AV *keys, int limit,
|
||||
int skip, const char *modop, AV *modvals, AV *filters)
|
||||
int skip, const char *modop, AV *modvals, AV *filters, int invalues_keypart,
|
||||
AV *invalues)
|
||||
{
|
||||
AV *retval = (AV *)&PL_sv_undef;
|
||||
dena::hstcpcli_i *const ptr =
|
||||
@@ -198,6 +199,7 @@ execute_internal(SV *obj, int id, const char *op, AV *keys, int limit,
|
||||
do {
|
||||
std::vector<dena::string_ref> keyarr, mvarr;
|
||||
std::vector<dena::hstcpcli_filter> farr;
|
||||
std::vector<dena::string_ref> ivs;
|
||||
av_to_strrefarr(keys, keyarr);
|
||||
dena::string_ref modop_ref;
|
||||
if (modop != 0) {
|
||||
@@ -207,9 +209,13 @@ execute_internal(SV *obj, int id, const char *op, AV *keys, int limit,
|
||||
if (filters != 0) {
|
||||
av_to_filters(filters, farr);
|
||||
}
|
||||
if (invalues_keypart >= 0 && invalues != 0) {
|
||||
av_to_strrefarr(invalues, ivs);
|
||||
}
|
||||
ptr->request_buf_exec_generic(id, dena::string_ref(op, strlen(op)),
|
||||
&keyarr[0], keyarr.size(), limit, skip, modop_ref, &mvarr[0],
|
||||
mvarr.size(), &farr[0], farr.size());
|
||||
mvarr.size(), &farr[0], farr.size(), invalues_keypart, &ivs[0],
|
||||
ivs.size());
|
||||
AV *const av = newAV();
|
||||
retval = av;
|
||||
if (ptr->request_send() != 0) {
|
||||
@@ -258,8 +264,10 @@ struct execute_arg {
|
||||
const char *modop;
|
||||
AV *modvals;
|
||||
AV *filters;
|
||||
int invalues_keypart;
|
||||
AV *invalues;
|
||||
execute_arg() : id(0), op(0), keys(0), limit(0), skip(0), modop(0),
|
||||
modvals(0), filters(0) { }
|
||||
modvals(0), filters(0), invalues_keypart(-1), invalues(0) { }
|
||||
};
|
||||
|
||||
static AV *
|
||||
@@ -271,6 +279,7 @@ execute_multi_internal(SV *obj, const execute_arg *args, size_t num_args)
|
||||
for (size_t i = 0; i < num_args; ++i) {
|
||||
std::vector<dena::string_ref> keyarr, mvarr;
|
||||
std::vector<dena::hstcpcli_filter> farr;
|
||||
std::vector<dena::string_ref> ivs;
|
||||
const execute_arg& arg = args[i];
|
||||
av_to_strrefarr(arg.keys, keyarr);
|
||||
dena::string_ref modop_ref;
|
||||
@@ -281,10 +290,13 @@ execute_multi_internal(SV *obj, const execute_arg *args, size_t num_args)
|
||||
if (arg.filters != 0) {
|
||||
av_to_filters(arg.filters, farr);
|
||||
}
|
||||
if (arg.invalues_keypart >= 0 && arg.invalues != 0) {
|
||||
av_to_strrefarr(arg.invalues, ivs);
|
||||
}
|
||||
ptr->request_buf_exec_generic(arg.id,
|
||||
dena::string_ref(arg.op, strlen(arg.op)), &keyarr[0], keyarr.size(),
|
||||
arg.limit, arg.skip, modop_ref, &mvarr[0], mvarr.size(), &farr[0],
|
||||
farr.size());
|
||||
farr.size(), arg.invalues_keypart, &ivs[0], ivs.size());
|
||||
}
|
||||
AV *const retval = newAV();
|
||||
/* sends the requests */
|
||||
@@ -419,6 +431,34 @@ CODE:
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
int
|
||||
auth(obj, key, typ = 0)
|
||||
SV *obj
|
||||
const char *key
|
||||
const char *typ
|
||||
CODE:
|
||||
RETVAL = 0;
|
||||
dena::hstcpcli_i *const ptr =
|
||||
reinterpret_cast<dena::hstcpcli_i *>(SvIV(SvRV(obj)));
|
||||
do {
|
||||
ptr->request_buf_auth(key, typ);
|
||||
if (ptr->request_send() != 0) {
|
||||
break;
|
||||
}
|
||||
size_t nflds = 0;
|
||||
ptr->response_recv(nflds);
|
||||
const int e = ptr->get_error_code();
|
||||
DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code()));
|
||||
if (e >= 0) {
|
||||
ptr->response_buf_remove();
|
||||
}
|
||||
DBG(fprintf(stderr, "errcode=%d\n", ptr->get_error_code()));
|
||||
} while (0);
|
||||
RETVAL = ptr->get_error_code();
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
int
|
||||
open_index(obj, id, db, table, index, fields, ffields = 0)
|
||||
SV *obj
|
||||
@@ -452,7 +492,7 @@ OUTPUT:
|
||||
RETVAL
|
||||
|
||||
AV *
|
||||
execute_single(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0)
|
||||
execute_single(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0, ivkeypart = -1, ivs = 0)
|
||||
SV *obj
|
||||
int id
|
||||
const char *op
|
||||
@@ -462,12 +502,15 @@ execute_single(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0)
|
||||
SV *mop
|
||||
SV *mvs
|
||||
SV *fils
|
||||
int ivkeypart
|
||||
SV *ivs
|
||||
CODE:
|
||||
const char *const mop_str = sv_get_strval(mop);
|
||||
AV *const mvs_av = sv_get_arrval(mvs);
|
||||
AV *const fils_av = sv_get_arrval(fils);
|
||||
AV *const ivs_av = sv_get_arrval(ivs);
|
||||
RETVAL = execute_internal(obj, id, op, keys, limit, skip, mop_str, mvs_av,
|
||||
fils_av);
|
||||
fils_av, ivkeypart, ivs_av);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
@@ -500,9 +543,11 @@ CODE:
|
||||
ag.modop = arr_get_strval(avtarget, argmax, 5);
|
||||
ag.modvals = arr_get_arrval(avtarget, argmax, 6);
|
||||
ag.filters = arr_get_arrval(avtarget, argmax, 7);
|
||||
DBG(fprintf(stderr, "execute_multi3 %d: %d %s %p %d %d %s %p %p\n",
|
||||
ag.invalues_keypart = arr_get_intval(avtarget, argmax, 8, -1);
|
||||
ag.invalues = arr_get_arrval(avtarget, argmax, 9);
|
||||
DBG(fprintf(stderr, "execute_multi3 %d: %d %s %p %d %d %s %p %p %d %p\n",
|
||||
i, ag.id, ag.op, ag.keys, ag.limit, ag.skip, ag.modop, ag.modvals,
|
||||
ag.filters));
|
||||
ag.filters, ag.invalues_keypart, ag.invalues));
|
||||
}
|
||||
RETVAL = execute_multi_internal(obj, args, cmdsmax + 1);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
@@ -510,7 +555,7 @@ OUTPUT:
|
||||
RETVAL
|
||||
|
||||
AV *
|
||||
execute_find(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0)
|
||||
execute_find(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0, ivkeypart = -1, ivs = 0)
|
||||
SV *obj
|
||||
int id
|
||||
const char *op
|
||||
@@ -520,18 +565,21 @@ execute_find(obj, id, op, keys, limit, skip, mop = 0, mvs = 0, fils = 0)
|
||||
SV *mop
|
||||
SV *mvs
|
||||
SV *fils
|
||||
int ivkeypart
|
||||
SV *ivs
|
||||
CODE:
|
||||
const char *const mop_str = sv_get_strval(mop);
|
||||
AV *const mvs_av = sv_get_arrval(mvs);
|
||||
AV *const fils_av = sv_get_arrval(fils);
|
||||
AV *const ivs_av = sv_get_arrval(ivs);
|
||||
RETVAL = execute_internal(obj, id, op, keys, limit, skip, mop_str, mvs_av,
|
||||
fils_av);
|
||||
fils_av, ivkeypart, ivs_av);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
AV *
|
||||
execute_update(obj, id, op, keys, limit, skip, modvals, fils = 0)
|
||||
execute_update(obj, id, op, keys, limit, skip, modvals, fils = 0, ivkeypart = -1, ivs = 0)
|
||||
SV *obj
|
||||
int id
|
||||
const char *op
|
||||
@@ -540,16 +588,19 @@ execute_update(obj, id, op, keys, limit, skip, modvals, fils = 0)
|
||||
int skip
|
||||
AV *modvals
|
||||
SV *fils
|
||||
int ivkeypart
|
||||
SV *ivs
|
||||
CODE:
|
||||
AV *const fils_av = sv_get_arrval(fils);
|
||||
AV *const ivs_av = sv_get_arrval(ivs);
|
||||
RETVAL = execute_internal(obj, id, op, keys, limit, skip, "U",
|
||||
modvals, fils_av);
|
||||
modvals, fils_av, ivkeypart, ivs_av);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
AV *
|
||||
execute_delete(obj, id, op, keys, limit, skip, fils = 0)
|
||||
execute_delete(obj, id, op, keys, limit, skip, fils = 0, ivkeypart = -1, ivs = 0)
|
||||
SV *obj
|
||||
int id
|
||||
const char *op
|
||||
@@ -557,9 +608,13 @@ execute_delete(obj, id, op, keys, limit, skip, fils = 0)
|
||||
int limit
|
||||
int skip
|
||||
SV *fils
|
||||
int ivkeypart
|
||||
SV *ivs
|
||||
CODE:
|
||||
AV *const fils_av = sv_get_arrval(fils);
|
||||
RETVAL = execute_internal(obj, id, op, keys, limit, skip, "D", 0, fils_av);
|
||||
AV *const ivs_av = sv_get_arrval(ivs);
|
||||
RETVAL = execute_internal(obj, id, op, keys, limit, skip, "D", 0, fils_av,
|
||||
ivkeypart, ivs_av);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
@@ -570,7 +625,7 @@ execute_insert(obj, id, fvals)
|
||||
int id
|
||||
AV *fvals
|
||||
CODE:
|
||||
RETVAL = execute_internal(obj, id, "+", fvals, 0, 0, 0, 0, 0);
|
||||
RETVAL = execute_internal(obj, id, "+", fvals, 0, 0, 0, 0, 0, -1, 0);
|
||||
sv_2mortal((SV *)RETVAL);
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
@@ -5,4 +5,4 @@ MANIFEST
|
||||
ppport.h
|
||||
README
|
||||
t/HandlerSocket.t
|
||||
lib/HandlerSocket.pm
|
||||
lib/Net/HandlerSocket.pm
|
||||
|
Reference in New Issue
Block a user