+
+ if (!zdi->dirty)
+ return;
+
+ if (zdi->sysno)
+ {
+ drec = rec_get (zei->records, zdi->sysno);
+ xfree (drec->info[recInfo_storeData]);
+ }
+ else
+ {
+ drec = rec_new (zei->records);
+ zdi->sysno = drec->sysno;
+
+ drec->info[recInfo_fileType] =
+ rec_strdup ("grs.sgml", &drec->size[recInfo_fileType]);
+ drec->info[recInfo_databaseName] =
+ rec_strdup ("IR-Explain-1",
+ &drec->size[recInfo_databaseName]);
+ }
+ assert (zdi->data1_database);
+ node_dbinfo = data1_search_tag (zei->dh, zdi->data1_database->child,
+ "databaseInfo");
+ /* record count */
+ node_count = data1_make_tag (zei->dh, node_dbinfo,
+ "recordCount", zei->nmem);
+ data1_add_tagdata_int (zei->dh, node_count, "recordCountActual",
+ zdi->recordCount, zei->nmem);
+
+ /* zebra info (private) */
+ node_zebra = data1_make_tag (zei->dh, node_dbinfo,
+ "zebraInfo", zei->nmem);
+ node_list = data1_make_tag (zei->dh, node_zebra,
+ "attrlist", zei->nmem);
+ for (zsui = zdi->SUInfo; zsui; zsui = zsui->next)
+ {
+ 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);
+ data1_add_tagdata_int (zei->dh, node_attr, "use",
+ zsui->info.use, zei->nmem);
+ data1_add_tagdata_int (zei->dh, node_attr, "ordinal",
+ zsui->info.ordinal, zei->nmem);
+ }
+ data1_add_tagdata_int (zei->dh, node_zebra,
+ "recordBytes", zdi->recordBytes, zei->nmem);
+ /* convert to "SGML" and write it */
+#if ZINFO_DEBUG
+ data1_pr_tree (zei->dh, zdi->data1_database, stderr);
+#endif
+ sgml_buf = data1_nodetoidsgml(zei->dh, zdi->data1_database,
+ 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 trav_attset (data1_handle dh, ZebraExplainInfo zei,
+ data1_attset *p_this)
+{
+ struct zebraExplainAttset *p_reg = zei->attsets;
+
+ if (!p_this)
+ return ;
+ while (p_reg)
+ {
+ if (!strcmp (p_this->name, p_reg->name))
+ break;
+ p_reg = p_reg->next;
+ }
+ if (!p_this)
+ {
+ p_reg = nmem_malloc (zei->nmem, sizeof (*p_reg));
+ p_reg->name = nmem_strdup (zei->nmem, p_this->name);
+ p_reg->ordinal = p_this->ordinal;
+ p_reg->next = zei->attsets;
+ zei->attsets = p_reg;
+ }
+ trav_attset (dh, zei, p_this->children);
+}