X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebrasrv.c;h=2560f4eb82966b4ef0b8dd56229ef8a2c5cbdd4e;hp=7ef4cd2c5717a44fbe46def0c470980354d32535;hb=00d6544408e2de88277e091fb7f8f4dfe3949558;hpb=dedcb702edbaed5026f1f98964ca68edcfd3cfc2 diff --git a/index/zebrasrv.c b/index/zebrasrv.c index 7ef4cd2..2560f4e 100644 --- a/index/zebrasrv.c +++ b/index/zebrasrv.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2011 Index Data + Copyright (C) Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -37,6 +37,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include #include #include @@ -132,7 +133,7 @@ bend_initresult *bend_init(bend_initrequest *q) yaz_get_proposal_charneg(nmem, q->charneg_request, &charsets, &num_charsets, &langs, &num_langs, &selected); - + for (i = 0; i < num_charsets; i++) { const char *right_name = ""; @@ -142,7 +143,7 @@ bend_initresult *bend_init(bend_initrequest *q) * because a lot servers in Russia to use own in during * character set and language negotiation still. */ - + if (!yaz_matchstr(charsets[i], "win")) { right_name = "WINDOWS-1251"; } else if (!yaz_matchstr(charsets[i], "koi")) { @@ -211,7 +212,7 @@ static void search_terms(ZebraHandle zh, bend_search_rr *r) sr->num = no_terms; sr->elements = odr_malloc(r->stream, sr->num * sizeof(*sr->elements)); - for (i = 0; ielements[i] = odr_malloc(r->stream, sizeof(**sr->elements)); - se->subqueryId = term_ref_id ? + se->subqueryId = term_ref_id ? odr_strdup(r->stream, term_ref_id) : 0; - + se->fullQuery = odr_booldup(r->stream, 0); - se->subqueryExpression = + se->subqueryExpression = odr_malloc(r->stream, sizeof(Z_QueryExpression)); - se->subqueryExpression->which = + se->subqueryExpression->which = Z_QueryExpression_term; se->subqueryExpression->u.term = odr_malloc(r->stream, sizeof(Z_QueryExpressionTerm)); @@ -245,10 +246,11 @@ static void search_terms(ZebraHandle zh, bend_search_rr *r) break; case Z_Term_general: term->which = Z_Term_general; - term->u.general = odr_malloc(r->stream, sizeof(*term->u.general)); - term->u.general->size = term->u.general->len = len; - term->u.general->buf = odr_malloc(r->stream, len); - memcpy(term->u.general->buf, outbuf, len); + term->u.general = odr_create_Odr_oct(r->stream, +#if YAZ_VERSIONL < 0x50000 + (unsigned char *) +#endif + outbuf, len); break; default: term->which = Z_Term_general; @@ -265,7 +267,7 @@ static void search_terms(ZebraHandle zh, bend_search_rr *r) static int break_handler(void *client_data) { - bend_association assoc =(bend_association) client_data; + bend_association assoc =(bend_association) client_data; if (!bend_assoc_is_alive(assoc)) return 1; return 0; @@ -274,6 +276,7 @@ static int break_handler(void *client_data) static Z_RPNQuery *query_add_sortkeys(ODR o, Z_RPNQuery *query, const char *sortKeys) { +#if YAZ_VERSIONL >= 0x40200 /* sortkey layour: path,schema,ascending,caseSensitive,missingValue */ /* see cql_sortby_to_sortkeys of YAZ. */ char **sortspec; @@ -295,16 +298,16 @@ static Z_RPNQuery *query_add_sortkeys(ODR o, Z_RPNQuery *query, int num_arg; int ascending = 1; nmem_strsplitx(odr_getmem(o), ",", sortspec[i], &arg, &num_arg, 0); - - if (num_arg != 5) + + if (num_arg > 5 || num_arg < 1) { yaz_log(YLOG_WARN, "Invalid sort spec '%s' num_arg=%d", sortspec[i], num_arg); break; } - if (arg[2][0]) + if (num_arg > 2 && arg[2][0]) ascending = atoi(arg[2]); - + if (i < num_sortspec-1) wrbuf_puts(w, " @or"); wrbuf_puts(w, " @attr 1="); @@ -320,7 +323,7 @@ static Z_RPNQuery *query_add_sortkeys(ODR o, Z_RPNQuery *query, else { Z_RPNStructure *s = nquery->RPNStructure; - + if (s->which != Z_RPNStructure_complex) { yaz_log(YLOG_WARN, "query_add_sortkeys: not complex operand"); @@ -335,6 +338,12 @@ static Z_RPNQuery *query_add_sortkeys(ODR o, Z_RPNQuery *query, } wrbuf_destroy(w); } +#else + if (sortKeys) + { + yaz_log(YLOG_WARN, "sortkeys ignored because YAZ version < 4.2.0"); + } +#endif return query; } @@ -389,7 +398,7 @@ int bend_fetch(void *handle, bend_fetch_rr *r) ZEBRA_RES res; retrievalRecord.position = r->number; - + r->last_in_set = 0; res = zebra_records_retrieve(zh, r->stream, r->setname, r->comp, r->request_format, 1, &retrievalRecord); @@ -423,7 +432,7 @@ static int bend_scan(void *handle, bend_scan_rr *r) int is_partial, i; ZEBRA_RES res; - res = zebra_select_databases(zh, r->num_bases, + res = zebra_select_databases(zh, r->num_bases, (const char **) r->basenames); if (res != ZEBRA_OK) { @@ -438,7 +447,7 @@ static int bend_scan(void *handle, bend_scan_rr *r) res = zebra_scan(zh, r->stream, r->term, r->attributeset, &r->term_position, - &r->num_entries, &entries, &is_partial, + &r->num_entries, &entries, &is_partial, 0 /* setname */); if (res == ZEBRA_OK) { @@ -582,7 +591,7 @@ int bend_segment(void *handle, bend_segment_rr *rr) int bend_esrequest(void *handle, bend_esrequest_rr *rr) { ZebraHandle zh = (ZebraHandle) handle; - + yaz_log(YLOG_LOG, "function: " ODR_INT_PRINTF, *rr->esr->function); if (rr->esr->packageName) yaz_log(YLOG_LOG, "packagename: %s", rr->esr->packageName); @@ -605,7 +614,7 @@ int bend_esrequest(void *handle, bend_esrequest_rr *rr) Z_IUUpdateEsRequest *esRequest = up->u.esRequest; Z_IUOriginPartToKeep *toKeep = esRequest->toKeep; Z_IUSuppliedRecords *notToKeep = esRequest->notToKeep; - + yaz_log(YLOG_LOG, "action"); if (toKeep->action) { @@ -738,7 +747,7 @@ int bend_esrequest(void *handle, bend_esrequest_rr *rr) rr->errstring = "unsupported ES Update action"; break; } - + if (opaque_recid) { size_t l = opaque_recid->len; @@ -779,7 +788,7 @@ int bend_esrequest(void *handle, bend_esrequest_rr *rr) yaz_log(YLOG_WARN, "Unknown Extended Service(%d)", rr->esr->taskSpecificParameters->which); rr->errcode = YAZ_BIB1_ES_EXTENDED_SERVICE_TYPE_UNSUPP; - + } return 0; } @@ -800,9 +809,9 @@ static void bend_start(struct statserv_options_block *sob) exit(1); } #ifdef WIN32 - + #else - if (!sob->inetd && !sob->background) + if (!sob->inetd && !sob->background) { char pidfname[4096]; struct flock area; @@ -836,7 +845,7 @@ static void bend_start(struct statserv_options_block *sob) else { char pidstr[30]; - + sprintf(pidstr, "%ld", (long) getpid()); if (write(fd, pidstr, strlen(pidstr)) != strlen(pidstr)) { @@ -853,7 +862,7 @@ static void bend_stop(struct statserv_options_block *sob) #ifdef WIN32 #else - if (!sob->inetd && !sob->background && sob->handle) + if (!sob->inetd && !sob->background && sob->handle) { char pidfname[4096]; zebra_pidfname(sob->handle, pidfname);