+
+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,
+ char **rec_bufp, int *rec_lenp, char **basenamep,
+ char **addinfo)
+{
+ Record rec;
+ char *fname, *file_type, *basename;
+ const char *elemsetname;
+ struct ZebraRecStream stream;
+ RecordAttr *recordAttr;
+ void *clientData;
+ int return_code = 0;
+
+ *basenamep = 0;
+ *addinfo = 0;
+ elemsetname = yaz_get_esn(comp);
+
+ /* processing zebra special elementset names of form 'zebra:: */
+ if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7))
+ return zebra_special_fetch(zh, sysno, score, odr,
+ elemsetname + 7,
+ input_format, output_format,
+ rec_bufp, rec_lenp);
+
+
+ /* processing all other element set names */
+ rec = rec_get(zh->reg->records, sysno);
+ if (!rec)
+ {
+ yaz_log(YLOG_WARN, "rec_get fail on sysno=" ZINT_FORMAT, sysno);
+ *basenamep = 0;
+ return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ }
+
+
+ recordAttr = rec_init_attr(zh->reg->zei, rec);
+
+ file_type = rec->info[recInfo_fileType];
+ fname = rec->info[recInfo_filename];
+ basename = rec->info[recInfo_databaseName];
+ *basenamep = (char *) odr_malloc (odr, strlen(basename)+1);
+ strcpy (*basenamep, basename);
+
+ yaz_log(YLOG_DEBUG, "retrieve localno=" ZINT_FORMAT " score=%d",
+ sysno, score);
+
+ return_code = zebra_create_record_stream(zh, &rec, &stream);
+
+ if (rec)
+ {
+ zebra_snippets *snippet;
+ zebra_rec_keys_t reckeys = zebra_rec_keys_open();
+ RecType rt;
+ struct recRetrieveCtrl retrieveCtrl;
+
+ retrieveCtrl.stream = &stream;
+ retrieveCtrl.fname = fname;
+ retrieveCtrl.localno = sysno;
+ retrieveCtrl.staticrank = recordAttr->staticrank;
+ retrieveCtrl.score = score;
+ retrieveCtrl.recordSize = recordAttr->recordSize;
+ retrieveCtrl.odr = odr;
+ retrieveCtrl.input_format = retrieveCtrl.output_format = input_format;
+ retrieveCtrl.comp = comp;
+ retrieveCtrl.encoding = zh->record_encoding;
+ retrieveCtrl.diagnostic = 0;
+ retrieveCtrl.addinfo = 0;
+ retrieveCtrl.dh = zh->reg->dh;
+ retrieveCtrl.res = zh->res;
+ retrieveCtrl.rec_buf = 0;
+ retrieveCtrl.rec_len = -1;
+ retrieveCtrl.hit_snippet = hit_snippet;
+ retrieveCtrl.doc_snippet = zebra_snippets_create();
+
+ zebra_rec_keys_set_buf(reckeys,
+ rec->info[recInfo_delKeys],
+ rec->size[recInfo_delKeys],
+ 0);
+ zebra_rec_keys_to_snippets(zh, reckeys, retrieveCtrl.doc_snippet);
+ zebra_rec_keys_close(reckeys);
+
+#if 0
+ /* for debugging purposes */
+ yaz_log(YLOG_LOG, "DOC SNIPPET:");
+ zebra_snippets_log(retrieveCtrl.doc_snippet, YLOG_LOG);
+ yaz_log(YLOG_LOG, "HIT SNIPPET:");
+ zebra_snippets_log(retrieveCtrl.hit_snippet, YLOG_LOG);
+#endif
+ snippet = zebra_snippets_window(retrieveCtrl.doc_snippet,
+ retrieveCtrl.hit_snippet,
+ 10);
+#if 0
+ /* for debugging purposes */
+ yaz_log(YLOG_LOG, "WINDOW SNIPPET:");
+ zebra_snippets_log(snippet, YLOG_LOG);
+#endif
+
+ if (!(rt = recType_byName(zh->reg->recTypes, zh->res,
+ file_type, &clientData)))
+ {
+ char addinfo_str[100];
+
+ sprintf(addinfo_str, "Could not handle record type %.40s",
+ file_type);
+
+ *addinfo = odr_strdup(odr, addinfo_str);
+ return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ }
+ else