Deal with two common places for corrupt Explain database
[idzebra-moved-to-github.git] / index / zinfo.c
index 9684111..9086b6c 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zinfo.c,v 1.68 2006-08-14 10:40:15 adam Exp $
-   Copyright (C) 1995-2006
+/* $Id: zinfo.c,v 1.77 2007-02-24 16:47:16 adam Exp $
+   Copyright (C) 1995-2007
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -53,7 +53,7 @@ struct zebSUInfoB {
 typedef struct zebAccessObjectB *zebAccessObject;
 struct zebAccessObjectB {
     void *handle;
-    SYSNO sysno;
+    zint sysno;
     Odr_oid *oid;
     zebAccessObject next;
 };
@@ -66,7 +66,7 @@ struct zebAccessInfoB {
 
 typedef struct {
     struct zebSUInfoB *SUInfo;
-    SYSNO sysno;
+    zint sysno;
     int dirty;
     int readFlag;
     data1_node *data1_tree;
@@ -79,7 +79,7 @@ struct zebDatabaseInfoB {
     data1_node *data1_database;
     zint recordCount;    /* records in db */
     zint recordBytes;    /* size of records */
-    SYSNO sysno;         /* sysno of database info */
+    zint sysno;          /* sysno of database info */
     int readFlag;        /* 1: read is needed when referenced; 0 if not */
     int dirty;           /* 1: database is dirty: write is needed */
     struct zebDatabaseInfoB *next;
