X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcqltransform.c;h=1118dc2a79143ad007d072bad9cdf1dbeee53354;hb=917d2c4a288a19c0da7fa98ad514288d0e045413;hp=0ab90795be25448708e3cad7079cb38fd9343116;hpb=d161ec774d6250a6814918f68559560d5c9db8cc;p=yaz-moved-to-github.git diff --git a/src/cqltransform.c b/src/cqltransform.c index 0ab9079..1118dc2 100644 --- a/src/cqltransform.c +++ b/src/cqltransform.c @@ -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,11 @@ 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 (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 +989,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; }