+ xfree(positions);
+ return ret;
+}
+
+int tl_sort(ZebraHandle zh, const char *query, zint hits, zint *exp)
+{
+ ZebraMetaRecord *recs;
+ zint i;
+ int errs = 0;
+ zint min_val_recs = 0;
+ zint min_val_exp = 0;
+
+ assert(query);
+ if (!tl_query(zh, query, hits))
+ return 0;
+
+ recs = zebra_meta_records_create_range (zh, "rsetname", 1, 4);
+ if (!recs)
+ return 0;
+
+ /* find min for each sequence to get proper base offset */
+ for (i = 0; i<hits; i++)
+ {
+ if (min_val_recs == 0 || recs[i].sysno < min_val_recs)
+ min_val_recs = recs[i].sysno;
+ if (min_val_exp == 0 || exp[i] < min_val_exp)
+ min_val_exp = exp[i];
+ }
+
+ /* compare sequences using base offset */
+ for (i = 0; i<hits; i++)
+ if ((recs[i].sysno-min_val_recs) != (exp[i]-min_val_exp))
+ errs++;
+ if (errs)
+ {
+ printf("Sequence not in right order for query\n%s\ngot exp\n",
+ query);
+ for (i = 0; i<hits; i++)
+ printf(" " ZINT_FORMAT " " ZINT_FORMAT "\n",
+ recs[i].sysno, exp[i]);
+ }
+ zebra_meta_records_destroy (zh, recs, 4);
+
+ if (errs)
+ return 0;
+ return 1;
+}
+
+
+struct finfo {
+ const char *name;
+ int occurred;
+};
+
+static void filter_cb(void *cd, const char *name)
+{
+ struct finfo *f = (struct finfo*) cd;
+ if (!strcmp(f->name, name))
+ f->occurred = 1;
+}
+
+void tl_check_filter(ZebraService zs, const char *name)
+{
+ struct finfo f;
+
+ f.name = name;
+ f.occurred = 0;
+ zebra_filter_info(zs, &f, filter_cb);
+ if (!f.occurred)
+ {
+ yaz_log(YLOG_WARN, "Filter %s does not exist.", name);
+ exit(0);
+ }
+}
+
+ZEBRA_RES tl_fetch(ZebraHandle zh, int position, const char *element_set,
+ const Odr_oid * format, ODR odr,
+ const char **rec_buf, size_t *rec_len)
+{
+ ZebraRetrievalRecord retrievalRecord[1];
+ Z_RecordComposition *comp;
+ ZEBRA_RES res;
+
+ retrievalRecord[0].position = position;
+
+ yaz_set_esn(&comp, element_set, odr->mem);
+
+ res = zebra_records_retrieve(zh, odr, "rsetname", comp, format, 1,
+ retrievalRecord);
+ if (res != ZEBRA_OK)
+ {
+ int code = zebra_errCode(zh);
+ yaz_log(YLOG_FATAL, "zebra_records_retrieve returned error %d",
+ code);
+ }
+ else
+ {
+ *rec_buf = retrievalRecord[0].buf;
+ *rec_len = retrievalRecord[0].len;
+ }
+ return res;