Avoid using non-portable debian.h
[yaz-moved-to-github.git] / src / cqltransform.c
index 0ab9079..415a6cf 100644 (file)
@@ -44,7 +44,7 @@ struct cql_transform_t_ {
     struct cql_prop_entry *entry;
     yaz_tok_cfg_t tok_cfg;
     int error;
-    char *addinfo;
+    WRBUF addinfo;
     NMEM nmem;
 };
 
@@ -54,7 +54,7 @@ cql_transform_t cql_transform_create(void)
     cql_transform_t ct = (cql_transform_t) xmalloc(sizeof(*ct));
     ct->tok_cfg = yaz_tok_cfg_create();
     ct->error = 0;
-    ct->addinfo = 0;
+    ct->addinfo = wrbuf_alloc();
     ct->entry = 0;
     ct->nmem = nmem_create();
     return ct;
@@ -191,9 +191,8 @@ static int cql_transform_parse_tok_line(cql_transform_t ct,
         {
             ODR pr = odr_createmem(ODR_PRINT);
             Z_AttributeList *alp = &(*pp)->attr_list;
-            odr_setprint(pr, yaz_log_file());
+            odr_setprint_noclose(pr, yaz_log_file());
             z_AttributeList(pr, &alp, 0, 0);
-            odr_setprint(pr, 0);
             odr_destroy(pr);
         }
     }
@@ -267,7 +266,7 @@ void cql_transform_close(cql_transform_t ct)
         xfree(pe);
         pe = pe_next;
     }
-    xfree(ct->addinfo);
+    wrbuf_destroy(ct->addinfo);
     yaz_tok_cfg_destroy(ct->tok_cfg);
     nmem_destroy(ct->nmem);
     xfree(ct);
@@ -340,9 +339,13 @@ const char *cql_lookup_reverse(cql_transform_t ct,
                 for (j = 0; j < attributes->num_attributes; j++)
                 {
                     /* actual attribute */
-                    Z_AttributeElement *a_ae = attributes->attributes[j];
-                    int r = compare_attr(e_ae, a_ae);
-                    if (r == 0)
+                    Z_AttributeElement a_ae = *attributes->attributes[j];
+                    if (!compare_attr(e_ae, &a_ae))
+                        break;
+                    if (a_ae.attributeSet && &e_ae->attributeSet &&
+                        !oid_oidcmp(a_ae.attributeSet, yaz_oid_attset_bib_1))
+                        a_ae.attributeSet = 0;
+                    if (!compare_attr(e_ae, &a_ae))
                         break;
                 }
                 if (j == attributes->num_attributes)
@@ -988,14 +991,15 @@ int cql_transform_buf(cql_transform_t ct, struct cql_node *cn,
 
 int cql_transform_error(cql_transform_t ct, const char **addinfo)
 {
-    *addinfo = ct->addinfo;
+    *addinfo = wrbuf_len(ct->addinfo) ? wrbuf_cstr(ct->addinfo) : 0;
     return ct->error;
 }
 
 void cql_transform_set_error(cql_transform_t ct, int error, const char *addinfo)
 {
-    xfree(ct->addinfo);
-    ct->addinfo = addinfo ? xstrdup(addinfo) : 0;
+    wrbuf_rewind(ct->addinfo);
+    if (addinfo)
+        wrbuf_puts(ct->addinfo, addinfo);
     ct->error = error;
 }