Zebra uses own XML reader (was part of YAZ before)
[idzebra-moved-to-github.git] / index / zinfo.c
index 1deda6f..65dfb84 100644 (file)
@@ -1,10 +1,26 @@
-/*
- * Copyright (C) 1994-2002, Index Data
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Id: zinfo.c,v 1.28 2002-05-03 13:49:04 adam Exp $
- */
+/* $Id: zinfo.c,v 1.34 2002-08-05 19:46:01 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+   Index Data Aps
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Zebra; see the file LICENSE.zebra.  If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+
 
 #include <stdlib.h>
 #include <assert.h>
@@ -78,6 +94,7 @@ struct zebraExplainInfo {
     int  ordinalSU;
     int  runNumber;
     int  dirty;
+    int write_flag;
     Records records;
     data1_handle dh;
     Res res;
@@ -139,12 +156,12 @@ static Record createRecord (Records records, int *sysno)
     return rec;
 }
 
-void zebraExplain_flush (ZebraExplainInfo zei, int writeFlag, void *handle)
+void zebraExplain_flush (ZebraExplainInfo zei, void *handle)
 {
     if (!zei)
         return;
     zei->updateHandle = handle;
-    if (writeFlag)
+    if (zei->write_flag)
     {
        struct zebDatabaseInfoB *zdi;
        zebAccessObject o;
@@ -180,14 +197,14 @@ void zebraExplain_flush (ZebraExplainInfo zei, int writeFlag, void *handle)
     }
 }
 
-void zebraExplain_close (ZebraExplainInfo zei, int writeFlag)
+void zebraExplain_close (ZebraExplainInfo zei)
 {
 #if ZINFO_DEBUG
-    logf (LOG_LOG, "zebraExplain_close wr=%d", writeFlag);
+    yaz_log (LOG_LOG, "zebraExplain_close");
 #endif
     if (!zei)
        return;
-    zebraExplain_flush (zei, writeFlag, zei->updateHandle);
+    zebraExplain_flush (zei, zei->updateHandle);
     nmem_destroy (zei->nmem);
 }
 
@@ -274,6 +291,7 @@ ZebraExplainInfo zebraExplain_open (
     logf (LOG_LOG, "zebraExplain_open wr=%d", writeFlag);
 #endif
     zei = (ZebraExplainInfo) nmem_malloc (nmem, sizeof(*zei));
+    zei->write_flag = writeFlag;
     zei->updateHandle = updateHandle;
     zei->updateFunc = updateFunc;
     zei->dirty = 0;
@@ -289,12 +307,17 @@ ZebraExplainInfo zebraExplain_open (
     zei->categoryList->dirty = 0;
     zei->categoryList->data1_categoryList = NULL;
 
-    time (&our_time);
-    tm = localtime (&our_time);
-    sprintf (zei->date, "%04d%02d%02d%02d%02d%02d",
-            tm->tm_year+1900, tm->tm_mon+1,  tm->tm_mday,
-            tm->tm_hour, tm->tm_min, tm->tm_sec);
-
+    if ( atoi (res_get_def (res, "notimestamps", "0") )== 0)
+    {
+        time (&our_time);
+        tm = localtime (&our_time);
+        sprintf (zei->date, "%04d%02d%02d%02d%02d%02d",
+                tm->tm_year+1900, tm->tm_mon+1,  tm->tm_mday,
+                tm->tm_hour, tm->tm_min, tm->tm_sec);
+    } else {
+        sprintf (zei->date, "%04d%02d%02d%02d%02d%02d",
+                0, 0, 0,  0, 0, 0);
+    }
     zdip = &zei->databaseInfo;
     trec = rec_get (records, 1);      /* get "root" record */
 
@@ -320,8 +343,8 @@ ZebraExplainInfo zebraExplain_open (
 #if ZINFO_DEBUG
        data1_pr_tree (zei->dh, zei->data1_target, stderr);
 #endif
-       node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target->child,
-                                        "targetInfo");
+       node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target,
+                                        "/targetInfo");
        zebraExplain_mergeAccessInfo (zei, node_tgtinfo,
                                      &zei->accessInfo);
 
@@ -395,6 +418,7 @@ ZebraExplainInfo zebraExplain_open (
            np = np->child;
            assert (np && np->which == DATA1N_data);
            zei->runNumber = atoi_n (np->u.data.data, np->u.data.len);
+            yaz_log (LOG_DEBUG, "read runnumber = %d", zei->runNumber);
            *zdip = NULL;
        }
        rec_rm (&trec);
