X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzinfo.c;h=105915fed398cf54f4f9169891b0d5bc6672d7b0;hb=985e8a4d37568d885a9f29171364c1b9818ded9d;hp=41c6dd904a623bc9c3854b0110eb211022cdc78a;hpb=8c63ceb6afdfcea5c1efbd716f75c99f18c77b5c;p=idzebra-moved-to-github.git diff --git a/index/zinfo.c b/index/zinfo.c index 41c6dd9..105915f 100644 --- a/index/zinfo.c +++ b/index/zinfo.c @@ -1,10 +1,22 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zinfo.c,v $ - * Revision 1.9 1998-06-02 12:10:27 adam + * Revision 1.12 1998-10-13 20:37:11 adam + * Changed the way attribute sets are saved in Explain database to + * reflect "dynamic" OIDs. + * + * Revision 1.11 1998/06/09 12:16:48 adam + * Implemented auto-generation of CategoryList records. + * + * Revision 1.10 1998/06/08 14:43:15 adam + * Added suport for EXPLAIN Proxy servers - added settings databasePath + * and explainDatabase to facilitate this. Increased maximum number + * of databases and attributes in one register. + * + * Revision 1.9 1998/06/02 12:10:27 adam * Fixed bug related to attributeDetails. * * Revision 1.8 1998/05/20 10:12:20 adam @@ -100,6 +112,12 @@ struct zebraExplainAttset { struct zebraExplainAttset *next; }; +struct zebraCategoryListInfo { + int dirty; + int sysno; + data1_node *data1_categoryList; +}; + struct zebraExplainInfo { int ordinalSU; int runNumber; @@ -110,6 +128,7 @@ struct zebraExplainInfo { struct zebraExplainAttset *attsets; NMEM nmem; data1_node *data1_target; + struct zebraCategoryListInfo *categoryList; struct zebDatabaseInfoB *databaseInfo; struct zebDatabaseInfoB *curDatabaseInfo; zebAccessInfo accessInfo; @@ -270,6 +289,10 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush); static void zebraExplain_writeAttributeSet (ZebraExplainInfo zei, zebAccessObject o, int key_flush); +static void zebraExplain_writeCategoryList (ZebraExplainInfo zei, + struct zebraCategoryListInfo *zcl, + int key_flush); + static Record createRecord (Records records, int *sysno) { @@ -310,7 +333,9 @@ void zebraExplain_close (ZebraExplainInfo zei, int writeFlag, zdi->databaseName, 1); } zebraExplain_writeTarget (zei, 1); - + zebraExplain_writeCategoryList (zei, + zei->categoryList, + 1); assert (zei->accessInfo); for (o = zei->accessInfo->attributeSetIds; o; o = o->next) if (!o->sysno) @@ -422,6 +447,11 @@ ZebraExplainInfo zebraExplain_open ( zei->dh = dh; zei->attsets = NULL; zei->res = res; + zei->categoryList = nmem_malloc (zei->nmem, + sizeof(*zei->categoryList)); + zei->categoryList->sysno = 0; + zei->categoryList->dirty = 0; + zei->categoryList->data1_categoryList = NULL; time (&our_time); tm = localtime (&our_time); @@ -536,7 +566,6 @@ ZebraExplainInfo zebraExplain_open ( "targetInfo"); assert (node_tgtinfo); - zebraExplain_initCommonInfo (zei, node_tgtinfo); zebraExplain_initAccessInfo (zei, node_tgtinfo); @@ -556,7 +585,24 @@ ZebraExplainInfo zebraExplain_open ( } *zdip = NULL; rec_rm (&trec); - zebraExplain_newDatabase (zei, "IR-Explain-1"); + zebraExplain_newDatabase (zei, "IR-Explain-1", 0); + + if (!zei->categoryList->dirty) + { + struct zebraCategoryListInfo *zcl = zei->categoryList; + data1_node *node_cl; + + zcl->dirty = 1; + zcl->data1_categoryList = + data1_read_sgml (zei->dh, zei->nmem, + "CategoryList\n" + "/>\n"); + node_cl = data1_search_tag (zei->dh, + zcl->data1_categoryList->child, + "categoryList"); + assert (node_cl); + zebraExplain_initCommonInfo (zei, node_cl); + } } return zei; } @@ -585,6 +631,9 @@ static void zebraExplain_readAttributeDetails (ZebraExplainInfo zei, data1_node *node_use = NULL; data1_node *node_ordinal = NULL; data1_node *np2; + char oid_str[128]; + int oid_str_len; + if (np->which != DATA1N_tag || strcmp (np->u.tag.tag, "attr")) continue; for (np2 = np->child; np2; np2 = np2->next) @@ -600,10 +649,16 @@ static void zebraExplain_readAttributeDetails (ZebraExplainInfo zei, node_ordinal = np2->child; } assert (node_set && node_use && node_ordinal); + + oid_str_len = node_set->u.data.len; + if (oid_str_len >= 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 = nmem_malloc (zei->nmem, sizeof(**zsuip)); - (*zsuip)->info.set = atoi_n (node_set->u.data.data, - node_set->u.data.len); + (*zsuip)->info.set = oid_getvalbyname (oid_str); + (*zsuip)->info.use = atoi_n (node_use->u.data.data, node_use->u.data.len); (*zsuip)->info.ordinal = atoi_n (node_ordinal->u.data.data, @@ -734,7 +789,8 @@ static void zebraExplain_updateAccessInfo (ZebraExplainInfo zei, data1_node *n, } } -int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database) +int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database, + int explain_database) { struct zebDatabaseInfoB *zdi; data1_node *node_dbinfo, *node_adinfo; @@ -779,13 +835,17 @@ int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database) data1_add_tagdata_text (zei->dh, node_dbinfo, "name", database, zei->nmem); - + + if (explain_database) + data1_add_tagdata_text (zei->dh, node_dbinfo, "explainDatabase", + "", zei->nmem); + data1_add_tagdata_text (zei->dh, node_dbinfo, "userFee", - "0", zei->nmem); - + "0", zei->nmem); + data1_add_tagdata_text (zei->dh, node_dbinfo, "available", - "1", zei->nmem); - + "1", zei->nmem); + #if ZINFO_DEBUG data1_pr_tree (zei->dh, zdi->data1_database, stderr); #endif @@ -839,6 +899,68 @@ static void writeAttributeValueDetails (ZebraExplainInfo zei, } } +static void zebraExplain_writeCategoryList (ZebraExplainInfo zei, + struct zebraCategoryListInfo *zcl, + int key_flush) +{ + char *sgml_buf; + int sgml_len; + int i; + Record drec; + data1_node *node_ci, *node_categoryList; + int sysno = 0; + static char *category[] = { + "CategoryList", + "TargetInfo", + "DatabaseInfo", + "AttributeDetails", + NULL + }; + + assert (zcl); + if (!zcl->dirty) + return ; + zcl->dirty = 1; + node_categoryList = zcl->data1_categoryList; + +#if ZINFO_DEBUG + logf (LOG_LOG, "zebraExplain_writeCategoryList"); +#endif + + drec = createRecord (zei->records, &sysno); + + node_ci = data1_search_tag (zei->dh, node_categoryList->child, + "categoryList"); + assert (node_ci); + node_ci = data1_add_tag (zei->dh, node_ci, "categories", zei->nmem); + assert (node_ci); + + for (i = 0; category[i]; i++) + { + data1_node *node_cat = data1_add_tag (zei->dh, node_ci, + "category", zei->nmem); + + data1_add_tagdata_text (zei->dh, node_cat, "name", + category[i], zei->nmem); + } + /* extract *searchable* keys from it. We do this here, because + record count, etc. is affected */ + if (key_flush) + (*zei->updateFunc)(zei->updateHandle, drec, node_categoryList); + + /* convert to "SGML" and write it */ +#if ZINFO_DEBUG + data1_pr_tree (zei->dh, zad->data1_tree, stderr); +#endif + sgml_buf = data1_nodetoidsgml(zei->dh, node_categoryList, + 0, &sgml_len); + drec->info[recInfo_storeData] = xmalloc (sgml_len); + memcpy (drec->info[recInfo_storeData], sgml_buf, sgml_len); + drec->size[recInfo_storeData] = sgml_len; + + rec_put (zei->records, &drec); +} + static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, zebAttributeDetails zad, const char *databaseName, @@ -913,15 +1035,15 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, data1_node *node_abt, *node_atd, *node_atvs; data1_add_tagdata_oid (zei->dh, node_asd, "oid", oid, zei->nmem); - + node_abt = data1_add_tag (zei->dh, node_asd, "attributesByType", zei->nmem); node_atd = data1_add_tag (zei->dh, node_abt, "attributeTypeDetails", zei->nmem); data1_add_tagdata_int (zei->dh, node_atd, - "type", 1, zei->nmem); + "type", 1, zei->nmem); node_atvs = data1_add_tag (zei->dh, node_atd, - "attributeValues", zei->nmem); + "attributeValues", zei->nmem); writeAttributeValueDetails (zei, zad, node_atvs, attset); } } @@ -933,15 +1055,23 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei, "attrlist", zei->nmem); for (zsui = zad->SUInfo; zsui; zsui = zsui->next) { + struct oident oident; + int oid[OID_SIZE]; data1_node *node_attr; - node_attr = data1_add_tag (zei->dh, node_list, - "attr", zei->nmem); - data1_add_tagdata_int (zei->dh, node_attr, "set", - zsui->info.set, zei->nmem); + + node_attr = data1_add_tag (zei->dh, node_list, "attr", zei->nmem); + + oident.proto = PROTO_Z3950; + oident.oclass = CLASS_ATTSET; + oident.value = zsui->info.set; + oid_ent_to_oid (&oident, oid); + + data1_add_tagdata_text (zei->dh, node_attr, "set", + oident.desc, zei->nmem); data1_add_tagdata_int (zei->dh, node_attr, "use", - zsui->info.use, zei->nmem); + zsui->info.use, zei->nmem); data1_add_tagdata_int (zei->dh, node_attr, "ordinal", - zsui->info.ordinal, zei->nmem); + zsui->info.ordinal, zei->nmem); } /* convert to "SGML" and write it */ #if ZINFO_DEBUG