-/* $Id: retrieve.c,v 1.49 2006-11-14 14:32:13 marc Exp $
+/* $Id: retrieve.c,v 1.51 2006-11-16 10:49:11 adam Exp $
Copyright (C) 1995-2006
Index Data ApS
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;
/* only accept XML and SUTRS requests */
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;
"<record xmlns="
"\"http://www.indexdata.com/zebra/\""
" sysno=\"" ZINT_FORMAT "\""
- " set=\"zebra::index::%s\">\n",
+ " set=\"zebra::index::%s/\">\n",
sysno, elemsetname);
}
else if (input_format == VAL_SUTRS)
&& 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"))
{
}
else if (input_format == VAL_TEXT_XML){
sprintf(rec_str, "<record xmlns="
- "\"http://www.indexdata.com/zebra/\""
+ "\"http://www.indexdata.com/zebra/\""
" sysno=\"" ZINT_FORMAT "\""
- " set=\"zebra::%s\">\n",
- sysno, elemsetname);
+ " set=\"zebra::%s\"/>\n",
+ sysno, elemsetname);
*output_format = VAL_TEXT_XML;
}
*rec_lenp = strlen(rec_str);
/* 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;
}
if (rec)
rec_free(&rec);
- return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
}
*addinfo = 0;
elemsetname = yaz_get_esn(comp);
- /* processing zebra special elementset names of form 'zebra:: */
- if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7))
+ /* processing zebra special elementset names of form 'zebra:: */
+ /* SUGGESTION: do not check elemset nema here, buuuut ... */
+ if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7))
return zebra_special_fetch(zh, sysno, odr,
elemsetname + 7,
input_format, output_format,
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;
}
*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);
zebra_snippets_log(snippet, YLOG_LOG);
#endif
- if (!(rt = recType_byName (zh->reg->recTypes, zh->res,
- file_type, &clientData)))
+ /* 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)))
{
return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
}
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;
*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);
}