Net-Z3950-SimpleServer
view release on metacpan or search on metacpan
SimpleServer.xs view on Meta::CPAN
{
hv_store(href, args->name, strlen(args->name),
newSVpv(args->value, 0), 0);
}
return href;
}
int bend_search(void *handle, bend_search_rr *rr)
{
HV *href;
AV *aref;
SV **temp;
int i;
char **basenames;
WRBUF query;
SV *point;
Zfront_handle *zhandle = (Zfront_handle *)handle;
CV* handler_cv = 0;
SV *rpnSV;
SV *facetSV;
char *ptr;
STRLEN len;
dSP;
ENTER;
SAVETMPS;
aref = newAV();
basenames = rr->basenames;
for (i = 0; i < rr->num_bases; i++)
{
av_push(aref, newSVpv(*basenames++, 0));
}
#if ENABLE_STOP_SERVER
if (rr->num_bases == 1 && !strcmp(rr->basenames[0], "XXstop"))
{
zhandle->stop_flag = 1;
}
#endif
href = newHV();
hv_store(href, "SETNAME", 7, newSVpv(rr->setname, 0), 0);
if (rr->srw_sortKeys && *rr->srw_sortKeys)
hv_store(href, "SRW_SORTKEYS", 12, newSVpv(rr->srw_sortKeys, 0), 0);
hv_store(href, "REPL_SET", 8, newSViv(rr->replace_set), 0);
hv_store(href, "ERR_CODE", 8, newSViv(0), 0);
hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0);
hv_store(href, "HITS", 4, newSViv(0), 0);
hv_store(href, "DATABASES", 9, newRV( (SV*) aref), 0);
hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "PID", 3, newSViv(getpid()), 0);
hv_store(href, "PRESENT_NUMBER", 14, newSViv(rr->present_number), 0);
hv_store(href, "EXTRA_ARGS", 10,
newRV( (SV*) parse_extra_args(rr->extra_args)), 0);
if ((rpnSV = zquery2perl(rr->query)) != 0) {
hv_store(href, "RPN", 3, rpnSV, 0);
}
facetSV = f_FacetList_to_SV(yaz_oi_get_facetlist(&rr->search_input));
if (facetSV) {
hv_store(href, "INPUTFACETS", 11, facetSV, 0);
}
query = zquery2pquery(rr->query);
if (query)
{
hv_store(href, "QUERY", 5, newSVpv((char *)query->buf, query->pos), 0);
}
else if (rr->query->which == Z_Query_type_104 &&
rr->query->u.type_104->which == Z_External_CQL) {
hv_store(href, "CQL", 3,
newSVpv(rr->query->u.type_104->u.cql, 0), 0);
}
else
{
rr->errcode = 108;
return 0;
}
PUSHMARK(sp);
XPUSHs(sv_2mortal(newRV( (SV*) href)));
PUTBACK;
handler_cv = simpleserver_sv2cv( search_ref );
perl_call_sv( (SV *) handler_cv, G_SCALAR | G_DISCARD);
SPAGAIN;
temp = hv_fetch(href, "HITS", 4, 1);
rr->hits = SvIV(*temp);
temp = hv_fetch(href, "ERR_CODE", 8, 1);
rr->errcode = SvIV(*temp);
temp = hv_fetch(href, "ERR_STR", 7, 1);
rr->errstring = string_or_undef(temp, rr->stream);
temp = hv_fetch(href, "HANDLE", 6, 1);
point = newSVsv(*temp);
temp = hv_fetch(href, "OUTPUTFACETS", 12, 1);
if (SvTYPE(*temp) != SVt_NULL)
f_SV_to_FacetList(*temp, &rr->search_info, rr->stream);
temp = hv_fetch(href, "EXTRA_RESPONSE_DATA", 19, 0);
if (temp)
{
ptr = SvPV(*temp, len);
rr->extra_response_data = odr_strdupn(rr->stream, ptr, len);
}
temp = hv_fetch(href, "ESTIMATED" "_HIT_" "COUNT", 19, 0);
if (temp)
{
rr->estimated_hit_count = SvIV(*temp);
}
hv_undef(href);
av_undef(aref);
zhandle->handle = point;
sv_free( (SV*) aref);
sv_free( (SV*) href);
if (query)
wrbuf_destroy(query);
PUTBACK;
FREETMPS;
LEAVE;
return 0;
}
/* ### I am not 100% about the memory management in this handler */
int bend_delete(void *handle, bend_delete_rr *rr)
{
Zfront_handle *zhandle = (Zfront_handle *)handle;
HV *href;
CV* handler_cv;
int i;
SV **temp;
SV *point;
dSP;
ENTER;
SAVETMPS;
href = newHV();
hv_store(href, "GHANDLE", 7, newSVsv(zhandle->ghandle), 0);
hv_store(href, "HANDLE", 6, zhandle->handle, 0);
hv_store(href, "STATUS", 6, newSViv(0), 0);
PUSHMARK(sp);
XPUSHs(sv_2mortal(newRV( (SV*) href)));
PUTBACK;
handler_cv = simpleserver_sv2cv(delete_ref);
if (rr->function == 1) {
/* Delete all result sets in the session */
perl_call_sv( (SV *) handler_cv, G_SCALAR | G_DISCARD);
temp = hv_fetch(href, "STATUS", 6, 1);
rr->delete_status = SvIV(*temp);
( run in 0.836 second using v1.01-cache-2.11-cpan-39bf76dae61 )