+int bend_explain(void *handle, bend_explain_rr *q)
+{
+ HV *href;
+ CV *handler_cv = 0;
+ SV **temp;
+ char *explain;
+ SV *explainsv;
+ STRLEN len;
+ Zfront_handle *zhandle = (Zfront_handle *)handle;
+
+ dSP;
+ ENTER;
+ SAVETMPS;
+
+ href = newHV();
+ hv_store(href, "EXPLAIN", 7, newSVpv("", 0), 0);
+ hv_store(href, "DATABASE", 8, newSVpv(q->database, 0), 0);
+ hv_store(href, "HANDLE", 6, zhandle->handle, 0);
+
+ PUSHMARK(sp);
+ XPUSHs(sv_2mortal(newRV((SV*) href)));
+ PUTBACK;
+
+ handler_cv = simpleserver_sv2cv(explain_ref);
+ perl_call_sv((SV*) handler_cv, G_SCALAR | G_DISCARD);
+
+ SPAGAIN;
+
+ temp = hv_fetch(href, "EXPLAIN", 7, 1);
+ explainsv = newSVsv(*temp);
+
+ PUTBACK;
+ FREETMPS;
+ LEAVE;
+
+ explain = SvPV(explainsv, len);
+ q->explain_buf = (char*) odr_malloc(q->stream, len + 1);
+ strcpy(q->explain_buf, explain);
+
+ return 0;
+}
+