+ 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;
+}
+
+int zebraExplain_trav_ord(ZebraExplainInfo zei, void *handle,
+ int (*f)(void *handle, int ord))
+{
+ struct zebDatabaseInfoB *zdb = zei->curDatabaseInfo;
+ if (zdb)
+ {
+ struct zebSUInfoB *zsui = zdb->attributeDetails->SUInfo;
+ for ( ;zsui; zsui = zsui->next)
+ (*f)(handle, zsui->info.ordinal);
+ }
+ return 0;
+}
+
+int zebraExplain_lookup_ord (ZebraExplainInfo zei, int ord,
+ int *index_type,
+ const char **db,
+ int *set, int *use)
+{
+ struct zebDatabaseInfoB *zdb;
+ for (zdb = zei->databaseInfo; zdb; zdb = zdb->next)
+ {
+ struct zebSUInfoB *zsui = zdb->attributeDetails->SUInfo;
+ for ( ;zsui; zsui = zsui->next)
+ if (zsui->info.ordinal == ord)
+ {
+ if (db)
+ *db = zdb->databaseName;
+ if (zsui->info.which == ZEB_SU_SET_USE)
+ {
+ if (set)
+ *set = zsui->info.u.su.set;
+ if (use)
+ *use = zsui->info.u.su.use;
+ }
+ if (index_type)
+ *index_type = zsui->info.index_type;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+zebAccessObject zebraExplain_announceOid (ZebraExplainInfo zei,
+ zebAccessObject *op,
+ Odr_oid *oid)
+{
+ zebAccessObject ao;
+
+ for (ao = *op; ao; ao = ao->next)
+ if (!oid_oidcmp (oid, ao->oid))
+ break;
+ if (!ao)
+ {
+ ao = (zebAccessObject) nmem_malloc (zei->nmem, sizeof(*ao));
+ ao->handle = NULL;
+ ao->sysno = 0;
+ ao->oid = odr_oiddup_nmem (zei->nmem, oid);
+ ao->next = *op;
+ *op = ao;
+ }
+ return ao;
+}
+
+void zebraExplain_addAttributeSet (ZebraExplainInfo zei, int set)
+{
+ oident oe;
+ int oid[OID_SIZE];
+
+ oe.proto = PROTO_Z3950;
+ oe.oclass = CLASS_ATTSET;
+ oe.value = (enum oid_value) set;
+
+ if (oid_ent_to_oid (&oe, oid))
+ {
+ zebraExplain_announceOid (zei, &zei->accessInfo->attributeSetIds, oid);
+ zebraExplain_announceOid (zei, &zei->curDatabaseInfo->
+ accessInfo->attributeSetIds, oid);
+ }
+}
+
+int zebraExplain_add_attr_su(ZebraExplainInfo zei, int index_type,
+ int set, int use)
+{
+ struct zebSUInfoB *zsui;
+
+ assert (zei->curDatabaseInfo);
+ 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.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;