void normalize_cache_destroy(normalize_cache_t nc) { if (nc) { struct cached_item *ci = nc->items; for (; ci; ci = ci->next) normalize_record_destroy(ci->nt); yaz_mutex_destroy(&nc->mutex); nmem_destroy(nc->nmem); } }
normalize_record_t normalize_record_create(struct conf_service *service, const char *spec) { NMEM nmem = nmem_create(); normalize_record_t nt = nmem_malloc(nmem, sizeof(*nt)); struct normalize_step **m = &nt->steps; int no_errors = 0; int embed = 0; if (*spec == '<') embed = 1; nt->nmem = nmem; if (embed) { xmlDoc *xsp_doc = xmlParseMemory(spec, strlen(spec)); if (!xsp_doc) no_errors++; { *m = nmem_malloc(nt->nmem, sizeof(**m)); (*m)->marcmap = NULL; (*m)->stylesheet = NULL; (*m)->stylesheet2 = NULL; (*m)->stylesheet = xsltParseStylesheetDoc(xsp_doc); if (!(*m)->stylesheet) no_errors++; m = &(*m)->next; } } else { struct conf_config *conf = service->server->config; int i, num; char **stylesheets; nmem_strsplit(nt->nmem, ",", spec, &stylesheets, &num); for (i = 0; i < num; i++) { WRBUF fname = conf_get_fname(conf, stylesheets[i]); *m = nmem_malloc(nt->nmem, sizeof(**m)); (*m)->marcmap = NULL; (*m)->stylesheet = NULL; (*m)->stylesheet2 = service_xslt_get(service, stylesheets[i]); if ((*m)->stylesheet2) ; else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) { if (!((*m)->stylesheet = xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname)))) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", stylesheets[i]); no_errors++; } } else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap")) { if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), nt->nmem))) { yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s", stylesheets[i]); no_errors++; } } else { yaz_log(YLOG_FATAL, "Cannot handle stylesheet: %s", stylesheets[i]); no_errors++; } wrbuf_destroy(fname); m = &(*m)->next; } } *m = 0; /* terminate list of steps */ if (no_errors) { normalize_record_destroy(nt); nt = 0; } return nt; }