X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=recctrl%2Frecgrs.c;h=46821bcbe9a5d9501f7904fd9feb31cc54ef9ff1;hb=b7942589b21cca1b6d44c7bf9446dcb6a5942953;hp=d4cf58c716f101af79d22f0825f6ce7bd43d6ba7;hpb=b9093505b17a074e79137ed64595c8269f77d330;p=idzebra-moved-to-github.git diff --git a/recctrl/recgrs.c b/recctrl/recgrs.c index d4cf58c..46821bc 100644 --- a/recctrl/recgrs.c +++ b/recctrl/recgrs.c @@ -4,7 +4,20 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: recgrs.c,v $ - * Revision 1.9 1997-09-17 12:19:21 adam + * Revision 1.13 1997-10-31 12:35:44 adam + * Added a few log statements. + * + * Revision 1.12 1997/10/29 12:02:22 adam + * Using oid_ent_to_oid used instead of the non thread-safe oid_getoidbyent. + * + * Revision 1.11 1997/10/27 14:34:00 adam + * Work on generic character mapping depending on "structure" field + * in abstract syntax file. + * + * Revision 1.10 1997/09/18 08:59:21 adam + * Extra generic handle for the character mapping routines. + * + * Revision 1.9 1997/09/17 12:19:21 adam * Zebra version corresponds to YAZ version 1.4. * Changed Zebra server so that it doesn't depend on global common_resource. * @@ -170,8 +183,8 @@ static void grs_init(void) { } -static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p, - data1_att *att) +static void dumpkeys_incomplete_field(data1_node *n, struct recExtractCtrl *p, + data1_att *att, int reg_type) { const char *b = n->u.data.data; int remain; @@ -179,7 +192,7 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p, remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain); while (map) { @@ -192,7 +205,7 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p, { remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain); else map = 0; } @@ -207,7 +220,7 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p, buf[i++] = *(cp++); remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain); else map = 0; } @@ -215,17 +228,17 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p, return; buf[i] = '\0'; (*p->init)(&wrd); /* set defaults */ - wrd.which = Word_String; + wrd.reg_type = reg_type; wrd.seqno = seqno++; - wrd.u.string = buf; + wrd.string = buf; wrd.attrSet = att->parent->ordinal; wrd.attrUse = att->locals->local; (*p->add)(&wrd); } } -static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p, - data1_att *att) +static void dumpkeys_complete_field(data1_node *n, struct recExtractCtrl *p, + data1_att *att, int reg_type) { const char *b = n->u.data.data; char buf[GRS_MAX_WORD+1]; @@ -235,7 +248,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p, remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input (p->zebra_maps, reg_type, &b, remain); while (remain > 0 && i < GRS_MAX_WORD) { @@ -243,7 +256,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p, { remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain); else map = 0; } @@ -262,7 +275,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p, buf[i++] = *(cp++); remain = n->u.data.len - (b - n->u.data.data); if (remain > 0) - map = (*p->map_chrs_input)(&b, remain); + map = zebra_maps_input (p->zebra_maps, reg_type, &b, remain); else map = 0; } @@ -271,9 +284,10 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p, return; buf[i] = '\0'; (*p->init)(&wrd); - wrd.which = Word_Phrase; + + wrd.reg_type = reg_type; wrd.seqno = seqno++; - wrd.u.string = buf; + wrd.string = buf; wrd.attrSet = att->parent->ordinal; wrd.attrUse = att->locals->local; (*p->add)(&wrd); @@ -328,6 +342,7 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level) { data1_node *par = get_parent_tag(p->dh, n); data1_termlist *tlist = 0; + data1_datatype dtype = DATA1K_string; if (p->flagShowRecords) { @@ -350,40 +365,30 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level) */ while (!par->u.tag.element) - if (!par->parent || !(par = get_parent_tag(p->dh, par->parent))) + if (!par->parent || !(par=get_parent_tag(p->dh, par->parent))) break; - if (!par) - tlist = 0; - else if (par->u.tag.element->termlists) - tlist = par->u.tag.element->termlists; - else + if (!par || !(tlist = par->u.tag.element->termlists)) continue; - + if (par->u.tag.element->tag) + dtype = par->u.tag.element->tag->kind; for (; tlist; tlist = tlist->next) { if (p->flagShowRecords) { - printf("%*sIdx: [", (level + 1) * 4, ""); - switch (tlist->structure) - { - case DATA1S_word: printf("w"); break; - case DATA1S_phrase: printf("p"); break; - default: printf("?"); break; - } - printf("] "); - printf("%s:%s [%d]\n", tlist->att->parent->name, - tlist->att->name, tlist->att->value); - } - else switch (tlist->structure) - { - case DATA1S_word: - dumpkeys_word(n, p, tlist->att); break; - case DATA1S_phrase: - dumpkeys_phrase(n, p, tlist->att); break; - default: - logf(LOG_FATAL, "Bad structure type in dumpkeys"); - abort(); + printf("%*sIdx: [%s]", (level + 1) * 4, "", + tlist->structure); + printf("%s:%s [%d]\n", + tlist->att->parent->name, + tlist->att->name, tlist->att->value); } + else + if (zebra_maps_is_complete (p->zebra_maps, + *tlist->structure)) + dumpkeys_complete_field(n, p, tlist->att, + *tlist->structure); + else + dumpkeys_incomplete_field(n, p, tlist->att, + *tlist->structure); } } if (p->flagShowRecords && n->which == DATA1N_root) @@ -397,10 +402,11 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level) static int grs_extract(struct recExtractCtrl *p) { data1_node *n; - NMEM mem = nmem_create(); + NMEM mem; struct grs_read_info gri; seqno = 0; + mem = nmem_create (); gri.readf = p->readf; gri.seekf = p->seekf; gri.tellf = p->tellf; @@ -497,9 +503,10 @@ static int grs_retrieve(struct recRetrieveCtrl *p) data1_node *new; data1_maptab *map; int res, selected = 0; - NMEM mem = nmem_create(); + NMEM mem; struct grs_read_info gri; + mem = nmem_create(); gri.readf = p->readf; gri.seekf = p->seekf; gri.tellf = p->tellf; @@ -509,41 +516,47 @@ static int grs_retrieve(struct recRetrieveCtrl *p) gri.mem = mem; gri.dh = p->dh; + logf (LOG_DEBUG, "grs_retrieve"); node = read_grs_type (&gri, p->subType); if (!node) { p->diagnostic = 2; + nmem_destroy (mem); return 0; } + logf (LOG_DEBUG, "grs_retrieve: score"); if (p->score >= 0 && (new = data1_insert_taggeddata(p->dh, node, node, "rank", mem))) { new->u.data.what = DATA1I_num; - new->u.data.data = new->u.data.lbuf; + new->u.data.data = new->lbuf; sprintf(new->u.data.data, "%d", p->score); new->u.data.len = strlen(new->u.data.data); } + logf (LOG_DEBUG, "grs_retrieve: localControlNumber"); if ((new = data1_insert_taggeddata(p->dh, node, node, "localControlNumber", mem))) { new->u.data.what = DATA1I_text; - new->u.data.data = new->u.data.lbuf; + new->u.data.data = new->lbuf; sprintf(new->u.data.data, "%d", p->localno); new->u.data.len = strlen(new->u.data.data); } + logf (LOG_DEBUG, "grs_retrieve: schemaIdentifier"); if (p->input_format == VAL_GRS1 && node->u.root.absyn && node->u.root.absyn->reference != VAL_NONE) { 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_getoidbyent(&oe))) + if ((oid = oid_ent_to_oid (&oe, oidtmp))) { char tmp[128]; data1_handle dh = p->dh; @@ -570,6 +583,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p) } } + logf (LOG_DEBUG, "grs_retrieve: schema mapping"); /* * Does the requested format match a known schema-mapping? (this reflects * the overlap of schema and formatting which is inherent in the MARC @@ -584,12 +598,13 @@ static int grs_retrieve(struct recRetrieveCtrl *p) if (!(node = data1_map_record(p->dh, onode, map, mem))) { p->diagnostic = 14; + nmem_destroy (mem); return 0; } - break; } + logf (LOG_DEBUG, "grs_retrieve: element spec"); if (p->comp && (res = process_comp(p->dh, node, p->comp)) > 0) { p->diagnostic = res; @@ -602,6 +617,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p) else if (p->comp && !res) selected = 1; + logf (LOG_DEBUG, "grs_retrieve: transfer syntax mapping"); switch (p->output_format = (p->input_format != VAL_NONE ? p->input_format : VAL_SUTRS)) {