📄 recgrs.c
字号:
{ yaz_log(LOG_LOG, "Unknown esetname '%s'", c->u.simple->u.generic); return 25; /* invalid esetname */ } yaz_log(LOG_DEBUG, "Esetname '%s' in simple compspec", c->u.simple->u.generic); espec = eset->spec; break; case Z_RecordComp_complex: if (c->u.complex->generic) { /* insert check for schema */ if ((p = c->u.complex->generic->elementSpec)) { switch (p->which) { case Z_ElementSpec_elementSetName: if (!(eset = data1_getesetbyname(dh, n->u.root.absyn, p->u.elementSetName))) { yaz_log(LOG_LOG, "Unknown esetname '%s'", p->u.elementSetName); return 25; /* invalid esetname */ } yaz_log(LOG_DEBUG, "Esetname '%s' in complex compspec", p->u.elementSetName); espec = eset->spec; break; case Z_ElementSpec_externalSpec: if (p->u.externalSpec->which == Z_External_espec1) { yaz_log(LOG_DEBUG, "Got Espec-1"); espec = p->u.externalSpec-> u.espec1; } else { yaz_log(LOG_LOG, "Unknown external espec."); return 25; /* bad. what is proper diagnostic? */ } break; } } } else return 26; /* fix */ } if (espec) { yaz_log(LOG_DEBUG, "Element: Espec-1 match"); return data1_doespec1(dh, n, espec); } else { yaz_log(LOG_DEBUG, "Element: all match"); return -1; }}/* Add Zebra info in separate namespace ... <root ... <metadata xmlns="http://www.indexdata.dk/zebra/"> <size>359</size> <localnumber>447</localnumber> <filename>records/genera.xml</filename> </metadata> </root>*/static void zebra_xml_metadata (struct recRetrieveCtrl *p, data1_node *top, NMEM mem){ const char *idzebra_ns[3]; const char *i2 = "\n "; const char *i4 = "\n "; data1_node *n; idzebra_ns[0] = "xmlns"; idzebra_ns[1] = "http://www.indexdata.dk/zebra/"; idzebra_ns[2] = 0; data1_mk_text (p->dh, mem, i2, top); n = data1_mk_tag (p->dh, mem, "idzebra", idzebra_ns, top); data1_mk_text (p->dh, mem, "\n", top); data1_mk_text (p->dh, mem, i4, n); data1_mk_tag_data_int (p->dh, n, "size", p->recordSize, mem); if (p->score != -1) { data1_mk_text (p->dh, mem, i4, n); data1_mk_tag_data_int (p->dh, n, "score", p->score, mem); } data1_mk_text (p->dh, mem, i4, n); data1_mk_tag_data_int (p->dh, n, "localnumber", p->localno, mem); if (p->fname) { data1_mk_text (p->dh, mem, i4, n); data1_mk_tag_data_text(p->dh, n, "filename", p->fname, mem); } data1_mk_text (p->dh, mem, i2, n);}static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p){ data1_node *node = 0, *onode = 0, *top; data1_node *dnew; data1_maptab *map; int res, selected = 0; NMEM mem; struct grs_read_info gri; const char *tagname; struct grs_handlers *h = (struct grs_handlers *) clientData; int requested_schema = VAL_NONE; data1_marctab *marctab; int dummy; mem = nmem_create(); gri.readf = p->readf; gri.seekf = p->seekf; gri.tellf = p->tellf; gri.endf = NULL; gri.fh = p->fh; gri.offset = 0; gri.mem = mem; gri.dh = p->dh; yaz_log(LOG_DEBUG, "grs_retrieve"); if (read_grs_type (h, &gri, p->subType, &node)) { p->diagnostic = 14; nmem_destroy (mem); return 0; } if (!node) { p->diagnostic = 14; nmem_destroy (mem); return 0; } data1_concat_text(p->dh, mem, node); /* ensure our data1 tree is UTF-8 */ data1_iconv (p->dh, mem, node, "UTF-8", data1_get_encoding(p->dh, node));#if 0 data1_pr_tree (p->dh, node, stdout);#endif top = data1_get_root_tag (p->dh, node); yaz_log(LOG_DEBUG, "grs_retrieve: size"); tagname = data1_systag_lookup(node->u.root.absyn, "size", "size"); if (tagname && (dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem))) { dnew->u.data.what = DATA1I_text; dnew->u.data.data = dnew->lbuf; sprintf(dnew->u.data.data, "%d", p->recordSize); dnew->u.data.len = strlen(dnew->u.data.data); } tagname = data1_systag_lookup(node->u.root.absyn, "rank", "rank"); if (tagname && p->score >= 0 && (dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem))) { yaz_log(LOG_DEBUG, "grs_retrieve: %s", tagname); dnew->u.data.what = DATA1I_num; dnew->u.data.data = dnew->lbuf; sprintf(dnew->u.data.data, "%d", p->score); dnew->u.data.len = strlen(dnew->u.data.data); } tagname = data1_systag_lookup(node->u.root.absyn, "sysno", "localControlNumber"); if (tagname && p->localno > 0 && (dnew = data1_mk_tag_data_wd(p->dh, top, tagname, mem))) { yaz_log(LOG_DEBUG, "grs_retrieve: %s", tagname); dnew->u.data.what = DATA1I_text; dnew->u.data.data = dnew->lbuf; sprintf(dnew->u.data.data, "%d", p->localno); dnew->u.data.len = strlen(dnew->u.data.data); }#if 0 data1_pr_tree (p->dh, node, stdout);#endif#if YAZ_VERSIONL >= 0x010903L if (p->comp && p->comp->which == Z_RecordComp_complex && p->comp->u.complex->generic && p->comp->u.complex->generic->which == Z_Schema_oid && p->comp->u.complex->generic->schema.oid) { oident *oe = oid_getentbyoid (p->comp->u.complex->generic->schema.oid); if (oe) requested_schema = oe->value; }#else if (p->comp && p->comp->which == Z_RecordComp_complex && p->comp->u.complex->generic && p->comp->u.complex->generic->schema) { oident *oe = oid_getentbyoid (p->comp->u.complex->generic->schema); if (oe) requested_schema = oe->value; }#endif /* If schema has been specified, map if possible, then check that * we got the right one */ if (requested_schema != VAL_NONE) { yaz_log(LOG_DEBUG, "grs_retrieve: schema mapping"); for (map = node->u.root.absyn->maptabs; map; map = map->next) { if (map->target_absyn_ref == requested_schema) { onode = node; if (!(node = data1_map_record(p->dh, onode, map, mem))) { p->diagnostic = 14; nmem_destroy (mem); return 0; } break; } } if (node->u.root.absyn && requested_schema != node->u.root.absyn->reference) { p->diagnostic = 238; nmem_destroy (mem); return 0; } } /* * Does the requested format match a known syntax-mapping? (this reflects * the overlap of schema and formatting which is inherent in the MARC * family) */ yaz_log(LOG_DEBUG, "grs_retrieve: syntax mapping"); if (node->u.root.absyn) for (map = node->u.root.absyn->maptabs; map; map = map->next) { if (map->target_absyn_ref == p->input_format) { onode = node; if (!(node = data1_map_record(p->dh, onode, map, mem))) { p->diagnostic = 14; nmem_destroy (mem); return 0; } break; } } yaz_log(LOG_DEBUG, "grs_retrieve: schemaIdentifier"); if (node->u.root.absyn && node->u.root.absyn->reference != VAL_NONE && p->input_format == VAL_GRS1) { oident oe; Odr_oid *oid; int oidtmp[OID_SIZE]; oe.proto = PROTO_Z3950; oe.oclass = CLASS_SCHEMA; oe.value = node->u.root.absyn->reference; if ((oid = oid_ent_to_oid (&oe, oidtmp))) { char tmp[128]; data1_handle dh = p->dh; char *p = tmp; int *ii; for (ii = oid; *ii >= 0; ii++) { if (p != tmp) *(p++) = '.'; sprintf(p, "%d", *ii); p += strlen(p); } if ((dnew = data1_mk_tag_data_wd(dh, top, "schemaIdentifier", mem))) { dnew->u.data.what = DATA1I_oid; dnew->u.data.data = (char *) nmem_malloc(mem, p - tmp); memcpy(dnew->u.data.data, tmp, p - tmp); dnew->u.data.len = p - tmp; } } } yaz_log(LOG_DEBUG, "grs_retrieve: element spec"); if (p->comp && (res = process_comp(p->dh, node, p->comp)) > 0) { p->diagnostic = res; if (onode) data1_free_tree(p->dh, onode); data1_free_tree(p->dh, node); nmem_destroy(mem); return 0; } else if (p->comp && !res) selected = 1;#if 0 data1_pr_tree (p->dh, node, stdout);#endif yaz_log(LOG_DEBUG, "grs_retrieve: transfer syntax mapping"); switch (p->output_format = (p->input_format != VAL_NONE ? p->input_format : VAL_SUTRS)) { case VAL_TEXT_XML: zebra_xml_metadata (p, top, mem);#if 0 data1_pr_tree (p->dh, node, stdout);#endif if (p->encoding) data1_iconv (p->dh, mem, node, p->encoding, "UTF-8"); if (!(p->rec_buf = data1_nodetoidsgml(p->dh, node, selected, &p->rec_len))) p->diagnostic = 238; else { char *new_buf = (char*) odr_malloc (p->odr, p->rec_len); memcpy (new_buf, p->rec_buf, p->rec_len); p->rec_buf = new_buf; } break; case VAL_GRS1: dummy = 0; if (!(p->rec_buf = data1_nodetogr(p->dh, node, selected, p->odr, &dummy))) p->diagnostic = 238; /* not available in requested syntax */ else p->rec_len = (size_t) (-1); break; case VAL_EXPLAIN: if (!(p->rec_buf = data1_nodetoexplain(p->dh, node, selected, p->odr))) p->diagnostic = 238; else p->rec_len = (size_t) (-1); break; case VAL_SUMMARY: if (!(p->rec_buf = data1_nodetosummary(p->dh, node, selected, p->odr))) p->diagnostic = 238; else p->rec_len = (size_t) (-1); break; case VAL_SUTRS: if (p->encoding) data1_iconv (p->dh, mem, node, p->encoding, "UTF-8"); if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected, &p->rec_len))) p->diagnostic = 238; else { char *new_buf = (char*) odr_malloc (p->odr, p->rec_len); memcpy (new_buf, p->rec_buf, p->rec_len); p->rec_buf = new_buf; } break; case VAL_SOIF: if (!(p->rec_buf = data1_nodetosoif(p->dh, node, selected, &p->rec_len))) p->diagnostic = 238; else { char *new_buf = (char*) odr_malloc (p->odr, p->rec_len); memcpy (new_buf, p->rec_buf, p->rec_len); p->rec_buf = new_buf; } break; default: if (!node->u.root.absyn) { p->diagnostic = 238; break; } for (marctab = node->u.root.absyn->marc; marctab; marctab = marctab->next) if (marctab->reference == p->input_format) break; if (!marctab) { p->diagnostic = 238; break; } if (p->encoding) data1_iconv (p->dh, mem, node, p->encoding, "UTF-8"); if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node, selected, &p->rec_len))) p->diagnostic = 238; else { char *new_buf = (char*) odr_malloc (p->odr, p->rec_len); memcpy (new_buf, p->rec_buf, p->rec_len); p->rec_buf = new_buf; } } if (node) data1_free_tree(p->dh, node); if (onode) data1_free_tree(p->dh, onode); nmem_destroy(mem); return 0;}static struct recType grs_type ={ "grs", grs_init, grs_destroy, grs_extract, grs_retrieve};RecType recTypeGrs = &grs_type;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -