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 )