@@ -423,14 +447,10 @@ ZebraExplainInfo zebraExplain_open (
                nmem_destroy (zei->nmem);
                return 0;
            }
-            data1_pr_tree (zei->dh, zei->data1_target, stdout);
-            
-           node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target->child,
-                                           "targetInfo");
+           node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target,
+                                             "/targetInfo");
            assert (node_tgtinfo);
 
-            data1_pr_tree (zei->dh, zei->data1_target, stdout);
-
            zebraExplain_initCommonInfo (zei, node_tgtinfo);
            zebraExplain_initAccessInfo (zei, node_tgtinfo);
 
@@ -465,10 +485,8 @@ ZebraExplainInfo zebraExplain_open (
        
            if (zcl->data1_categoryList)
            {
-               assert (zcl->data1_categoryList->child);
-               node_cl = data1_search_tag (zei->dh,
-                                           zcl->data1_categoryList->child,
-                                           "categoryList");
+               node_cl = data1_search_tag (zei->dh, zcl->data1_categoryList,
+                                           "/categoryList");
                assert (node_cl);
                zebraExplain_initCommonInfo (zei, node_cl);
            }
@@ -489,8 +507,8 @@ static void zebraExplain_readAttributeDetails (ZebraExplainInfo zei,
 
     zad->data1_tree = read_sgml_rec (zei->dh, zei->nmem, rec);
 
-    node_adinfo = data1_search_tag (zei->dh, zad->data1_tree->child,
-                                   "attributeDetails");
+    node_adinfo = data1_search_tag (zei->dh, zad->data1_tree,
+                                   "/attributeDetails");
     node_zebra = data1_search_tag (zei->dh, node_adinfo->child,
                                 "zebraInfo");
     node_list = data1_search_tag (zei->dh, node_zebra->child,
@@ -554,8 +572,9 @@ static void zebraExplain_readDatabase (ZebraExplainInfo zei,
 
     zdi->data1_database = read_sgml_rec (zei->dh, zei->nmem, rec);
     
-    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database->child,
-                                  "databaseInfo");
+    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database,
+                                    "/databaseInfo");
+    assert (node_dbinfo);
     zebraExplain_mergeAccessInfo (zei, node_dbinfo, &zdi->accessInfo);
 
     node_zebra = data1_search_tag (zei->dh, node_dbinfo->child,
@@ -623,7 +642,7 @@ int zebraExplain_curDatabase (ZebraExplainInfo zei, const char *database)
 
 static void zebraExplain_initCommonInfo (ZebraExplainInfo zei, data1_node *n)
 {
-    data1_node *c = data1_mk_tag (zei->dh, zei->nmem, "commonInfo", n);
+    data1_node *c = data1_mk_tag (zei->dh, zei->nmem, "commonInfo", 0, n);
     data1_mk_tag_data_text (zei->dh, c, "dateAdded", zei->date, zei->nmem);
     data1_mk_tag_data_text (zei->dh, c, "dateChanged", zei->date, zei->nmem);
     data1_mk_tag_data_text (zei->dh, c, "languageCode", "EN", zei->nmem);
@@ -633,13 +652,14 @@ static void zebraExplain_updateCommonInfo (ZebraExplainInfo zei, data1_node *n)
 {
     data1_node *c = data1_search_tag (zei->dh, n->child, "commonInfo");
     assert (c);
-    data1_mk_tag_data_text (zei->dh, c, "dateChanged", zei->date, zei->nmem);
+    data1_mk_tag_data_text_uni (zei->dh, c, "dateChanged", zei->date,
+                                zei->nmem);
 }
 
 static void zebraExplain_initAccessInfo (ZebraExplainInfo zei, data1_node *n)
 {
-    data1_node *c = data1_mk_tag (zei->dh, zei->nmem, "accessInfo", n);
-    data1_node *d = data1_mk_tag (zei->dh, zei->nmem, "unitSystems", c);
+    data1_node *c = data1_mk_tag (zei->dh, zei->nmem, "accessInfo", 0, n);
+    data1_node *d = data1_mk_tag (zei->dh, zei->nmem, "unitSystems", 0, c);
     data1_mk_tag_data_text (zei->dh, d, "string", "ISO", zei->nmem);
 }
 
@@ -715,9 +735,9 @@ int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database,
                         "</></>\n");
     if (!zdi->data1_database)
        return -2;
-    
-    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database->child,
-                                  "databaseInfo");
+
+    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database,
+                                    "/databaseInfo");
     assert (node_dbinfo);
 
     zebraExplain_initCommonInfo (zei, node_dbinfo);
@@ -754,9 +774,8 @@ int zebraExplain_newDatabase (ZebraExplainInfo zei, const char *database,
                         "<explain><attributeDetails>AttributeDetails\n"
                         "</></>\n");
 
-    node_adinfo =
-       data1_search_tag (zei->dh, zdi->attributeDetails->data1_tree->child,
-                         "attributeDetails");
+    node_adinfo = data1_search_tag (zei->dh, zdi->attributeDetails->data1_tree,
+                                    "/attributeDetails");
     assert (node_adinfo);
 
     zebraExplain_initCommonInfo (zei, node_adinfo);
@@ -781,9 +800,9 @@ static void writeAttributeValueDetails (ZebraExplainInfo zei,
        if (set_ordinal != zsui->info.set)
            continue;
        node_attvalue = data1_mk_tag (zei->dh, zei->nmem, "attributeValue",
-                                      node_atvs);
+                                      0 /* attr */, node_atvs);
        node_value = data1_mk_tag (zei->dh, zei->nmem, "value",
-                                   node_attvalue);
+                                   0 /* attr */, node_attvalue);
        data1_mk_tag_data_int (zei->dh, node_value, "numeric",
                               zsui->info.use, zei->nmem);
     }