@@ -94,7 +94,7 @@ struct zebraExplainAttset {
 
 struct zebraCategoryListInfo {
     int dirty;
-    SYSNO sysno;
+    zint sysno;
     data1_node *data1_categoryList;
 };
 
@@ -143,7 +143,7 @@ static void zebraExplain_writeCategoryList(ZebraExplainInfo zei,
                                            int key_flush);
 
 
-static Record createRecord(Records records, SYSNO *sysno)
+static Record createRecord(Records records, zint *sysno)
 {
     Record rec;
     if (*sysno)
@@ -409,11 +409,23 @@ ZebraExplainInfo zebraExplain_open(
 #endif
        node_tgtinfo = data1_search_tag(zei->dh, zei->data1_target,
                                         "/targetInfo");
+        if (!node_tgtinfo)
+        {
+           yaz_log(YLOG_FATAL, "Node node_tgtinfo missing");
+           nmem_destroy(zei->nmem);
+           return 0;
+        }
        zebraExplain_mergeAccessInfo(zei, node_tgtinfo,
                                      &zei->accessInfo);
 
        node_zebra = data1_search_tag(zei->dh, node_tgtinfo->child,
                                       "zebraInfo");
+        if (!node_zebra)
+        {
+           yaz_log(YLOG_FATAL, "Node node_zebra missing");
+           nmem_destroy(zei->nmem);
+           return 0;
+        }
        np = 0;
        if (node_zebra)
        {
@@ -491,7 +503,7 @@ ZebraExplainInfo zebraExplain_open(
             yaz_log(YLOG_DEBUG, "read runnumber=" ZINT_FORMAT, zei->runNumber);
            *zdip = NULL;
        }
-       rec_rm(&trec);
+       rec_free(&trec);
     }
     else  /* create initial targetInfo */
     {
@@ -543,7 +555,7 @@ ZebraExplainInfo zebraExplain_open(
            trec->size[recInfo_storeData] = sgml_len;
                
            rec_put(records, &trec);
-           rec_rm(&trec);
+           rec_free(&trec);
        }
        
        zebraExplain_newDatabase(zei, "IR-Explain-1", 0);
@@ -693,7 +705,7 @@ static void zebraExplain_readAttributeDetails(ZebraExplainInfo zei,
     }
     *zsuip = NULL;
     zad->readFlag = 0;
-    rec_rm (&rec);
+    rec_free(&rec);
 }
 
 static void zebraExplain_readDatabase (ZebraExplainInfo zei,
@@ -738,7 +750,7 @@ static void zebraExplain_readDatabase (ZebraExplainInfo zei,
                                    np->child->u.data.len);
     }
     zdi->readFlag = 0;
-    rec_rm (&rec);
+    rec_free(&rec);
 }
 
 int zebraExplain_removeDatabase(ZebraExplainInfo zei, void *update_handle)
@@ -762,12 +774,12 @@ int zebraExplain_removeDatabase(ZebraExplainInfo zei, void *update_handle)
                
                rec = rec_get(zei->records, zad->sysno);
                (*zei->updateFunc)(zei->updateHandle, rec, 0);
-               rec_rm(&rec);
+               rec_free(&rec);
            }
            /* remove database record keys and delete it */
            rec = rec_get (zei->records, zdi->sysno);
            (*zei->updateFunc)(zei->updateHandle, rec, 0);
-           rec_rm(&rec);
+           rec_free(&rec);
 
            /* remove from list */
            *zdip = zdi->next;
@@ -855,8 +867,7 @@ static void zebraExplain_updateAccessInfo (ZebraExplainInfo zei, data1_node *n,
     if (!c)
     {
         data1_pr_tree (zei->dh, n, stdout);
-        exit (0);
-        assert (c);
+        zebra_exit("zebraExplain_updateAccessInfo");
     }
 
     if ((p = accessInfo->attributeSetIds))
@@ -964,6 +975,8 @@ int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database,
 
     zebraExplain_initCommonInfo (zei, node_adinfo);
 
+    data1_mk_tag_data_text(zei->dh, node_adinfo, "name", database, zei->nmem);
+
     return 0;
 }
 
@@ -977,7 +990,7 @@ static void zebraExplain_writeCategoryList (ZebraExplainInfo zei,
     int i;
     Record drec;
     data1_node *node_ci, *node_categoryList;
-    SYSNO sysno = 0;
+    zint sysno = 0;
     static char *category[] = {
        "CategoryList",
        "TargetInfo",
@@ -1049,6 +1062,7 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
     zad->dirty = 0;
 #if ZINFO_DEBUG
     yaz_log(YLOG_LOG, "zebraExplain_writeAttributeDetails");    
+    data1_pr_tree(zei->dh, zad->data1_tree, stderr);
 #endif
 
     drec = createRecord (zei->records, &zad->sysno);
@@ -1060,16 +1074,14 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
                                   "/attributeDetails");
     zebraExplain_updateCommonInfo (zei, node_adinfo);
 
-    data1_mk_tag_data_text (zei->dh, node_adinfo, "name",
-                           databaseName, zei->nmem);
+    /* zebra info (private) .. no children yet.. so se don't index zebraInfo */
+    node_zebra = data1_mk_tag_uni (zei->dh, zei->nmem,
+                                "zebraInfo", node_adinfo);
 
     /* extract *searchable* keys from it. We do this here, because
        record count, etc. is affected */
     if (key_flush)
        (*zei->updateFunc)(zei->updateHandle, drec, zad->data1_tree);
-    /* zebra info (private) */
-    node_zebra = data1_mk_tag_uni (zei->dh, zei->nmem,
-                                "zebraInfo", node_adinfo);
     node_list = data1_mk_tag_uni (zei->dh, zei->nmem,
                                 "attrlist", node_zebra);
     for (zsui = zad->SUInfo; zsui; zsui = zsui->next)
@@ -1153,10 +1165,6 @@ static void zebraExplain_writeDatabase (ZebraExplainInfo zei,
     zebraExplain_updateCommonInfo (zei, node_dbinfo);
     zebraExplain_updateAccessInfo (zei, node_dbinfo, zdi->accessInfo);
 
-    /* extract *searchable* keys from it. We do this here, because
-       record count, etc. is affected */
-    if (key_flush)
-       (*zei->updateFunc)(zei->updateHandle, drec, zdi->data1_database);
     /* record count */
     node_count = data1_mk_tag_uni (zei->dh, zei->nmem,
                                 "recordCount", node_dbinfo);
@@ -1166,6 +1174,11 @@ static void zebraExplain_writeDatabase (ZebraExplainInfo zei,
     /* zebra info (private) */
     node_zebra = data1_mk_tag_uni (zei->dh, zei->nmem,
                                 "zebraInfo", node_dbinfo);
+
+    /* extract *searchable* keys from it. We do this here, because
+       record count, etc. is affected */
+    if (key_flush)
+       (*zei->updateFunc)(zei->updateHandle, drec, zdi->data1_database);
     data1_mk_tag_data_zint (zei->dh, node_zebra,
                           "recordBytes", zdi->recordBytes, zei->nmem);
 
@@ -1307,12 +1320,12 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush)
     zebraExplain_updateCommonInfo (zei, node_tgtinfo);
     zebraExplain_updateAccessInfo (zei, node_tgtinfo, zei->accessInfo);
 
+    node_zebra = data1_mk_tag_uni (zei->dh, zei->nmem,
+                                "zebraInfo", node_tgtinfo);
     /* convert to "SGML" and write it */
     if (key_flush)
        (*zei->updateFunc)(zei->updateHandle, trec, zei->data1_target);
 
-    node_zebra = data1_mk_tag_uni (zei->dh, zei->nmem,
-                                "zebraInfo", node_tgtinfo);
     data1_mk_tag_data_text (zei->dh, node_zebra, "version",
                               ZEBRAVER, zei->nmem);
     node_list = data1_mk_tag (zei->dh, zei->nmem,
@@ -1360,10 +1373,10 @@ int zebraExplain_lookup_attr_str(ZebraExplainInfo zei,
     assert (zei->curDatabaseInfo);
     for (zsui = &zei->curDatabaseInfo->attributeDetails->SUInfo;
         *zsui; zsui = &(*zsui)->next)
-        if ((*zsui)->info.index_type == index_type
-            && (*zsui)->info.cat == cat
-            && (*zsui)->info.which == ZEB_SU_STR 
-            && !yaz_matchstr((*zsui)->info.u.str, str))
+        if ( (index_type == -1 || (*zsui)->info.index_type == index_type)
+             && (*zsui)->info.cat == cat
+             && (*zsui)->info.which == ZEB_SU_STR 
+             && !yaz_matchstr((*zsui)->info.u.str, str))
         {
             struct zebSUInfoB *zsui_this = *zsui;
 
@@ -1612,6 +1625,8 @@ RecordAttr *rec_init_attr (ZebraExplainInfo zei, Record rec)
     if (rec->info[recInfo_attr])
        return (RecordAttr *) rec->info[recInfo_attr];
     recordAttr = (RecordAttr *) xmalloc (sizeof(*recordAttr));
+
+    memset(recordAttr, '\0', sizeof(*recordAttr));
     rec->info[recInfo_attr] = (char *) recordAttr;
     rec->size[recInfo_attr] = sizeof(*recordAttr);