X-Git-Url: http://git.indexdata.com/?p=simpleserver-moved-to-github.git;a=blobdiff_plain;f=SimpleServer.c;h=fd439684d3ca05f8c4fa408a4dab97165c78edb2;hp=59608d7dab300135ad2fd089012128915f59aefd;hb=dce047d22f3830ef79f4f94695c84c5fca8594c9;hpb=76c6d9aa7b7671681fdb7f85f68d45201c080899 diff --git a/SimpleServer.c b/SimpleServer.c index 59608d7..fd43968 100644 --- a/SimpleServer.c +++ b/SimpleServer.c @@ -46,7 +46,9 @@ #ifdef ASN_COMPILED #include #endif - +#ifndef sv_undef /* To fix the problem with Perl 5.6.0 */ +#define sv_undef PL_sv_undef +#endif typedef struct { SV *handle; @@ -167,8 +169,75 @@ WRBUF zquery2pquery(Z_Query *q) int bend_sort(void *handle, bend_sort_rr *rr) { - perl_call_sv(sort_ref, G_VOID | G_DISCARD | G_NOARGS); - return; + HV *href; + AV *aref; + SV **temp; + SV *err_code; + SV *err_str; + SV *status; + STRLEN len; + char *ptr; + char *ODR_err_str; + char **input_setnames; + Zfront_handle *zhandle = (Zfront_handle *)handle; + int i; + + dSP; + ENTER; + SAVETMPS; + + aref = newAV(); + input_setnames = rr->input_setnames; + for (i = 0; i < rr->num_input_setnames; i++) + { + av_push(aref, newSVpv(*input_setnames++, 0)); + } + href = newHV(); + hv_store(href, "INPUT", 5, newRV( (SV*) aref), 0); + hv_store(href, "OUTPUT", 6, newSVpv(rr->output_setname, 0), 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; + + perl_call_sv(sort_ref, G_SCALAR | G_DISCARD); + + SPAGAIN; + + temp = hv_fetch(href, "ERR_CODE", 8, 1); + err_code = newSVsv(*temp); + + temp = hv_fetch(href, "ERR_STR", 7, 1); + err_str = newSVsv(*temp); + + temp = hv_fetch(href, "STATUS", 6, 1); + status = newSVsv(*temp); + + + + + PUTBACK; + FREETMPS; + LEAVE; + + hv_undef(href), + av_undef(aref); + rr->errcode = SvIV(err_code); + rr->sort_status = SvIV(status); + ptr = SvPV(err_str, len); + ODR_err_str = (char *)odr_malloc(rr->stream, len + 1); + strcpy(ODR_err_str, ptr); + rr->errstring = ODR_err_str; + + sv_free(err_code); + sv_free(err_str); + sv_free(status); + + return 0; } @@ -381,7 +450,7 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) if (composition->which == Z_RecordComp_simple) { simple = composition->u.simple; - if (simple->which == 1) + if (simple->which == Z_ElementSetNames_generic) { hv_store(href, "COMP", 4, newSVpv(simple->u.generic, 0), 0); } @@ -486,34 +555,42 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) int bend_present(void *handle, bend_present_rr *rr) { - int n; HV *href; SV **temp; SV *err_code; SV *err_string; + SV *hits; + SV *point; STRLEN len; Z_RecordComposition *composition; Z_ElementSetNames *simple; char *ODR_errstr; char *ptr; + Zfront_handle *zhandle = (Zfront_handle *)handle; + +/* WRBUF oid_dotted; */ dSP; ENTER; SAVETMPS; href = newHV(); + hv_store(href, "HANDLE", 6, zhandle->handle, 0); hv_store(href, "ERR_CODE", 8, newSViv(0), 0); hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0); hv_store(href, "START", 5, newSViv(rr->start), 0); hv_store(href, "SETNAME", 7, newSVpv(rr->setname, 0), 0); hv_store(href, "NUMBER", 6, newSViv(rr->number), 0); + /*oid_dotted = oid2dotted(rr->request_format_raw); + hv_store(href, "REQ_FORM", 8, newSVpv((char *)oid_dotted->buf, oid_dotted->pos), 0);*/ + hv_store(href, "HITS", 4, newSViv(0), 0); if (rr->comp) { composition = rr->comp; - if (composition->which == 1) + if (composition->which == Z_RecordComp_simple) { simple = composition->u.simple; - if (simple->which == 1) + if (simple->which == Z_ElementSetNames_generic) { hv_store(href, "COMP", 4, newSVpv(simple->u.generic, 0), 0); } @@ -536,7 +613,7 @@ int bend_present(void *handle, bend_present_rr *rr) PUTBACK; - n = perl_call_sv(present_ref, G_SCALAR | G_DISCARD); + perl_call_sv(present_ref, G_SCALAR | G_DISCARD); SPAGAIN; @@ -546,20 +623,30 @@ int bend_present(void *handle, bend_present_rr *rr) temp = hv_fetch(href, "ERR_STR", 7, 1); err_string = newSVsv(*temp); + temp = hv_fetch(href, "HITS", 4, 1); + hits = newSVsv(*temp); + + temp = hv_fetch(href, "HANDLE", 6, 1); + point = newSVsv(*temp); + PUTBACK; FREETMPS; LEAVE; hv_undef(href); rr->errcode = SvIV(err_code); + rr->hits = SvIV(hits); ptr = SvPV(err_string, len); ODR_errstr = (char *)odr_malloc(rr->stream, len + 1); strcpy(ODR_errstr, ptr); rr->errstring = ODR_errstr; - +/* wrbuf_free(oid_dotted, 1);*/ + zhandle->handle = point; + handle = zhandle; sv_free(err_code); sv_free(err_string); + sv_free(hits); sv_free( (SV*) href); return 0; @@ -613,7 +700,10 @@ bend_initresult *bend_init(bend_initrequest *q) { q->bend_search = bend_search; } - /*q->bend_present = present;*/ + if (present_ref) + { + q->bend_present = bend_present; + } /*q->bend_esrequest = bend_esrequest;*/ /*q->bend_delete = bend_delete;*/ if (fetch_ref) @@ -625,6 +715,7 @@ bend_initresult *bend_init(bend_initrequest *q) hv_store(href, "IMP_NAME", 8, newSVpv("", 0), 0); hv_store(href, "IMP_VER", 7, newSVpv("", 0), 0); hv_store(href, "ERR_CODE", 8, newSViv(0), 0); + hv_store(href, "PEER_NAME", 9, newSVpv(q->peer_name, 0), 0); hv_store(href, "HANDLE", 6, newSVsv(&sv_undef), 0); PUSHMARK(sp); @@ -709,17 +800,17 @@ void bend_close(void *handle) } -#line 713 "SimpleServer.c" +#line 804 "SimpleServer.c" XS(XS_Net__Z3950__SimpleServer_set_init_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_init_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_init_handler(arg)"); { SV * arg = ST(0); -#line 709 "SimpleServer.xs" +#line 800 "SimpleServer.xs" init_ref = newSVsv(arg); -#line 723 "SimpleServer.c" +#line 814 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -728,12 +819,12 @@ XS(XS_Net__Z3950__SimpleServer_set_close_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_close_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_close_handler(arg)"); { SV * arg = ST(0); -#line 716 "SimpleServer.xs" +#line 807 "SimpleServer.xs" close_ref = newSVsv(arg); -#line 737 "SimpleServer.c" +#line 828 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -742,12 +833,12 @@ XS(XS_Net__Z3950__SimpleServer_set_sort_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_sort_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_sort_handler(arg)"); { SV * arg = ST(0); -#line 723 "SimpleServer.xs" +#line 814 "SimpleServer.xs" sort_ref = newSVsv(arg); -#line 751 "SimpleServer.c" +#line 842 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -756,12 +847,12 @@ XS(XS_Net__Z3950__SimpleServer_set_search_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_search_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_search_handler(arg)"); { SV * arg = ST(0); -#line 729 "SimpleServer.xs" +#line 820 "SimpleServer.xs" search_ref = newSVsv(arg); -#line 765 "SimpleServer.c" +#line 856 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -770,12 +861,12 @@ XS(XS_Net__Z3950__SimpleServer_set_fetch_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_fetch_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_fetch_handler(arg)"); { SV * arg = ST(0); -#line 736 "SimpleServer.xs" +#line 827 "SimpleServer.xs" fetch_ref = newSVsv(arg); -#line 779 "SimpleServer.c" +#line 870 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -784,12 +875,12 @@ XS(XS_Net__Z3950__SimpleServer_set_present_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_present_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_present_handler(arg)"); { SV * arg = ST(0); -#line 743 "SimpleServer.xs" +#line 834 "SimpleServer.xs" present_ref = newSVsv(arg); -#line 793 "SimpleServer.c" +#line 884 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -798,12 +889,12 @@ XS(XS_Net__Z3950__SimpleServer_set_esrequest_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_esrequest_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_esrequest_handler(arg)"); { SV * arg = ST(0); -#line 750 "SimpleServer.xs" +#line 841 "SimpleServer.xs" esrequest_ref = newSVsv(arg); -#line 807 "SimpleServer.c" +#line 898 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -812,12 +903,12 @@ XS(XS_Net__Z3950__SimpleServer_set_delete_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_delete_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_delete_handler(arg)"); { SV * arg = ST(0); -#line 757 "SimpleServer.xs" +#line 848 "SimpleServer.xs" delete_ref = newSVsv(arg); -#line 821 "SimpleServer.c" +#line 912 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -826,12 +917,12 @@ XS(XS_Net__Z3950__SimpleServer_set_scan_handler) { dXSARGS; if (items != 1) - croak("Usage: Net::Z3950::SimpleServer::set_scan_handler(arg)"); + Perl_croak(aTHX_ "Usage: Net::Z3950::SimpleServer::set_scan_handler(arg)"); { SV * arg = ST(0); -#line 764 "SimpleServer.xs" +#line 855 "SimpleServer.xs" scan_ref = newSVsv(arg); -#line 835 "SimpleServer.c" +#line 926 "SimpleServer.c" } XSRETURN_EMPTY; } @@ -840,15 +931,16 @@ XS(XS_Net__Z3950__SimpleServer_start_server) { dXSARGS; { -#line 770 "SimpleServer.xs" +#line 861 "SimpleServer.xs" char **argv; char **argv_buf; char *ptr; int i; STRLEN len; -#line 850 "SimpleServer.c" +#line 941 "SimpleServer.c" int RETVAL; -#line 776 "SimpleServer.xs" + dXSTARG; +#line 867 "SimpleServer.xs" argv_buf = (char **)xmalloc((items + 1) * sizeof(char *)); argv = argv_buf; for (i = 0; i < items; i++) @@ -860,9 +952,8 @@ XS(XS_Net__Z3950__SimpleServer_start_server) *argv_buf = NULL; RETVAL = statserv_main(items, argv, bend_init, bend_close); -#line 864 "SimpleServer.c" - ST(0) = sv_newmortal(); - sv_setiv(ST(0), (IV)RETVAL); +#line 956 "SimpleServer.c" + XSprePUSH; PUSHi((IV)RETVAL); } XSRETURN(1); }