@@ -818,17 +837,18 @@ static void zebraExplain_writeCategoryList (ZebraExplainInfo zei,
 #endif
 
     drec = createRecord (zei->records, &sysno);
-
-    node_ci = data1_search_tag (zei->dh, node_categoryList->child,
-                               "categoryList");
+    
+    node_ci = data1_search_tag (zei->dh, node_categoryList,
+                               "/categoryList");
     assert (node_ci);
-    node_ci = data1_mk_tag (zei->dh, zei->nmem, "categories", node_ci);
+    node_ci = data1_mk_tag (zei->dh, zei->nmem, "categories", 0 /* attr */,
+                            node_ci);
     assert (node_ci);
     
     for (i = 0; category[i]; i++)
     {
-       data1_node *node_cat = data1_mk_tag (zei->dh, zei->nmem, 
-                                             "category", node_ci);
+       data1_node *node_cat = data1_mk_tag (zei->dh, zei->nmem,  "category",
+                                             0 /* attr */, node_ci);
 
        data1_mk_tag_data_text (zei->dh, node_cat, "name",
                                category[i], zei->nmem);
@@ -872,8 +892,9 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
 
     drec = createRecord (zei->records, &zad->sysno);
     assert (zad->data1_tree);
-    node_adinfo = data1_search_tag (zei->dh, zad->data1_tree->child,
-                                  "attributeDetails");
+
+    node_adinfo = data1_search_tag (zei->dh, zad->data1_tree,
+                                  "/attributeDetails");
     zebraExplain_updateCommonInfo (zei, node_adinfo);
 
     data1_mk_tag_data_text (zei->dh, node_adinfo, "name",
@@ -902,7 +923,8 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
            break;
        set_min = set_ordinal;
        node_asd = data1_mk_tag (zei->dh, zei->nmem,
-                                 "attributeSetDetails", node_attributesBySet);
+                                 "attributeSetDetails",
+                                 0 /* attr */, node_attributesBySet);
 
        attset = data1_attset_search_id (zei->dh, set_ordinal);
        if (!attset)
@@ -926,13 +948,16 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
                                       oid, zei->nmem);
                
                node_abt = data1_mk_tag (zei->dh, zei->nmem,
-                                         "attributesByType", node_asd);
+                                         "attributesByType",
+                                         0 /*attr */, node_asd);
                node_atd = data1_mk_tag (zei->dh, zei->nmem,
-                                         "attributeTypeDetails", node_abt);
+                                         "attributeTypeDetails", 
+                                         0 /* attr */, node_abt);
                data1_mk_tag_data_int (zei->dh, node_atd,
                                       "type", 1, zei->nmem);
                node_atvs = data1_mk_tag (zei->dh, zei->nmem, 
-                                          "attributeValues", node_atd);
+                                          "attributeValues",
+                                          0 /* attr */, node_atd);
                writeAttributeValueDetails (zei, zad, node_atvs, attset);
            }
        }
