X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Frecgrs.c;h=3137760ddd9648d4bb898d03df9d78b18bf9bd29;hb=27a6d4f7f7425896345ab5a2bfdf35a96c97416e;hp=e9283c948514c7ae0c2db86ad56ca8425c07d1f2;hpb=b092477356ed4849f27e0f761af0af4af9539517;p=idzebra-moved-to-github.git diff --git a/index/recgrs.c b/index/recgrs.c index e9283c9..3137760 100644 --- a/index/recgrs.c +++ b/index/recgrs.c @@ -1,5 +1,5 @@ -/* $Id: recgrs.c,v 1.10 2006-11-29 18:06:57 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: recgrs.c,v 1.16 2007-03-07 21:08:36 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#include #include #include @@ -295,8 +296,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p) res = 0; /* looking for the attribute with a specified name */ for (attr = n->u.tag.attributes; attr; attr = attr->next) { - yaz_log(YLOG_DEBUG," - attribute %s <-> %s", attname, attr->name ); - if (!strcmp(attr->name, attname)) { if (p->u.relation.op[0]) { if (*p->u.relation.op != '=') { @@ -305,8 +304,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p) yaz_log(YLOG_WARN, "predicate %s ignored", p->u.relation.name); res = 1; break; } else { - yaz_log(YLOG_DEBUG," - value %s <-> %s", - p->u.relation.value, attr->value ); if (!strcmp(attr->value, p->u.relation.value)) { res = 1; break; } @@ -317,7 +314,6 @@ int d1_check_xpath_predicate(data1_node *n, struct xpath_predicate *p) } } } - yaz_log(YLOG_DEBUG, "return %d", res); return res; } else { return 1; @@ -436,12 +432,8 @@ data1_termlist *xpath_termlist_by_tagpath(char *tagpath, data1_node *n) backwards trough xpath location steps ... */ for (i = xpe->xpath_len - 1; i>0; i--) { - yaz_log(YLOG_DEBUG, "Checking step %d: %s on tag %s", - i, xp[i].part, nn->u.tag.tag); - if (!d1_check_xpath_predicate(nn, xp[i].predicate)) { - yaz_log(YLOG_DEBUG, " Predicates didn't match"); ok = 0; break; } @@ -545,7 +537,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n, char tag_path_full[1024]; int termlist_only = 1; data1_termlist *tl; - int xpdone = 0; + if (!n->root->u.root.absyn || n->root->u.root.absyn->xpath_indexing == DATA1_XPATH_INDEXING_ENABLE) @@ -553,12 +545,12 @@ static void index_xpath(struct source_parser *sp, data1_node *n, termlist_only = 0; } + switch (n->which) { case DATA1N_data: wrd->term_buf = n->u.data.data; wrd->term_len = n->u.data.len; - xpdone = 0; mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n); @@ -593,7 +585,9 @@ static void index_xpath(struct source_parser *sp, data1_node *n, fputc ('\n', stdout); } else + { (*p->tokenAdd)(&wrd_tl); + } if (wrd_tl.seqno > max_seqno) max_seqno = wrd_tl.seqno; } @@ -603,7 +597,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n, } /* xpath indexing is done, if there was no termlist given, or no ! in the termlist, and default indexing is enabled... */ - if (!p->flagShowRecords && !xpdone && !termlist_only) + if (!p->flagShowRecords && !termlist_only) { wrd->index_name = xpath_index; wrd->index_type = 'w'; @@ -611,8 +605,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n, } break; case DATA1N_tag: - if (termlist_only) - return; mk_tag_path_full(tag_path_full, sizeof(tag_path_full), n); wrd->index_type = '0'; @@ -632,7 +624,8 @@ static void index_xpath(struct source_parser *sp, data1_node *n, { data1_xattr *xp; - (*p->tokenAdd)(wrd); /* index element pag (AKA tag path) */ + if (!termlist_only) + (*p->tokenAdd)(wrd); /* index element pag (AKA tag path) */ if (xpath_is_start == 1) /* only for the starting tag... */ { @@ -647,35 +640,38 @@ static void index_xpath(struct source_parser *sp, data1_node *n, /* this could be cached as well */ sprintf (attr_tag_path_full, "@%s/%s", xp->name, tag_path_full); - + tll[i] = xpath_termlist_by_tagpath(attr_tag_path_full,n); - /* attribute (no value) */ - wrd->index_type = '0'; - wrd->index_name = ZEBRA_XPATH_ATTR_NAME; - wrd->term_buf = xp->name; - wrd->term_len = strlen(xp->name); - - wrd->seqno--; - (*p->tokenAdd)(wrd); - - if (xp->value - && - strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2) + if (!termlist_only) { - /* attribute value exact */ - strcpy (comb, xp->name); - strcat (comb, "="); - strcat (comb, xp->value); - - wrd->index_name = ZEBRA_XPATH_ATTR_NAME; + /* attribute (no value) */ wrd->index_type = '0'; - wrd->term_buf = comb; - wrd->term_len = strlen(comb); - wrd->seqno--; + wrd->index_name = ZEBRA_XPATH_ATTR_NAME; + wrd->term_buf = xp->name; + wrd->term_len = strlen(xp->name); + wrd->seqno--; (*p->tokenAdd)(wrd); - } + + if (xp->value + && + strlen(xp->name) + strlen(xp->value) < sizeof(comb)-2) + { + /* attribute value exact */ + strcpy (comb, xp->name); + strcat (comb, "="); + strcat (comb, xp->value); + + wrd->index_name = ZEBRA_XPATH_ATTR_NAME; + wrd->index_type = '0'; + wrd->term_buf = comb; + wrd->term_len = strlen(comb); + wrd->seqno--; + + (*p->tokenAdd)(wrd); + } + } i++; } @@ -687,7 +683,6 @@ static void index_xpath(struct source_parser *sp, data1_node *n, sprintf (attr_tag_path_full, "@%s/%s", xp->name, tag_path_full); - if ((tl = tll[i])) { /* If there is a termlist given (=xelm directive) */ @@ -716,7 +711,7 @@ static void index_xpath(struct source_parser *sp, data1_node *n, /* if there was no termlist for the given path, or the termlist didn't have a ! element, index the attribute as "w" */ - if ((!xpdone) && (!termlist_only)) + if (!xpdone && !termlist_only) { index_xpath_attr (attr_tag_path_full, xp->name, xp->value, "w", p, wrd); @@ -1119,7 +1114,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p, node = (*grs_read)(&gri); if (!node) { - p->diagnostic = 14; + p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; nmem_destroy (mem); return 0; } @@ -1195,7 +1190,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p, onode = node; if (!(node = data1_map_record(p->dh, onode, map, mem))) { - p->diagnostic = 14; + p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; nmem_destroy (mem); return 0; } @@ -1224,7 +1219,7 @@ int zebra_grs_retrieve(void *clientData, struct recRetrieveCtrl *p, onode = node; if (!(node = data1_map_record(p->dh, onode, map, mem))) { - p->diagnostic = 14; + p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; nmem_destroy (mem); return 0; }