X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzinfo.c;h=60ae41525924113307a7914ac535aeff2214cae0;hb=342c28e71fe5122d17d760a930107cab0266e9c6;hp=7b16902d5259e6a34e5fcc05a4268a5db3c434fc;hpb=ec214819d7b9e2f5c362584d8e38f83e13aae600;p=idzebra-moved-to-github.git diff --git a/index/zinfo.c b/index/zinfo.c index 7b16902..60ae415 100644 --- a/index/zinfo.c +++ b/index/zinfo.c @@ -1,6 +1,6 @@ -/* $Id: zinfo.c,v 1.40 2004-08-25 09:23:36 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 - Index Data Aps +/* $Id: zinfo.c,v 1.49 2005-08-18 12:50:18 adam Exp $ + Copyright (C) 1995-2005 + Index Data ApS This file is part of the Zebra server. @@ -20,8 +20,9 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include +#include #include +#include #include #include @@ -31,8 +32,17 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define ZINFO_DEBUG 0 struct zebSUInfo { - int set; - int use; + int index_type; +#define ZEB_SU_SET_USE 1 +#define ZEB_SU_STR 2 + int which; + union { + char *str; + struct { + int set; + int use; + } su; + } u; int ordinal; }; @@ -198,7 +208,7 @@ void zebraExplain_flush (ZebraExplainInfo zei, void *handle) void zebraExplain_close (ZebraExplainInfo zei) { #if ZINFO_DEBUG - yaz_log (LOG_LOG, "zebraExplain_close"); + yaz_log (YLOG_LOG, "zebraExplain_close"); #endif if (!zei) return; @@ -332,7 +342,7 @@ ZebraExplainInfo zebraExplain_open ( NMEM nmem = nmem_create (); #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_open wr=%d", writeFlag); + yaz_log (YLOG_LOG, "zebraExplain_open wr=%d", writeFlag); #endif zei = (ZebraExplainInfo) nmem_malloc (nmem, sizeof(*zei)); zei->write_flag = writeFlag; @@ -363,7 +373,7 @@ ZebraExplainInfo zebraExplain_open ( 0, 0, 0, 0, 0, 0); } zdip = &zei->databaseInfo; - trec = rec_get (records, 1); /* get "root" record */ + trec = rec_get_root(records); /* get "root" record */ zei->ordinalSU = 1; zei->runNumber = 0; @@ -380,7 +390,7 @@ ZebraExplainInfo zebraExplain_open ( if (!zei->data1_target) #endif { - logf (LOG_FATAL, "Explain schema missing. Check profilePath"); + yaz_log (YLOG_FATAL, "Explain schema missing. Check profilePath"); nmem_destroy (zei->nmem); return 0; } @@ -462,7 +472,7 @@ ZebraExplainInfo zebraExplain_open ( np = np->child; assert (np && np->which == DATA1N_data); zei->runNumber = atoi_zn (np->u.data.data, np->u.data.len); - yaz_log (LOG_DEBUG, "read runnumber=" ZINT_FORMAT, zei->runNumber); + yaz_log (YLOG_DEBUG, "read runnumber=" ZINT_FORMAT, zei->runNumber); *zdip = NULL; } rec_rm (&trec); @@ -487,7 +497,7 @@ ZebraExplainInfo zebraExplain_open ( "\n" ); if (!zei->data1_target) { - logf (LOG_FATAL, "Explain schema missing. Check profilePath"); + yaz_log (YLOG_FATAL, "Explain schema missing. Check profilePath"); nmem_destroy (zei->nmem); return 0; } @@ -561,7 +571,9 @@ static void zebraExplain_readAttributeDetails (ZebraExplainInfo zei, { data1_node *node_set = NULL; data1_node *node_use = NULL; + data1_node *node_str = NULL; data1_node *node_ordinal = NULL; + data1_node *node_type = NULL; data1_node *np2; char oid_str[128]; int oid_str_len; @@ -577,27 +589,59 @@ static void zebraExplain_readAttributeDetails (ZebraExplainInfo zei, node_set = np2->child; else if (!strcmp (np2->u.tag.tag, "use")) node_use = np2->child; + else if (!strcmp (np2->u.tag.tag, "str")) + node_str = np2->child; else if (!strcmp (np2->u.tag.tag, "ordinal")) node_ordinal = np2->child; + else if (!strcmp (np2->u.tag.tag, "type")) + node_type = np2->child; } - assert (node_set && node_use && node_ordinal); - - oid_str_len = node_set->u.data.len; - if (oid_str_len >= (int) sizeof(oid_str)) - oid_str_len = sizeof(oid_str)-1; - memcpy (oid_str, node_set->u.data.data, oid_str_len); - oid_str[oid_str_len] = '\0'; + assert (node_ordinal); *zsuip = (struct zebSUInfoB *) nmem_malloc (zei->nmem, sizeof(**zsuip)); - (*zsuip)->info.set = oid_getvalbyname (oid_str); - (*zsuip)->info.use = atoi_n (node_use->u.data.data, - node_use->u.data.len); + if (node_type && node_type->u.data.len > 0) + (*zsuip)->info.index_type = node_type->u.data.data[0]; + else + { + yaz_log(YLOG_WARN, "Missing attribute 'type' in attribute info"); + (*zsuip)->info.index_type = 'w'; + } + + if (node_set && node_use) + { + (*zsuip)->info.which = ZEB_SU_SET_USE; + + oid_str_len = node_set->u.data.len; + if (oid_str_len >= (int) sizeof(oid_str)) + oid_str_len = sizeof(oid_str)-1; + memcpy (oid_str, node_set->u.data.data, oid_str_len); + oid_str[oid_str_len] = '\0'; + + (*zsuip)->info.u.su.set = oid_getvalbyname (oid_str); + + (*zsuip)->info.u.su.use = atoi_n (node_use->u.data.data, + node_use->u.data.len); + yaz_log (YLOG_DEBUG, "set=%d use=%d ordinal=%d", + (*zsuip)->info.u.su.set, (*zsuip)->info.u.su.use, + (*zsuip)->info.ordinal); + } + else if (node_str) + { + (*zsuip)->info.which = ZEB_SU_STR; + + (*zsuip)->info.u.str = nmem_strdupn(zei->nmem, + node_str->u.data.data, + node_str->u.data.len); + } + else + { + yaz_log(YLOG_WARN, "Missing set/use/str in attribute info"); + continue; + } (*zsuip)->info.ordinal = atoi_n (node_ordinal->u.data.data, node_ordinal->u.data.len); - logf (LOG_DEBUG, "set=%d use=%d ordinal=%d", - (*zsuip)->info.set, (*zsuip)->info.use, (*zsuip)->info.ordinal); zsuip = &(*zsuip)->next; } *zsuip = NULL; @@ -703,19 +747,19 @@ int zebraExplain_curDatabase (ZebraExplainInfo zei, const char *database) if (!zdi) return -1; #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_curDatabase: %s", database); + yaz_log (YLOG_LOG, "zebraExplain_curDatabase: %s", database); #endif if (zdi->readFlag) { #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_readDatabase: %s", database); + yaz_log (YLOG_LOG, "zebraExplain_readDatabase: %s", database); #endif zebraExplain_readDatabase (zei, zdi); } if (zdi->attributeDetails->readFlag) { #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_readAttributeDetails: %s", database); + yaz_log (YLOG_LOG, "zebraExplain_readAttributeDetails: %s", database); #endif zebraExplain_readAttributeDetails (zei, zdi->attributeDetails); } @@ -787,7 +831,7 @@ int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database, database_n = database; #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_newDatabase: %s", database); + yaz_log (YLOG_LOG, "zebraExplain_newDatabase: %s", database); #endif assert (zei); for (zdi = zei->databaseInfo; zdi; zdi=zdi->next) @@ -879,15 +923,17 @@ static void writeAttributeValueDetails (ZebraExplainInfo zei, writeAttributeValueDetails (zei, zad, node_atvs, c->child); for (zsui = zad->SUInfo; zsui; zsui = zsui->next) { - data1_node *node_attvalue, *node_value; - if (set_ordinal != zsui->info.set) - continue; - node_attvalue = data1_mk_tag (zei->dh, zei->nmem, "attributeValue", - 0 /* attr */, node_atvs); - node_value = data1_mk_tag (zei->dh, zei->nmem, "value", - 0 /* attr */, node_attvalue); - data1_mk_tag_data_int (zei->dh, node_value, "numeric", - zsui->info.use, zei->nmem); + if (zsui->info.which == ZEB_SU_SET_USE && + set_ordinal == zsui->info.u.su.set) + { + data1_node *node_attvalue, *node_value; + node_attvalue = data1_mk_tag (zei->dh, zei->nmem, "attributeValue", + 0 /* attr */, node_atvs); + node_value = data1_mk_tag (zei->dh, zei->nmem, "value", + 0 /* attr */, node_attvalue); + data1_mk_tag_data_int (zei->dh, node_value, "numeric", + zsui->info.u.su.use, zei->nmem); + } } } @@ -916,7 +962,7 @@ static void zebraExplain_writeCategoryList (ZebraExplainInfo zei, node_categoryList = zcl->data1_categoryList; #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_writeCategoryList"); + yaz_log (YLOG_LOG, "zebraExplain_writeCategoryList"); #endif drec = createRecord (zei->records, &sysno); @@ -970,7 +1016,7 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, zad->dirty = 0; #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_writeAttributeDetails"); + yaz_log (YLOG_LOG, "zebraExplain_writeAttributeDetails"); #endif drec = createRecord (zei->records, &zad->sysno); @@ -998,9 +1044,10 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, int set_ordinal = -1; for (zsui = zad->SUInfo; zsui; zsui = zsui->next) { - if ((set_ordinal < 0 || set_ordinal > zsui->info.set) - && zsui->info.set > set_min) - set_ordinal = zsui->info.set; + if (zsui->info.which == ZEB_SU_SET_USE && + (set_ordinal < 0 || set_ordinal > zsui->info.u.su.set) + && zsui->info.u.su.set > set_min) + set_ordinal = zsui->info.u.su.set; } if (set_ordinal < 0) break; @@ -1055,19 +1102,33 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, struct oident oident; int oid[OID_SIZE]; data1_node *node_attr; + char index_type_str[2]; + node_attr = data1_mk_tag (zei->dh, zei->nmem, "attr", 0 /* attr */, node_list); - - oident.proto = PROTO_Z3950; - oident.oclass = CLASS_ATTSET; - oident.value = (enum oid_value) zsui->info.set; - oid_ent_to_oid (&oident, oid); - - data1_mk_tag_data_text (zei->dh, node_attr, "set", - oident.desc, zei->nmem); - data1_mk_tag_data_int (zei->dh, node_attr, "use", - zsui->info.use, zei->nmem); + + index_type_str[0] = zsui->info.index_type; + index_type_str[1] = '\0'; + data1_mk_tag_data_text (zei->dh, node_attr, "type", + index_type_str, zei->nmem); + if (zsui->info.which == ZEB_SU_SET_USE) + { + oident.proto = PROTO_Z3950; + oident.oclass = CLASS_ATTSET; + oident.value = (enum oid_value) zsui->info.u.su.set; + oid_ent_to_oid (&oident, oid); + + data1_mk_tag_data_text (zei->dh, node_attr, "set", + oident.desc, zei->nmem); + data1_mk_tag_data_int (zei->dh, node_attr, "use", + zsui->info.u.su.use, zei->nmem); + } + else if (zsui->info.which == ZEB_SU_STR) + { + data1_mk_tag_data_text (zei->dh, node_attr, "str", + zsui->info.u.str, zei->nmem); + } data1_mk_tag_data_int (zei->dh, node_attr, "ordinal", zsui->info.ordinal, zei->nmem); } @@ -1098,7 +1159,7 @@ static void zebraExplain_writeDatabase (ZebraExplainInfo zei, zdi->dirty = 0; #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_writeDatabase %s", zdi->databaseName); + yaz_log (YLOG_LOG, "zebraExplain_writeDatabase %s", zdi->databaseName); #endif drec = createRecord (zei->records, &zdi->sysno); assert (zdi->data1_database); @@ -1182,7 +1243,7 @@ static void zebraExplain_writeAttributeSet (ZebraExplainInfo zei, attset = data1_attset_search_id (zei->dh, entp->value); #if ZINFO_DEBUG - logf (LOG_LOG, "zebraExplain_writeAttributeSet %s", + yaz_log (YLOG_LOG, "zebraExplain_writeAttributeSet %s", attset ? attset->name : ""); #endif @@ -1248,7 +1309,7 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush) return; zei->dirty = 0; - trec = rec_get (zei->records, 1); + trec = rec_get_root(zei->records); xfree (trec->info[recInfo_storeData]); node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target, @@ -1298,14 +1359,45 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush) rec_put (zei->records, &trec); } -int zebraExplain_lookupSU (ZebraExplainInfo zei, int set, int use) +int zebraExplain_lookup_attr_su_any_index(ZebraExplainInfo zei, + int set, int use) { struct zebSUInfoB *zsui; assert (zei->curDatabaseInfo); for (zsui = zei->curDatabaseInfo->attributeDetails->SUInfo; zsui; zsui=zsui->next) - if (zsui->info.use == use && zsui->info.set == set) + if (zsui->info.which == ZEB_SU_SET_USE && + zsui->info.u.su.use == use && zsui->info.u.su.set == set) + return zsui->info.ordinal; + return -1; +} + +int zebraExplain_lookup_attr_su(ZebraExplainInfo zei, int index_type, + int set, int use) +{ + struct zebSUInfoB *zsui; + + assert (zei->curDatabaseInfo); + for (zsui = zei->curDatabaseInfo->attributeDetails->SUInfo; + zsui; zsui=zsui->next) + if (zsui->info.index_type == index_type && + zsui->info.which == ZEB_SU_SET_USE && + zsui->info.u.su.use == use && zsui->info.u.su.set == set) + return zsui->info.ordinal; + return -1; +} + +int zebraExplain_lookup_attr_str(ZebraExplainInfo zei, int index_type, + const char *str) +{ + struct zebSUInfoB *zsui; + + assert (zei->curDatabaseInfo); + for (zsui = zei->curDatabaseInfo->attributeDetails->SUInfo; + zsui; zsui=zsui->next) + if (zsui->info.index_type == index_type && + zsui->info.which == ZEB_SU_STR && !strcmp(zsui->info.u.str, str)) return zsui->info.ordinal; return -1; } @@ -1331,11 +1423,12 @@ int zebraExplain_lookup_ord (ZebraExplainInfo zei, int ord, { struct zebSUInfoB *zsui = zdb->attributeDetails->SUInfo; for ( ;zsui; zsui = zsui->next) - if (zsui->info.ordinal == ord) + if (zsui->info.which == ZEB_SU_SET_USE && + zsui->info.ordinal == ord) { *db = zdb->databaseName; - *set = zsui->info.set; - *use = zsui->info.use; + *set = zsui->info.u.su.set; + *use = zsui->info.u.su.use; return 0; } } @@ -1380,23 +1473,40 @@ void zebraExplain_addAttributeSet (ZebraExplainInfo zei, int set) } } -int zebraExplain_addSU (ZebraExplainInfo zei, int set, int use) +int zebraExplain_add_attr_su(ZebraExplainInfo zei, int index_type, + int set, int use) { struct zebSUInfoB *zsui; assert (zei->curDatabaseInfo); - for (zsui = zei->curDatabaseInfo->attributeDetails->SUInfo; - zsui; zsui=zsui->next) - if (zsui->info.use == use && zsui->info.set == set) - return -1; zebraExplain_addAttributeSet (zei, set); zsui = (struct zebSUInfoB *) nmem_malloc (zei->nmem, sizeof(*zsui)); zsui->next = zei->curDatabaseInfo->attributeDetails->SUInfo; zei->curDatabaseInfo->attributeDetails->SUInfo = zsui; zei->curDatabaseInfo->attributeDetails->dirty = 1; zei->dirty = 1; - zsui->info.set = set; - zsui->info.use = use; + zsui->info.index_type = index_type; + zsui->info.which = ZEB_SU_SET_USE; + zsui->info.u.su.set = set; + zsui->info.u.su.use = use; + zsui->info.ordinal = (zei->ordinalSU)++; + return zsui->info.ordinal; +} + +int zebraExplain_add_attr_str(ZebraExplainInfo zei, int index_type, + const char *index_name) +{ + struct zebSUInfoB *zsui; + + assert (zei->curDatabaseInfo); + zsui = (struct zebSUInfoB *) nmem_malloc (zei->nmem, sizeof(*zsui)); + zsui->next = zei->curDatabaseInfo->attributeDetails->SUInfo; + zei->curDatabaseInfo->attributeDetails->SUInfo = zsui; + zei->curDatabaseInfo->attributeDetails->dirty = 1; + zei->dirty = 1; + zsui->info.index_type = index_type; + zsui->info.which = ZEB_SU_STR; + zsui->info.u.str = nmem_strdup(zei->nmem, index_name); zsui->info.ordinal = (zei->ordinalSU)++; return zsui->info.ordinal; } @@ -1452,6 +1562,7 @@ RecordAttr *rec_init_attr (ZebraExplainInfo zei, Record rec) recordAttr->recordSize = 0; recordAttr->recordOffset = 0; recordAttr->runNumber = zei->runNumber; + recordAttr->staticrank = 0; return recordAttr; } @@ -1459,7 +1570,7 @@ static void att_loadset(void *p, const char *n, const char *name) { data1_handle dh = (data1_handle) p; if (!data1_get_attset (dh, name)) - logf (LOG_WARN, "Directive attset failed for %s", name); + yaz_log (YLOG_WARN, "Directive attset failed for %s", name); } void zebraExplain_loadAttsets (data1_handle dh, Res res)