@@ -948,7 +973,8 @@ static void zebraExplain_writeAttributeDetails (ZebraExplainInfo zei,
        int oid[OID_SIZE];
        data1_node *node_attr;
        
-       node_attr = data1_mk_tag (zei->dh, zei->nmem, "attr", node_list);
+       node_attr = data1_mk_tag (zei->dh, zei->nmem, "attr", 0 /* attr */,
+                                  node_list);
        
        oident.proto = PROTO_Z3950;
        oident.oclass = CLASS_ATTSET;
@@ -993,9 +1019,11 @@ static void zebraExplain_writeDatabase (ZebraExplainInfo zei,
 #endif
     drec = createRecord (zei->records, &zdi->sysno);
     assert (zdi->data1_database);
-    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database->child,
-                                  "databaseInfo");
 
+    node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database,
+                                    "/databaseInfo");
+
+    assert (node_dbinfo);
     zebraExplain_updateCommonInfo (zei, node_dbinfo);
     zebraExplain_updateAccessInfo (zei, node_dbinfo, zdi->accessInfo);
 
@@ -1044,10 +1072,11 @@ static void writeAttributeValues (ZebraExplainInfo zei,
        data1_node *node_value;
        
        node_value = data1_mk_tag (zei->dh, zei->nmem, "attributeValue",
-                                   node_values);
+                                   0 /* attr */, node_values);
        data1_mk_tag_data_text (zei->dh, node_value, "name",
                                atts->name, zei->nmem);
-        node_value = data1_mk_tag (zei->dh, zei->nmem, "value", node_value);
+        node_value = data1_mk_tag (zei->dh, zei->nmem, "value",
+                                   0 /* attr */, node_value);
        data1_mk_tag_data_int (zei->dh, node_value, "numeric",
                               atts->value, zei->nmem);
     }
@@ -1080,9 +1109,10 @@ static void zebraExplain_writeAttributeSet (ZebraExplainInfo zei,
                         "<explain><attributeSetInfo>AttributeSetInfo\n"
                         "</></>\n" );
 
-    node_attinfo = data1_search_tag (zei->dh, node_root->child,
-                                  "attributeSetInfo");
+    node_attinfo = data1_search_tag (zei->dh, node_root,
+                                  "/attributeSetInfo");
 
+    assert (node_attinfo);
     zebraExplain_initCommonInfo (zei, node_attinfo);
     zebraExplain_updateCommonInfo (zei, node_attinfo);
 
@@ -1103,7 +1133,7 @@ static void zebraExplain_writeAttributeSet (ZebraExplainInfo zei,
     data1_mk_tag_data_int (zei->dh, node_atttype,
                           "type", 1, zei->nmem);
     node_values = data1_mk_tag (zei->dh, zei->nmem,
-                                "attributeValues", node_atttype);
+                                "attributeValues", 0 /* attr */, node_atttype);
     if (attset)
        writeAttributeValues (zei, node_values, attset);
 
@@ -1138,8 +1168,8 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush)
     trec = rec_get (zei->records, 1);
     xfree (trec->info[recInfo_storeData]);
 
-    node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target->child,
-                                  "targetInfo");
+    node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target,
+                                     "/targetInfo");
     assert (node_tgtinfo);
 
     zebraExplain_updateCommonInfo (zei, node_tgtinfo);
@@ -1154,12 +1184,12 @@ static void zebraExplain_writeTarget (ZebraExplainInfo zei, int key_flush)
     data1_mk_tag_data_text (zei->dh, node_zebra, "version",
                               ZEBRAVER, zei->nmem);
     node_list = data1_mk_tag (zei->dh, zei->nmem,
-                              "databaseList", node_zebra);
+                              "databaseList", 0 /* attr */, node_zebra);
     for (zdi = zei->databaseInfo; zdi; zdi = zdi->next)
     {
        data1_node *node_db;
        node_db = data1_mk_tag (zei->dh, zei->nmem,
-                                "database", node_list);
+                                "database", 0 /* attr */, node_list);
        data1_mk_tag_data_text (zei->dh, node_db, "name",
                                 zdi->databaseName, zei->nmem);
        data1_mk_tag_data_int (zei->dh, node_db, "id",
@@ -1307,7 +1337,10 @@ void zebraExplain_recordCountIncrement (ZebraExplainInfo zei, int adjust_num)
 int zebraExplain_runNumberIncrement (ZebraExplainInfo zei, int adjust_num)
 {
     if (adjust_num)
+    {
        zei->dirty = 1;
+        yaz_log (LOG_LOG, "zinfo run number=%d", zei->runNumber+adjust_num);
+    }
     return zei->runNumber += adjust_num;
 }