36 #include <yaz/diagbib1.h>
37 #include <yaz/snprintf.h>
39 #include <yaz/oid_db.h>
42 #define MAX_SYSNOS_PER_RECORD 40
44 #define ZEBRA_XML_HEADER_STR "<record xmlns=\"http://www.indexdata.com/zebra/\""
74 strcat(full_rep,
"/");
80 if ((
fd = open(full_rep,
O_BINARY|O_RDONLY)) == -1){
81 yaz_log(YLOG_WARN|YLOG_ERRNO,
"Retrieve fail; missing file: %s",
84 return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
105 const char *cp = elem;
108 if (cp[0] ==
':' && cp[1] ==
':')
116 struct index_spec *spec = nmem_malloc(nmem,
sizeof(*spec));
128 while (*cp !=
':' && *cp !=
'\0' && *cp !=
',')
130 spec->
index_name = nmem_strdupn(nmem, cp0, cp - cp0);
136 while (*cp !=
'\0' && *cp !=
',' && *cp !=
':')
138 spec->
index_type = nmem_strdupn(nmem, cp0, cp - cp0);
145 while (*cp !=
'\0' && *cp !=
',' && *cp !=
':')
147 spec->
extra = nmem_strdupn(nmem, cp0, cp - cp0);
160 const Odr_oid *input_format,
161 const Odr_oid **output_format,
162 WRBUF result, WRBUF addinfo)
171 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
184 WRBUF wrbuf_str = wrbuf_alloc();
187 const char *string_index = 0;
188 WRBUF wrbuf_result = result;
193 if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
195 *output_format = yaz_oid_recsyn_xml;
198 " set=\"zebra::index%s\">\n",
199 fi->
sysno, elemsetname);
201 else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
203 *output_format = yaz_oid_recsyn_sutrs;
207 yaz_log(YLOG_WARN,
"unsupported format for element set zebra::%s",
210 wrbuf_destroy(wrbuf_str);
211 return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
217 while (off != wrbuf_len(wrbuf_str))
220 assert(off < wrbuf_len(wrbuf_str));
222 wrbuf_buf(wrbuf_str)+off);
224 if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
226 wrbuf_printf(wrbuf_result,
" <index name=\"%s\"",
228 wrbuf_printf(wrbuf_result,
" type=\"%s\">",
index_type);
229 wrbuf_xmlputs(wrbuf_result, dst_buf);
230 wrbuf_printf(wrbuf_result,
"</index>\n");
232 else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
234 wrbuf_printf(wrbuf_result,
"%s %s %s\n", string_index,
index_type,
237 off += strlen(wrbuf_buf(wrbuf_str)+off) + 1;
239 if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
241 wrbuf_printf(wrbuf_result,
"</record>\n");
243 wrbuf_destroy(wrbuf_str);
251 const char *elemsetname,
int use_xml)
256 "\" set=\"zebra::index%s\">\n",
262 const char *string_index = 0;
271 for (spec = spec_list; spec; spec = spec->
next)
276 !yaz_matchstr(spec->
index_name, string_index))
284 wrbuf_printf(wrbuf,
" <index name=\"%s\"", string_index);
285 wrbuf_printf(wrbuf,
" type=\"%s\"",
index_type);
288 wrbuf_xmlputs(wrbuf, doc_w->
term);
289 wrbuf_printf(wrbuf,
"</index>\n");
293 wrbuf_printf(wrbuf,
"%s %s %s\n", string_index,
299 wrbuf_printf(wrbuf,
"</record>\n");
305 const Odr_oid *input_format,
306 const Odr_oid **output_format,
307 WRBUF result, WRBUF addinfo,
318 if (oid_oidcmp(input_format, yaz_oid_recsyn_xml)
319 && oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
321 yaz_log(YLOG_WARN,
"unsupported format for element set zebra::%s",
324 return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
330 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
333 for (spec = spec_list; spec; spec = spec->
next)
339 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
343 if (return_code == 0)
346 elemsetname, !oid_oidcmp(input_format, yaz_oid_recsyn_xml));
347 *output_format = input_format;
359 wrbuf_printf(wrbuf,
" %s=\"", name);
360 wrbuf_xmlputs(wrbuf, value);
361 wrbuf_printf(wrbuf,
"\"");
368 wrbuf_printf(wrbuf,
" %s=\"%i\"", name, value);
375 wrbuf_printf(wrbuf,
"%s %s\n", name, value);
381 wrbuf_printf(wrbuf,
"%s %i\n", name, value);
388 const char *w_index_type)
401 const char *string_index = 0;
409 wrbuf_printf(wrbuf,
" fields=\"%s", string_index);
411 wrbuf_printf(wrbuf,
" %s", string_index);
417 wrbuf_printf(wrbuf,
"\"");
432 const char *string_index = 0;
439 wrbuf_printf(wrbuf,
" <snippet name=\"%s\"", string_index);
440 wrbuf_printf(wrbuf,
" type=\"%s\"",
index_type);
442 wrbuf_printf(wrbuf,
">");
445 wrbuf_puts(wrbuf,
"<s>");
447 if (mark_state || !doc_w->
ws || doc_w->
match)
448 wrbuf_xmlputs(wrbuf, doc_w->
term);
450 wrbuf_puts(wrbuf,
"</s>");
452 else if (mark_state == 1)
454 wrbuf_puts(wrbuf,
"</snippet>\n");
456 mark_state = doc_w->
mark;
460 wrbuf_puts(wrbuf,
"</snippet>\n");
462 wrbuf_printf(wrbuf,
"</record>");
479 yaz_log(YLOG_WARN,
"rec_get fail on sysno=" ZINT_FORMAT, sysno);
480 return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
485 void *recTypeClientData;
487 file_type, &recTypeClientData);
490 return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
495 if (return_code == 0)
498 rt, recTypeClientData);
510 const Odr_oid *input_format,
511 const Odr_oid **output_format,
512 WRBUF result, WRBUF addinfo)
520 WRBUF wrbuf = result;
546 *output_format = yaz_oid_recsyn_xml;
570 NMEM nmem = nmem_create();
572 strcpy(ord_buf + ord_len, term);
579 memcpy(&isam_p, info+1,
sizeof(
ISAM_P));
601 if (termid == termid_key)
603 *first_sysno = key.
mem[0];
604 *first_seq = key.
mem[key.
len - 1];
627 const char *lterm = l->
term ? l->
term :
"";
628 const char *rterm = r->
term ? r->
term :
"";
629 return strcmp(lterm, rterm);
635 int ord,
RSET rset,
double scale_factor)
638 for (i = 0; i < no_terms_collect; i++)
642 if (scale_factor < 0.0)
656 int no_terms_collect,
664 sizeof *col *no_terms_collect);
666 for (i = 0; i < no_terms_collect; i++)
679 int oc = *(
int*) data_buf;
684 while (j < no_terms_collect && oc > col[j].
oc)
689 memmove(col, col+1,
sizeof(*col) * j);
703 WRBUF w = wrbuf_alloc();
706 for (ord_i = 0; ord_i < no_ord; ord_i++)
708 for (rec_i = 0; rec_i < num_recs; rec_i++)
710 if (!poset[rec_i].sysno)
721 while (off != wrbuf_len(w))
723 const char *str = wrbuf_buf(w) + off;
732 off += strlen(str)+1;
744 int no_ord,
int *ord_array,
753 for (rec_i = 0; rec_i < num_recs; rec_i++)
758 if (!poset[rec_i].sysno)
763 assert(no_sysnos > 0);
764 yaz_log(YLOG_DEBUG,
"Analyzing rec=%d ISAM sysno=" ZINT_FORMAT " chunks=%d",
765 rec_i, poset[rec_i].sysno, no_sysnos);
766 for (j = 0; j < no_sysnos && j < max_chunks; j++)
784 for (spec = spec_list, ord_i = 0; ord_i < no_ord;
785 ord_i++, spec = spec->
next)
788 if (ord == ord_array[ord_i] &&
818 int no_ord,
int *ord_array,
826 yaz_timing_t timing = yaz_timing_create();
828 = nmem_malloc(fi->
nmem,
sizeof *map_array * no_ord);
829 for (i = 0; i < no_ord; i++)
837 num_recs, poset, spec_list);
838 yaz_timing_stop(timing);
839 yaz_log(YLOG_LOG,
"facet first phase real=%4.2f cat=%s",
840 yaz_timing_get_real(timing),
842 yaz_timing_start(timing);
843 for (spec = spec_list, i = 0; i < no_ord; i++, spec = spec->
next)
846 NMEM nmem = nmem_create();
848 int no_collect_terms = 20;
851 no_collect_terms = atoi(spec->
extra);
852 if (no_collect_terms < 1)
853 no_collect_terms = 1;
860 wrbuf_printf(wr,
" <facet type=\"%s\" index=\"%s\">\n",
863 wrbuf_printf(wr,
"facet %s %s\n",
865 for (j = 0; j < no_collect_terms; j++)
869 WRBUF w_buf = wrbuf_alloc();
888 for (; sn; sn = sn->
next)
890 if (sn->
ord == ord_array[i] &&
893 if (!sn->
ws || !first)
896 wrbuf_puts(w_buf, sn->
term);
904 if (wrbuf_len(w_buf))
911 wrbuf_printf(wr,
" <term coccur=\"%d\"", col[j].
oc);
915 wrbuf_printf(wr,
">");
916 wrbuf_xmlputs(wr, dst_buf);
917 wrbuf_printf(wr,
"</term>\n");
921 wrbuf_printf(wr,
"term %d", col[j].
oc);
925 wrbuf_printf(wr,
": %s\n", dst_buf);
927 wrbuf_destroy(w_buf);
931 wrbuf_puts(wr,
" </facet>\n");
934 for (i = 0; i < no_ord; i++)
936 yaz_timing_stop(timing);
937 yaz_log(YLOG_LOG,
"facet second phase real=%4.2f",
938 yaz_timing_get_real(timing));
939 yaz_timing_destroy(&timing);
945 const Odr_oid *input_format,
946 const Odr_oid **output_format,
947 WRBUF result, WRBUF addinfo)
964 if (oid_oidcmp(input_format, yaz_oid_recsyn_xml) == 0)
969 if (!spec_list ||
error)
971 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
974 for (spec = spec_list; spec; spec = spec->
next)
977 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
983 ord_array = nmem_malloc(fi->
nmem,
sizeof(*ord_array) * no_ord);
985 for (spec = spec_list, i = 0; spec; spec = spec->
next, i++)
999 for (spec = spec_list, i = 0; spec; spec = spec->
next, i++)
1012 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
1016 pos_array = (
zint *) nmem_malloc(fi->
nmem, num_recs *
sizeof(*pos_array));
1017 for (i = 0; i < num_recs; i++)
1022 wrbuf_puts(addinfo, fi->
setname);
1023 return YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST;
1032 spec_list, no_ord, ord_array, use_xml,
1035 wrbuf_puts(result,
"</record>\n");
1037 *output_format = yaz_oid_recsyn_xml;
1044 void *handle,
const char *elemsetname,
1045 const Odr_oid *input_format,
1046 const Odr_oid **output_format,
1047 WRBUF result, WRBUF addinfo)
1055 if (elemsetname && 0 == strncmp(elemsetname,
"facet", 5))
1058 input_format, output_format,
1062 if (elemsetname && 0 == strcmp(elemsetname,
"snippet"))
1065 input_format, output_format,
1070 if (elemsetname && 0 == strcmp(elemsetname,
"meta::sysno"))
1073 if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
1076 *output_format = input_format;
1078 else if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
1083 *output_format = input_format;
1086 ret = YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
1091 if (elemsetname && 0 == strncmp(elemsetname,
"index", 5))
1094 fi, elemsetname + 5,
1095 input_format, output_format,
1108 return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1112 if (elemsetname && 0 == strcmp(elemsetname,
"data"))
1119 *output_format = input_format;
1121 b = nmem_malloc(fi->
nmem, recordAttr->recordSize);
1122 stream.
readf(&stream, b, recordAttr->recordSize);
1123 wrbuf_write(result, b, recordAttr->recordSize);
1131 if (elemsetname && 0 == strcmp(elemsetname,
"meta"))
1136 if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml))
1138 *output_format = input_format;
1148 wrbuf_printf(result,
1151 " set=\"zebra::%s\"/>\n",
1156 else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs))
1158 *output_format = input_format;
1159 wrbuf_printf(result,
"sysno " ZINT_FORMAT "\n", sysno);
1166 wrbuf_printf(result,
1175 ret = YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST;
1182 if (elemsetname && 0 == strncmp(elemsetname,
"index", 5))
1185 fi, elemsetname + 5,
1186 input_format, output_format,
1187 result, addinfo, rec);
1194 return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
1198 zint sysno,
int score,
1200 const Odr_oid *input_format, Z_RecordComposition *comp,
1201 const Odr_oid **output_format,
1202 char **rec_bufp,
int *rec_lenp,
char **basenamep,
1206 char *fname, *file_type, *basename;
1207 const char *elemsetname;
1211 int return_code = 0;
1228 elemsetname = yaz_get_esn(comp);
1234 fetch_info.
nmem = odr->mem;
1237 if (elemsetname && 0 == strncmp(elemsetname,
"zebra::", 7))
1239 WRBUF result = wrbuf_alloc();
1241 input_format, output_format,
1245 *rec_bufp = odr_strdup(odr, wrbuf_cstr(result));
1246 *rec_lenp = wrbuf_len(result);
1248 wrbuf_destroy(result);
1258 return YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1267 *basenamep = (
char *) odr_malloc(odr, strlen(basename)+1);
1268 strcpy(*basenamep, basename);
1270 yaz_log(YLOG_DEBUG,
"retrieve localno=" ZINT_FORMAT " score=%d",
1283 retrieveCtrl.
staticrank = recordAttr->staticrank;
1285 retrieveCtrl.
recordSize = recordAttr->recordSize;
1292 retrieveCtrl.
dh = zh->
reg->
dh;
1293 retrieveCtrl.
res = zh->
res;
1296 retrieveCtrl.
handle = &fetch_info;
1300 file_type, &clientData)))
1302 wrbuf_printf(addinfo_w,
"Could not handle record type %.40s",
1304 return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1308 (*rt->
retrieve)(clientData, &retrieveCtrl);
1312 *rec_bufp = (
char *) retrieveCtrl.
rec_buf;
1313 *rec_lenp = retrieveCtrl.
rec_len;
1315 wrbuf_puts(addinfo_w, retrieveCtrl.
addinfo);
void error(const char *format,...)
ZebraMetaRecord * zebra_meta_records_create(ZebraHandle zh, const char *name, int num, zint *positions)
void zebra_meta_records_destroy(ZebraHandle zh, ZebraMetaRecord *records, int num)
char * dict_lookup(Dict dict, const char *p)
lookup item in dictionary
void zebra_term_untrans_iconv2(ZebraHandle zh, NMEM stream, char **dst, const char *src)
ZEBRA_RES zebra_result_recid_to_sysno(ZebraHandle zh, const char *setname, zint recid, zint *sysnos, int *no_sysnos)
RSET resultSetRef(ZebraHandle zh, const char *resultSetId)
int zebra_term_untrans(ZebraHandle zh, const char *index_type, char *dst, const char *src)
void zebra_create_stream_fd(struct ZebraRecStream *stream, int fd, off_t start_offset)
void zebra_count_set(ZebraHandle zh, RSET rset, zint *count, zint approx_limit)
void zebra_create_stream_mem(struct ZebraRecStream *stream, const char *buf, size_t sz)
#define FIRST_IN_FIELD_CHAR
RSET zebra_create_rset_isam(ZebraHandle zh, NMEM rset_nmem, struct rset_key_control *kctl, int scope, ISAM_P pos, TERMID termid)
int zebra_term_untrans_iconv(ZebraHandle zh, NMEM stream, const char *index_type, char **dst, const char *src)
struct rset_key_control * zebra_key_control_create(ZebraHandle zh)
ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, zint sysno, zebra_snippets *snippets)
int key_SU_encode(int ch, char *out)
RecType recType_byName(RecTypes rts, Res res, const char *name, void **clientDataP)
Record rec_get(Records p, zint sysno)
gets record - with given system number
void rec_free(Record *recpp)
frees record (from memory)
int zebra_rec_keys_empty(zebra_rec_keys_t keys)
int zebra_rec_keys_read(zebra_rec_keys_t keys, const char **str, size_t *slen, struct it_key *key)
int zebra_rec_keys_rewind(zebra_rec_keys_t keys)
zebra_rec_keys_t zebra_rec_keys_open(void)
void zebra_rec_keys_set_buf(zebra_rec_keys_t p, char *buf, size_t sz, int copy_buf)
void zebra_rec_keys_close(zebra_rec_keys_t p)
ZEBRA_RES res_get_int(Res r, const char *name, int *val)
#define ZEBRA_XML_HEADER_STR
static void snippet_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc)
static void retrieve_puts_str(WRBUF wrbuf, const char *name, const char *value)
static int perform_facet_sort(ZebraHandle zh, int no_ord, int *ord_array, zebra_strmap_t *map_array, int num_recs, ZebraMetaRecord *poset)
static struct term_collect * term_collect_create(zebra_strmap_t sm, int no_terms_collect, NMEM nmem)
static int special_index_fetch(struct special_fetch_s *fi, const char *elemsetname, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo, Record rec)
static void term_collect_freq(ZebraHandle zh, struct term_collect *col, int no_terms_collect, int ord, RSET rset, double scale_factor)
static int perform_facet(ZebraHandle zh, struct special_fetch_s *fi, WRBUF result, int num_recs, ZebraMetaRecord *poset, struct index_spec *spec_list, int no_ord, int *ord_array, int use_xml, zinfo_index_category_t cat)
static int perform_facet_index(ZebraHandle zh, struct special_fetch_s *fi, int no_ord, int *ord_array, zebra_strmap_t *map_array, int num_recs, ZebraMetaRecord *poset, struct index_spec *spec_list)
int zebra_record_fetch(ZebraHandle zh, const char *setname, zint sysno, int score, ODR odr, const Odr_oid *input_format, Z_RecordComposition *comp, const Odr_oid **output_format, char **rec_bufp, int *rec_lenp, char **basenamep, WRBUF addinfo_w)
static int zebra_create_record_stream(ZebraHandle zh, Record *rec, struct ZebraRecStream *stream)
static int facet_fetch(struct special_fetch_s *fi, const char *elemsetname, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo)
static int term_qsort_handle(const void *a, const void *b)
static void special_index_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc, zint sysno, struct index_spec *spec_list, const char *elemsetname, int use_xml)
static int zebra_special_fetch(void *handle, const char *elemsetname, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo)
static void retrieve_puts_attr_int(WRBUF wrbuf, const char *name, const int value)
static int snippet_fetch(struct special_fetch_s *fi, const char *elemsetname, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo)
static void snippet_check_fields(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc, const zebra_snippet_word *doc_w, const char *w_index_type)
#define MAX_SYSNOS_PER_RECORD
struct index_spec * parse_index_spec(const char *elem, NMEM nmem, int *error)
static void retrieve_puts_int(WRBUF wrbuf, const char *name, const int value)
int zebra_get_rec_snippets(ZebraHandle zh, zint sysno, zebra_snippets *snippets)
static void retrieve_puts_attr(WRBUF wrbuf, const char *name, const char *value)
static int sort_fetch(struct special_fetch_s *fi, const char *elemsetname, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo)
static zint freq_term(ZebraHandle zh, int ord, const char *term, RSET rset_set, zint *first_sysno, zint *first_seq)
void rset_delete(RSET rs)
Destructor RSETs.
RSET rset_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET *rsets)
#define rset_read(rfd, buf, term)
RSET rset_dup(RSET rs)
Duplicate an RSET.
TERMID rset_term_create(const char *name, int length, const char *flags, int type, NMEM nmem, struct ord_list *ol, int reg_type, zint hits_limit, const char *ref_id)
Creates a TERMID entry.
#define rset_open(rs, wflag)
void rset_close(RSFD rfd)
Closes a result set RFD handle.
void zebra_snippets_log(const zebra_snippets *l, int log_level, int all)
void zebra_snippets_destroy(zebra_snippets *l)
const zebra_snippet_word * zebra_snippets_constlist(const zebra_snippets *l)
void zebra_snippets_ring(zebra_snippets *doc, const zebra_snippets *hit, int before, int after)
zebra_snippets * zebra_snippets_create(void)
int zebra_sort_read(zebra_sort_index_t si, zint *section_id, WRBUF w)
reads sort entry
int zebra_sort_type(zebra_sort_index_t si, int type)
sets type for sort usage
void zebra_sort_sysno(zebra_sort_index_t si, zint sysno)
sets sort system number for read / add / delete
void(* destroy)(struct ZebraRecStream *s)
close and destroy stream
int(* readf)(struct ZebraRecStream *s, char *buf, size_t count)
read function
zint mem[IT_KEY_LEVEL_MAX]
const Odr_oid * input_format
int(* special_fetch)(void *handle, const char *esn, const Odr_oid *input_format, const Odr_oid **output_format, WRBUF result, WRBUF addinfo)
Z_RecordComposition * comp
struct ZebraRecStream * stream
const Odr_oid * output_format
int(* retrieve)(void *clientData, struct recRetrieveCtrl *ctrl)
void(* dec)(struct rset_key_control *kc)
zebra_sort_index_t sort_index
struct zebra_register * reg
struct zebra_snippet_word * next
#define CAST_ZINT_TO_INT(x)
short ZEBRA_RES
Common return type for Zebra API.
void zebra_strmap_destroy(zebra_strmap_t st)
void * zebra_strmap_lookup(zebra_strmap_t st, const char *name, int no, size_t *data_len)
const char * zebra_strmap_it_next(zebra_strmap_it it, void **data_buf, size_t *data_len)
zebra_strmap_t zebra_strmap_create(void)
void zebra_strmap_it_destroy(zebra_strmap_it it)
void zebra_strmap_add(zebra_strmap_t st, const char *name, void *data_buf, size_t data_len)
zebra_strmap_it zebra_strmap_it_create(zebra_strmap_t st)
RecordAttr * rec_init_attr(ZebraExplainInfo zei, Record rec)
int zebraExplain_lookup_attr_str(ZebraExplainInfo zei, zinfo_index_category_t cat, const char *index_type, const char *str)
lookup ordinal from string index + index type
int zebraExplain_lookup_ord(ZebraExplainInfo zei, int ord, const char **index_type, const char **db, const char **string_index)
@ zinfo_index_category_index
@ zinfo_index_category_sort