X-Git-Url: http://git.indexdata.com/?p=simpleserver-moved-to-github.git;a=blobdiff_plain;f=SimpleServer.xs;h=11622daf43bbfac6c62d100df72355c92b6ed623;hp=8b03c555bb1adf68a66918f5e371cc263c382035;hb=e1c360ffe42917276f87ee47c003b074927de2ff;hpb=1396c6a447490a2e182940ac39a5eabfc2bf45e6 diff --git a/SimpleServer.xs b/SimpleServer.xs index 8b03c55..11622da 100644 --- a/SimpleServer.xs +++ b/SimpleServer.xs @@ -1002,6 +1002,11 @@ int bend_search(void *handle, bend_search_rr *rr) 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); @@ -1094,7 +1099,6 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) HV *href; SV **temp; SV *basename; - SV *record; SV *last; SV *err_code; SV *err_string; @@ -1135,7 +1139,6 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) hv_store(href, "REQ_FORM", 8, newSVpv((char *)oid_dotted->buf, oid_dotted->pos), 0); hv_store(href, "REP_FORM", 8, newSVpv((char *)oid_dotted->buf, oid_dotted->pos), 0); hv_store(href, "BASENAME", 8, newSVpv("", 0), 0); - hv_store(href, "RECORD", 6, newSVpv("", 0), 0); hv_store(href, "LAST", 4, newSViv(0), 0); hv_store(href, "ERR_CODE", 8, newSViv(0), 0); hv_store(href, "ERR_STR", 7, newSVpv("", 0), 0); @@ -1204,8 +1207,6 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) temp = hv_fetch(href, "BASENAME", 8, 1); basename = newSVsv(*temp); - temp = hv_fetch(href, "RECORD", 6, 1); - record = newSVsv(*temp); temp = hv_fetch(href, "LAST", 4, 1); last = newSVsv(*temp); @@ -1234,9 +1235,6 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) temp = hv_fetch(href, "HANDLE", 6, 1); point = newSVsv(*temp); - - hv_undef(href); - ptr = SvPV(basename, length); rr->basename = odr_strdupn(rr->stream, ptr, length); @@ -1250,18 +1248,26 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) rr->output_format = odr_oiddup(rr->stream, yaz_oid_recsyn_sutrs); } - ptr = SvPV(record, length); - /* Treat GRS-1 records separately */ - if (!oid_oidcmp(rr->output_format, yaz_oid_recsyn_grs_1)) - { - rr->record = (char *) read_grs1(ptr, rr->stream); - rr->len = -1; - } - else + temp = hv_fetch(href, "RECORD", 6, 0); + if (temp) { - rr->record = odr_strdupn(rr->stream, ptr, length); - rr->len = length; + SV *record = newSVsv(*temp); + ptr = SvPV(record, length); + /* Treat GRS-1 records separately */ + if (!oid_oidcmp(rr->output_format, yaz_oid_recsyn_grs_1)) + { + rr->record = (char *) read_grs1(ptr, rr->stream); + rr->len = -1; + } + else + { + rr->record = odr_strdupn(rr->stream, ptr, length); + rr->len = length; + } + sv_free(record); } + hv_undef(href); + zhandle->handle = point; handle = zhandle; rr->last_in_set = SvIV(last); @@ -1277,7 +1283,6 @@ int bend_fetch(void *handle, bend_fetch_rr *rr) wrbuf_destroy(oid_dotted); sv_free((SV*) href); sv_free(basename); - sv_free(record); sv_free(last); sv_free(err_string); sv_free(err_code), @@ -1426,7 +1431,6 @@ int bend_scan(void *handle, bend_scan_rr *rr) AV *list; AV *entries; HV *scan_item; - struct scan_entry *scan_list; struct scan_entry *buffer; int *step_size = rr->step_size; int scan_list_size = rr->num_entries; @@ -1529,19 +1533,7 @@ int bend_scan(void *handle, bend_scan_rr *rr) rr->errcode = SvIV(err_code); rr->num_entries = SvIV(number); rr->status = SvIV(status); - if (yaz_version(NULL, NULL) >= 0x4022c && - rr->num_entries <= scan_list_size) - { - /* entries has been initialized by yaz and is big enough - to hold all entries */ - scan_list = rr->entries; - } - else - { - scan_list = (struct scan_entry *) - odr_malloc(rr->stream, rr->num_entries * sizeof(*scan_list)); - } - buffer = scan_list; + buffer = rr->entries; entries = (AV *)SvRV(entries_ref); if (rr->errcode == 0) for (i = 0; i < rr->num_entries; i++) { @@ -1560,7 +1552,6 @@ int bend_scan(void *handle, bend_scan_rr *rr) buffer++; hv_undef(scan_item); } - rr->entries = scan_list; zhandle->handle = point; handle = zhandle;