23 #include <sys/types.h>
28 #include <yaz/snprintf.h>
212 yaz_log(YLOG_LOG,
"zebraExplain_close");
217 nmem_destroy(zei->
nmem);
240 oid = odr_getoidbystr_nmem(zei->
nmem, str);
242 for (ao = *op; ao; ao = ao->
next)
243 if (!oid_oidcmp(oid, ao->
oid))
270 (*accessInfo)->schemas = 0;
278 &(*accessInfo)->attributeSetIds);
281 &(*accessInfo)->schemas);
343 NMEM nmem = nmem_create();
346 yaz_log(YLOG_LOG,
"zebraExplain_open wr=%d", writeFlag);
370 if ( atoi(
res_get_def(res,
"notimestamps",
"0") )== 0)
373 tm = localtime(&our_time);
374 yaz_snprintf(zei->
date,
sizeof(zei->
date),
375 "%04d%02d%02d%02d%02d%02d",
376 tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
377 tm->tm_hour, tm->tm_min, tm->tm_sec);
379 yaz_snprintf(zei->
date,
sizeof(zei->
date),
380 "%04d%02d%02d%02d%02d%02d",
392 data1_node *node_tgtinfo, *node_zebra, *node_list, *np;
397 yaz_log(YLOG_FATAL,
"Explain schema missing. Check profilePath");
398 nmem_destroy(zei->
nmem);
408 yaz_log(YLOG_FATAL,
"Node node_tgtinfo missing");
409 nmem_destroy(zei->
nmem);
419 yaz_log(YLOG_FATAL,
"Node node_zebra missing");
420 nmem_destroy(zei->
nmem);
429 np = node_list->
child;
431 for(; np; np = np->
next)
439 for(np2 = np->
child; np2; np2 = np2->
next)
443 if (!strcmp(np2->
u.
tag.tag,
"name"))
444 node_name = np2->
child;
445 else if (!strcmp(np2->
u.
tag.tag,
"id"))
446 node_id = np2->
child;
447 else if (!strcmp(np2->
u.
tag.tag,
"attributeDetailsId"))
448 node_aid = np2->
child;
450 assert(node_id && node_name && node_aid);
453 nmem_malloc(zei->
nmem,
sizeof(**zdip));
456 (*zdip)->data1_database = 0;
457 (*zdip)->recordCount = 0;
458 (*zdip)->recordBytes = 0;
461 (*zdip)->databaseName = (
char *)
462 nmem_malloc(zei->
nmem, 1+node_name->
u.
data.len);
463 memcpy((*zdip)->databaseName, node_name->
u.
data.data,
464 node_name->
u.
data.len);
465 (*zdip)->databaseName[node_name->
u.
data.len] =
'\0';
467 node_id->
u.
data.len);
469 nmem_malloc(zei->
nmem,
sizeof(*(*zdip)->attributeDetails));
470 (*zdip)->attributeDetails->sysno =
atoi_zn(node_aid->
u.
data.data,
471 node_aid->
u.
data.len);
472 (*zdip)->attributeDetails->readFlag = 1;
473 (*zdip)->attributeDetails->dirty = 0;
474 (*zdip)->attributeDetails->SUInfo = 0;
476 zdip = &(*zdip)->
next;
514 "<explain><targetInfo>TargetInfo\n"
516 "<namedResultSets>1</>\n"
517 "<multipleDBSearch>1</>\n"
518 "<nicknames><name>Zebra</></>\n"
522 yaz_log(YLOG_FATAL,
"Explain schema missing. Check profilePath");
523 nmem_destroy(zei->
nmem);
528 assert(node_tgtinfo);
537 yaz_log(YLOG_FATAL,
"Cannot create root Explain record");
538 nmem_destroy(zei->
nmem);
565 "<explain><categoryList>CategoryList\n"
585 data1_node *node_adinfo, *node_zebra, *node_list, *np;
593 "/attributeDetails");
598 for (np = node_list->
child; np; np = np->
next)
610 for (np2 = np->
child; np2; np2 = np2->
next)
615 if (!strcmp(np2->
u.
tag.tag,
"str"))
616 node_str = np2->
child;
617 else if (!strcmp(np2->
u.
tag.tag,
"ordinal"))
618 node_ordinal = np2->
child;
619 else if (!strcmp(np2->
u.
tag.tag,
"type"))
620 node_type = np2->
child;
621 else if (!strcmp(np2->
u.
tag.tag,
"cat"))
622 node_cat = np2->
child;
623 else if (!strcmp(np2->
u.
tag.tag,
"dococcurrences"))
624 node_doc_occurrences = np2->
child;
625 else if (!strcmp(np2->
u.
tag.tag,
"termoccurrences"))
626 node_term_occurrences = np2->
child;
629 yaz_log(YLOG_LOG,
"Unknown tag '%s' in attributeDetails",
633 assert(node_ordinal);
636 nmem_malloc(zei->
nmem,
sizeof(**zsuip));
638 if (node_type && node_type->
u.
data.len > 0)
640 nmem_strdupn(zei->
nmem,
641 node_type->
u.
data.data,
642 node_type->
u.
data.len);
645 yaz_log(YLOG_WARN,
"Missing attribute 'type' in attribute info");
646 (*zsuip)->info.index_type =
"w";
648 if (node_cat && node_cat->
u.
data.len > 0)
653 if (!strncmp(np->
u.
data.data,
"index", np->
u.
data.len))
655 else if (!strncmp(np->
u.
data.data,
"sort", np->
u.
data.len))
657 else if (!strncmp(np->
u.
data.data,
"alwaysmatches",
660 else if (!strncmp(np->
u.
data.data,
"anchor",
665 yaz_log(YLOG_WARN,
"Bad index cateogry '%.*s'",
669 (*zsuip)->info.cat = cat;
674 if (node_doc_occurrences)
677 (*zsuip)->info.doc_occurrences =
atoi_zn(np->
u.
data.data,
680 if (node_term_occurrences)
683 (*zsuip)->info.term_occurrences =
atoi_zn(np->
u.
data.data,
688 (*zsuip)->info.str = nmem_strdupn(zei->
nmem,
689 node_str->
u.
data.data,
690 node_str->
u.
data.len);
694 yaz_log(YLOG_WARN,
"Missing set/use/str in attribute info");
697 (*zsuip)->info.ordinal = atoi_n(node_ordinal->
u.
data.data,
698 node_ordinal->
u.
data.len);
699 zsuip = &(*zsuip)->
next;
741 "recordCountActual")) &&
785 zdip = &(*zdip)->
next;
793 const char *database_n = strrchr(database,
'/');
798 database_n = database;
812 yaz_log(YLOG_LOG,
"zebraExplain_curDatabase: %s", database);
817 yaz_log(YLOG_LOG,
"zebraExplain_readDatabase: %s", database);
824 yaz_log(YLOG_LOG,
"zebraExplain_readAttributeDetails: %s", database);
871 for (; p; p = p->
next)
877 for (; p; p = p->
next)
883 int explain_database)
887 const char *database_n = strrchr(database,
'/');
892 database_n = database;
895 yaz_log(YLOG_LOG,
"zebraExplain_newDatabase: %s", database);
924 "<explain><databaseInfo>DatabaseInfo\n"
937 database, zei->
nmem);
939 if (explain_database)
964 "<explain><attributeDetails>AttributeDetails\n"
968 "/attributeDetails");
989 static char *category[] = {
1004 yaz_log(YLOG_LOG,
"zebraExplain_writeCategoryList");
1018 for (i = 0; category[i]; i++)
1024 category[i], zei->
nmem);
1051 data1_node *node_adinfo, *node_list, *node_zebra;
1059 yaz_log(YLOG_LOG,
"zebraExplain_writeAttributeDetails");
1069 "/attributeDetails");
1074 "zebraInfo", node_adinfo);
1081 "attrlist", node_zebra);
1082 for (zsui = zad->
SUInfo; zsui; zsui = zsui->
next)
1103 "index", zei->
nmem);
break;
1106 "sort", zei->
nmem);
break;
1109 "alwaysmatches", zei->
nmem);
break;
1112 "anchor", zei->
nmem);
break;
1135 data1_node *node_dbinfo, *node_count, *node_zebra;
1142 yaz_log(YLOG_LOG,
"zebraExplain_writeDatabase %s", zdi->
databaseName);
1152 assert(node_dbinfo);
1158 "recordCount", node_dbinfo);
1164 "zebraInfo", node_dbinfo);
1201 for (atts = attset->
atts; atts; atts = atts->
next)
1224 data1_node *node_root, *node_attinfo, *node_attributes, *node_atttype;
1232 yaz_log(YLOG_LOG,
"zebraExplain_writeAttributeSet %s",
1233 attset ? attset->
name :
"<unknown>");
1241 "<explain><attributeSetInfo>AttributeSetInfo\n"
1245 "/attributeSetInfo");
1247 assert(node_attinfo);
1253 if (attset && attset->
name)
1258 "attributes", node_attinfo);
1260 "attributeType", node_attributes);
1262 "name",
"Use", zei->
nmem);
1264 "description",
"Use Attribute", zei->
nmem);
1266 "type", 1, zei->
nmem);
1268 "attributeValues", 0 , node_atttype);
1291 data1_node *node_tgtinfo, *node_list, *node_zebra;
1305 assert(node_tgtinfo);
1311 "zebraInfo", node_tgtinfo);
1319 "databaseList", 0 , node_zebra);
1324 "database", 0 , node_list);
1355 const char *index_type,
1362 *zsui; zsui = &(*zsui)->
next)
1363 if ( (index_type == 0
1364 || !strcmp((*zsui)->info.index_type, index_type))
1365 && (*zsui)->info.cat == cat
1366 && !yaz_matchstr((*zsui)->info.str, str))
1371 *zsui = (*zsui)->
next;
1381 int (*f)(
void *handle,
int ord,
1382 const char *index_type,
1383 const char *string_index,
1390 for ( ;zsui; zsui = zsui->
next)
1413 zsui = &(*zsui)->
next)
1414 if ((*zsui)->info.ordinal == ord)
1419 *zsui = (*zsui)->
next;
1436 int term_delta,
int doc_delta)
1449 zint *term_occurrences,
1450 zint *doc_occurrences)
1479 const char **index_type,
1481 const char **string_index)
1494 *string_index = zsui->
info.
str;
1510 for (ao = *op; ao; ao = ao->
next)
1511 if (!oid_oidcmp(oid, ao->
oid))
1518 ao->
oid = odr_oiddup_nmem(zei->
nmem, oid);
1527 const char *index_type)
1532 zsui = (
struct zebSUInfoB *) nmem_malloc(zei->
nmem,
sizeof(*zsui));
1547 const char *index_type,
1548 const char *index_name)
1552 zsui->
info.
str = nmem_strdup(zei->
nmem, index_name);
1560 accessInfo->schemas, oid);
1600 recordAttr = (
RecordAttr *) xmalloc(
sizeof(*recordAttr));
1602 memset(recordAttr,
'\0',
sizeof(*recordAttr));
1617 yaz_log(YLOG_WARN,
"Directive attset failed for %s", name);
data1_node * data1_mk_tag(data1_handle dh, NMEM nmem, const char *tag, const char **attr, data1_node *at)
data1_node * data1_search_tag(data1_handle dh, data1_node *n, const char *tag)
data1_absyn * data1_get_absyn(data1_handle dh, const char *name, enum DATA1_XPATH_INDEXING en)
data1_attset * data1_attset_search_id(data1_handle dh, const Odr_oid *oid)
data1_node * data1_mk_tag_data_text(data1_handle dh, data1_node *at, const char *tag, const char *str, NMEM nmem)
data1_node * data1_read_sgml(data1_handle dh, NMEM m, const char *buf)
char * data1_nodetoidsgml(data1_handle dh, data1_node *n, int select, int *len)
data1_attset * data1_get_attset(data1_handle dh, const char *name)
void data1_pr_tree(data1_handle dh, data1_node *n, FILE *out)
data1_node * data1_mk_tag_data_text_uni(data1_handle dh, data1_node *at, const char *tag, const char *str, NMEM nmem)
data1_node * data1_mk_tag_uni(data1_handle dh, NMEM nmem, const char *tag, data1_node *at)
data1_node * data1_mk_tag_data_zint(data1_handle dh, data1_node *at, const char *tag, zint num, NMEM nmem)
@ DATA1_XPATH_INDEXING_DISABLE
struct data1_handle_info * data1_handle
data1_node * data1_mk_tag_data_oid(data1_handle dh, data1_node *at, const char *tag, Odr_oid *oid, NMEM nmem)
data1_node * data1_mk_tag_data_int(data1_handle dh, data1_node *at, const char *tag, int num, NMEM nmem)
Record rec_new(Records p)
creates new record (to be written to file storage)
Record rec_get(Records p, zint sysno)
gets record - with given system number
ZEBRA_RES rec_put(Records p, Record *recpp)
puts record (writes into file storage)
char * rec_strdup(const char *s, size_t *len)
void rec_free(Record *recpp)
frees record (from memory)
ZEBRA_RES rec_del(Records p, Record *recpp)
marks record for deletion (on file storage)
Record rec_get_root(Records p)
gets root record
const char * res_get_def(Res r, const char *name, const char *def)
int res_trav(Res r, const char *prefix, void *p, void(*f)(void *p, const char *name, const char *value))
data1_attset_child * next
data1_attset_child * children
struct data1_node * child
zebAccessObject attributeSetIds
struct zebSUInfoB * SUInfo
data1_node * data1_database
zebAttributeDetails attributeDetails
struct zebDatabaseInfoB * next
zinfo_index_category_t cat
data1_node * data1_categoryList
struct zebraExplainAttset * next
struct zebraCategoryListInfo * categoryList
ZebraExplainUpdateFunc * updateFunc
struct zebraExplainAttset * attsets
struct zebDatabaseInfoB * databaseInfo
data1_node * data1_target
struct zebDatabaseInfoB * curDatabaseInfo
void zebra_exit(const char *msg)
zint atoi_zn(const char *buf, zint len)
#define ZEBRAVER
Version as string.
static void zebraExplain_updateAccessInfo(ZebraExplainInfo zei, data1_node *n, zebAccessInfo accessInfo)
struct zebSUInfoB * zebraExplain_get_sui_info(ZebraExplainInfo zei, int ord, int dirty_mark, const char **db)
zebAccessObject zebraExplain_announceOid(ZebraExplainInfo zei, zebAccessObject *op, Odr_oid *oid)
static void writeAttributeValues(ZebraExplainInfo zei, data1_node *node_values, data1_attset *attset)
struct zebAccessObjectB * zebAccessObject
static void att_loadset(void *p, const char *n, const char *name)
void zebraExplain_loadAttsets(data1_handle dh, Res res)
void zebraExplain_mergeAccessInfo(ZebraExplainInfo zei, data1_node *n, zebAccessInfo *accessInfo)
int zebraExplain_curDatabase(ZebraExplainInfo zei, const char *database)
static data1_node * read_sgml_rec(data1_handle dh, NMEM nmem, Record rec)
RecordAttr * rec_init_attr(ZebraExplainInfo zei, Record rec)
void zebraExplain_recordBytesIncrement(ZebraExplainInfo zei, int adjust_num)
zint zebraExplain_ord_get_term_occurrences(ZebraExplainInfo zei, int ord)
static void zebraExplain_writeDatabase(ZebraExplainInfo zei, struct zebDatabaseInfoB *zdi, int key_flush)
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
ZebraExplainInfo zebraExplain_open(Records records, data1_handle dh, Res res, int writeFlag, void *updateHandle, ZebraExplainUpdateFunc *updateFunc)
void zebraExplain_addSchema(ZebraExplainInfo zei, Odr_oid *oid)
static void zebraExplain_writeTarget(ZebraExplainInfo zei, int key_flush)
void zebraExplain_recordCountIncrement(ZebraExplainInfo zei, int adjust_num)
static void zebraExplain_initAccessInfo(ZebraExplainInfo zei, data1_node *n)
static void zebraExplain_writeAttributeSet(ZebraExplainInfo zei, zebAccessObject o, int key_flush)
struct zebSUInfoB * zebraExplain_add_sui_info(ZebraExplainInfo zei, zinfo_index_category_t cat, const char *index_type)
int zebraExplain_trav_ord(ZebraExplainInfo zei, void *handle, int(*f)(void *handle, int ord, const char *index_type, const char *string_index, zinfo_index_category_t cat))
int zebraExplain_add_attr_str(ZebraExplainInfo zei, zinfo_index_category_t cat, const char *index_type, const char *index_name)
zint zebraExplain_runNumberIncrement(ZebraExplainInfo zei, int adjust_num)
static void zebraExplain_writeCategoryList(ZebraExplainInfo zei, struct zebraCategoryListInfo *zcl, int key_flush)
int zebraExplain_get_database_ord(ZebraExplainInfo zei)
int zebraExplain_ord_adjust_occurrences(ZebraExplainInfo zei, int ord, int term_delta, int doc_delta)
void zebraExplain_mergeOids(ZebraExplainInfo zei, data1_node *n, zebAccessObject *op)
static void zebraExplain_initCommonInfo(ZebraExplainInfo zei, data1_node *n)
void zebraExplain_close(ZebraExplainInfo zei)
int zebraExplain_removeDatabase(ZebraExplainInfo zei, void *update_handle)
static void zebraExplain_readAttributeDetails(ZebraExplainInfo zei, zebAttributeDetails zad)
int zebraExplain_ord_get_occurrences(ZebraExplainInfo zei, int ord, zint *term_occurrences, zint *doc_occurrences)
struct zebAccessInfoB * zebAccessInfo
int zebraExplain_lookup_ord(ZebraExplainInfo zei, int ord, const char **index_type, const char **db, const char **string_index)
static Record createRecord(Records records, zint *sysno)
zint zebraExplain_ord_get_doc_occurrences(ZebraExplainInfo zei, int ord)
static void zebraExplain_writeAttributeDetails(ZebraExplainInfo zei, zebAttributeDetails zad, const char *databaseName, int key_flush)
int zebraExplain_newDatabase(ZebraExplainInfo zei, const char *database, int explain_database)
static void zebraExplain_readDatabase(ZebraExplainInfo zei, struct zebDatabaseInfoB *zdi)
static void zebraExplain_updateCommonInfo(ZebraExplainInfo zei, data1_node *n)
void zebraExplain_flush(ZebraExplainInfo zei, void *handle)
ZEBRA_RES ZebraExplainUpdateFunc(void *handle, Record drec, data1_node *n)
struct zebraExplainInfo * ZebraExplainInfo
@ zinfo_index_category_index
@ zinfo_index_category_alwaysmatches
@ zinfo_index_category_sort
@ zinfo_index_category_anchor