X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=64c3dcc1dbeed2f23af6fd06604b482d4c6d92f9;hb=eb44a82db835f33bbd984072ee18dd2ec34ae9cb;hp=04f0b3aed63b4617c00c4a8e7fbc573a6297d69e;hpb=346a451790f8782b1bbc03a98951687f563f2445;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index 04f0b3a..64c3dcc 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -1,4 +1,4 @@ -/* $Id: retrieve.c,v 1.50 2006-11-15 14:09:43 marc Exp $ +/* $Id: retrieve.c,v 1.55 2006-11-21 22:17:49 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -109,7 +109,7 @@ static void parse_zebra_elem(const char *elem, } -int zebra_special_index_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, +int zebra_special_index_fetch(ZebraHandle zh, zint sysno, ODR odr, Record rec, const char *elemsetname, oid_value input_format, @@ -120,29 +120,55 @@ int zebra_special_index_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, size_t retrieval_index_len; const char *retrieval_type; size_t retrieval_type_len; - - /* int return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; */ - - WRBUF wrbuf = wrbuf_alloc(); + WRBUF wrbuf = 0; zebra_rec_keys_t keys; + /* set output variables before processing possible error states */ + /* *rec_lenp = 0; */ + /* only accept XML and SUTRS requests */ if (input_format != VAL_TEXT_XML && input_format != VAL_SUTRS){ yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s", elemsetname); *output_format = VAL_NONE; - return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; + return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST; } - keys = zebra_rec_keys_open(); - zebra_rec_keys_set_buf(keys, rec->info[recInfo_delKeys], - rec->size[recInfo_delKeys], 0); - parse_zebra_elem(elemsetname, &retrieval_index, &retrieval_index_len, &retrieval_type, &retrieval_type_len); + if (retrieval_type_len != 0 && retrieval_type_len != 1) + { + return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; + } + + if (retrieval_index_len) + { + char retrieval_index_cstr[256]; + + if (retrieval_index_len < sizeof(retrieval_index_cstr) -1) + { + memcpy(retrieval_index_cstr, retrieval_index, retrieval_index_len); + retrieval_index_cstr[retrieval_index_len] = '\0'; + + if (zebraExplain_lookup_attr_str(zh->reg->zei, + zinfo_index_category_index, + (retrieval_type_len == 0 ? -1 : + retrieval_type[0]), + retrieval_index_cstr) == -1) + { + return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; + } + } + } + + keys = zebra_rec_keys_open(); + zebra_rec_keys_set_buf(keys, rec->info[recInfo_delKeys], + rec->size[recInfo_delKeys], 0); + + wrbuf = wrbuf_alloc(); if (zebra_rec_keys_rewind(keys)){ size_t slen; const char *str; @@ -157,7 +183,7 @@ int zebra_special_index_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, "\n", + " set=\"zebra::index::%s/\">\n", sysno, elemsetname); } else if (input_format == VAL_SUTRS) @@ -218,7 +244,6 @@ int zebra_special_index_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, if (input_format == VAL_TEXT_XML) wrbuf_printf(wrbuf, "\n"); } - *rec_lenp = wrbuf_len(wrbuf); *rec_bufp = odr_malloc(odr, *rec_lenp); memcpy(*rec_bufp, wrbuf_buf(wrbuf), *rec_lenp); @@ -228,22 +253,25 @@ int zebra_special_index_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, } -int zebra_special_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, +int zebra_special_fetch(ZebraHandle zh, zint sysno, ODR odr, const char *elemsetname, oid_value input_format, oid_value *output_format, char **rec_bufp, int *rec_lenp) { Record rec; + + /* set output variables before processing possible error states */ + /* *rec_lenp = 0; */ /* only accept XML and SUTRS requests */ if (input_format != VAL_TEXT_XML && input_format != VAL_SUTRS){ yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s", elemsetname); - return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; + return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST; } - + /* processing zebra::meta::sysno elemset without fetching binary data */ if (elemsetname && 0 == strcmp(elemsetname, "meta::sysno")) { @@ -254,10 +282,10 @@ int zebra_special_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, } else if (input_format == VAL_TEXT_XML){ sprintf(rec_str, "\n", - sysno, elemsetname); + " set=\"zebra::%s\"/>\n", + sysno, elemsetname); *output_format = VAL_TEXT_XML; } *rec_lenp = strlen(rec_str); @@ -272,7 +300,7 @@ int zebra_special_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, /* fetching binary record up for all other display elementsets */ rec = rec_get(zh->reg->records, sysno); if (!rec){ - yaz_log(YLOG_DEBUG, "rec_get fail on sysno=" ZINT_FORMAT, sysno); + yaz_log(YLOG_WARN, "rec_get fail on sysno=" ZINT_FORMAT, sysno); return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; } @@ -293,7 +321,7 @@ int zebra_special_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, struct ZebraRecStream stream; RecordAttr *recordAttr = rec_init_attr(zh->reg->zei, rec); zebra_create_record_stream(zh, &rec, &stream); - *output_format = VAL_SUTRS; + *output_format = input_format; *rec_lenp = recordAttr->recordSize; *rec_bufp = (char *) odr_malloc(odr, *rec_lenp); stream.readf(&stream, *rec_bufp, *rec_lenp); @@ -304,11 +332,11 @@ int zebra_special_fetch(ZebraHandle zh, SYSNO sysno, ODR odr, if (rec) rec_free(&rec); - return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; + return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; } -int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, +int zebra_record_fetch(ZebraHandle zh, zint sysno, int score, zebra_snippets *hit_snippet, ODR odr, oid_value input_format, Z_RecordComposition *comp, oid_value *output_format, @@ -327,20 +355,8 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, *addinfo = 0; elemsetname = yaz_get_esn(comp); - /* - yaz_log(YLOG_LOG, "ELEMENTSET: '%s'", elemsetname); - if (comp && comp->which) - { - yaz_log(YLOG_LOG, "%i %i", comp, comp->which); - } - If SRU, comp->which ==2 , and yaz_get_esn(comp) does not work correctly - IF Z3055, comp->which ==1 , and everything is fine - except reord - encodning - */ - /* processing zebra special elementset names of form 'zebra:: */ - /* SUGGESTION: do not check elemset nema here, buuuut ... */ - if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7)) + if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7)) return zebra_special_fetch(zh, sysno, odr, elemsetname + 7, input_format, output_format, @@ -351,7 +367,7 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, rec = rec_get(zh->reg->records, sysno); if (!rec) { - yaz_log(YLOG_DEBUG, "rec_get fail on sysno=" ZINT_FORMAT, sysno); + yaz_log(YLOG_WARN, "rec_get fail on sysno=" ZINT_FORMAT, sysno); *basenamep = 0; return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; } @@ -365,9 +381,8 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, *basenamep = (char *) odr_malloc (odr, strlen(basename)+1); strcpy (*basenamep, basename); - - yaz_log (YLOG_DEBUG, "retrieve localno=" ZINT_FORMAT " score=%d", - sysno, score); + yaz_log(YLOG_DEBUG, "retrieve localno=" ZINT_FORMAT " score=%d", + sysno, score); zebra_create_record_stream(zh, &rec, &stream); @@ -420,10 +435,6 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, zebra_snippets_log(snippet, YLOG_LOG); #endif - /* SUGGESTION: do not check elemset name here, buuuut ... - add another recType Struct with zebra internal stuff here, - which overrides the Alvis/GRS-1/Safari filters .... - */ if (!(rt = recType_byName(zh->reg->recTypes, zh->res, file_type, &clientData))) { @@ -431,14 +442,6 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, } else { - /* SUGGESTION: do not check elemset name here, buuuut ... - add another recType Struct with zebra internal stuff here, - which overrides the Alvis/GRS-1/Safari filters .... - (*rt->retrieve) method to make the correct encoded, etc, retrieval, - where all needed info already is found in the &retrieveCtr - parameter. This way, we do not need to re-code/dublicate a lot of - logic. - */ (*rt->retrieve)(clientData, &retrieveCtrl); return_code = retrieveCtrl.diagnostic; @@ -447,10 +450,6 @@ int zebra_record_fetch(ZebraHandle zh, SYSNO sysno, int score, *rec_lenp = retrieveCtrl.rec_len; *addinfo = retrieveCtrl.addinfo; } - /* another SUGGESTION: throw out all this snippet stuff in this - file, and do it correctly - either inside filters, or in another - new (*rt->retrieve)(clientData, &retrieveCtrl); type 'snippet' - */ zebra_snippets_destroy(snippet); zebra_snippets_destroy(retrieveCtrl.doc_snippet);