+
+ /* parsing backend element */
+
+ el->record_conv = 0; /* OK to have no 'backend' sub content */
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ if (strcmp((const char *) ptr->name, "backend"))
+ {
+ wrbuf_printf(p->wr_error, "Element <retrieval>: expected"
+ " zero or one element <backend>, got <%s>",
+ (const char *) ptr->name);
+ return -1;
+ }
+ else
+ {
+ struct _xmlAttr *attr;
+ if (el->record_conv)
+ {
+ wrbuf_printf(p->wr_error, "Element <retrieval>: "
+ "only one <backend> allowed");
+ yaz_record_conv_destroy(el->record_conv);
+ return -1;
+ }
+ /* parsing attributees */
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!xmlStrcmp(attr->name, BAD_CAST "name")
+ && attr->children
+ && attr->children->type == XML_TEXT_NODE)
+ el->backend_name
+ = nmem_strdup(p->nmem,
+ (const char *) attr->children->content);
+
+ else if (!xmlStrcmp(attr->name, BAD_CAST "syntax")
+ && attr->children
+ && attr->children->type == XML_TEXT_NODE)
+ {
+ el->backend_syntax
+ = yaz_string_to_oid_odr(
+ yaz_oid_std(),
+ CLASS_RECSYN,
+ (const char *) attr->children->content,
+ p->odr);
+ if (!el->backend_syntax)
+ {
+ wrbuf_printf(p->wr_error,
+ "Element <backend syntax='%s'>: "
+ "attribute 'syntax' has invalid "
+ "value '%s'",
+ attr->children->content,
+ attr->children->content);
+ return -1;
+ }
+ }
+ else
+ {
+ wrbuf_printf(p->wr_error, "Element <backend>: expected "
+ "attributes 'syntax' or 'name, got '%s'",
+ attr->name);
+ return -1;
+ }
+ }
+
+ /* parsing internal of record conv */
+ el->record_conv = yaz_record_conv_create();
+
+ yaz_record_conv_set_path(el->record_conv, p->path);
+
+ if (yaz_record_conv_configure_t(el->record_conv, ptr, types))
+ {
+ wrbuf_printf(p->wr_error, "%s",
+ yaz_record_conv_get_error(el->record_conv));
+ yaz_record_conv_destroy(el->record_conv);
+ return -1;
+ }
+ }
+ }
+