/*
- * Copyright (C) 1994-1998, Index Data I/S
+ * Copyright (C) 1994-1999, Index Data
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: recgrs.c,v $
- * Revision 1.16 1998-01-29 13:38:17 adam
+ * Revision 1.26 1999-03-02 16:15:44 quinn
+ * Added "tagsysno" and "tagrank" directives to zebra.cfg.
+ *
+ * Revision 1.25 1999/02/18 15:01:26 adam
+ * Minor changes.
+ *
+ * Revision 1.24 1999/02/02 14:51:28 adam
+ * Updated WIN32 code specific sections. Changed header.
+ *
+ * Revision 1.23 1998/10/18 07:51:10 adam
+ * Changed one logf call.
+ *
+ * Revision 1.22 1998/10/16 08:14:37 adam
+ * Updated record control system.
+ *
+ * Revision 1.21 1998/07/01 09:16:10 adam
+ * Element localno only added when it's greater than 0.
+ *
+ * Revision 1.20 1998/05/20 10:12:26 adam
+ * Implemented automatic EXPLAIN database maintenance.
+ * Modified Zebra to work with ASN.1 compiled version of YAZ.
+ *
+ * Revision 1.19 1998/03/11 11:19:05 adam
+ * Changed the way sequence numbers are generated.
+ *
+ * Revision 1.18 1998/03/05 08:41:31 adam
+ * Minor changes.
+ *
+ * Revision 1.17 1998/02/10 12:03:06 adam
+ * Implemented Sort.
+ *
+ * Revision 1.16 1998/01/29 13:38:17 adam
* Fixed problem with mapping to record with unknown schema.
*
* Revision 1.15 1998/01/26 10:37:57 adam
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
-#ifndef WINDOWS
+#ifndef WIN32
#include <unistd.h>
#endif
#include <oid.h>
#include <recctrl.h>
-#include <charmap.h>
#include "grsread.h"
#define GRS_MAX_WORD 512
-static int seqno = 0;
-
static data1_node *read_grs_type (struct grs_read_info *p, const char *type)
{
static struct {
return NULL;
}
-static void grs_init(void)
+static void grs_init(RecType recType)
{
}
-static void dumpkeys_incomplete_field(data1_node *n, struct recExtractCtrl *p,
- data1_att *att, int reg_type)
+static void grs_destroy(RecType recType)
{
- const char *b = n->u.data.data;
- int remain;
- const char **map = 0;
-
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain);
-
- while (map)
- {
- RecWord wrd;
- char buf[GRS_MAX_WORD+1];
- int i, remain;
-
- /* Skip spaces */
- while (map && *map && **map == *CHR_SPACE)
- {
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain);
- else
- map = 0;
- }
- if (!map)
- break;
- i = 0;
- while (map && *map && **map != *CHR_SPACE)
- {
- const char *cp = *map;
-
- while (i < GRS_MAX_WORD && *cp)
- buf[i++] = *(cp++);
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain);
- else
- map = 0;
- }
- if (!i)
- return;
- buf[i] = '\0';
- (*p->init)(&wrd); /* set defaults */
- wrd.reg_type = reg_type;
- wrd.seqno = seqno++;
- wrd.string = buf;
- wrd.attrSet = att->parent->ordinal;
- wrd.attrUse = att->locals->local;
- (*p->add)(&wrd);
- }
-}
-
-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];
- const char **map = 0;
- RecWord wrd;
- int i = 0, remain;
-
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input (p->zebra_maps, reg_type, &b, remain);
-
- while (remain > 0 && i < GRS_MAX_WORD)
- {
- while (map && *map && **map == *CHR_SPACE)
- {
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input(p->zebra_maps, reg_type, &b, remain);
- else
- map = 0;
- }
- if (!map)
- break;
-
- if (i && i < GRS_MAX_WORD)
- buf[i++] = *CHR_SPACE;
- while (map && *map && **map != *CHR_SPACE)
- {
- const char *cp = *map;
-
- if (i >= GRS_MAX_WORD)
- break;
- while (i < GRS_MAX_WORD && *cp)
- buf[i++] = *(cp++);
- remain = n->u.data.len - (b - n->u.data.data);
- if (remain > 0)
- map = zebra_maps_input (p->zebra_maps, reg_type, &b, remain);
- else
- map = 0;
- }
- }
- if (!i)
- return;
- buf[i] = '\0';
- (*p->init)(&wrd);
-
- wrd.reg_type = reg_type;
- wrd.seqno = seqno++;
- wrd.string = buf;
- wrd.attrSet = att->parent->ordinal;
- wrd.attrUse = att->locals->local;
- (*p->add)(&wrd);
}
static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
{
+ RecWord wrd;
+ (*p->init)(p, &wrd); /* set defaults */
for (; n; n = n->next)
{
if (p->flagShowRecords) /* display element description to user */
{
printf("%*s", level * 4, "");
printf("Data: ");
- if (n->u.data.len > 20)
- printf("'%.20s...'\n", n->u.data.data);
+ if (n->u.data.len > 32)
+ printf("'%.24s ... %.6s'\n", n->u.data.data,
+ n->u.data.data + n->u.data.len-6);
else if (n->u.data.len > 0)
printf("'%.*s'\n", n->u.data.len, n->u.data.data);
else
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);
+ {
+ wrd.reg_type = *tlist->structure;
+ wrd.string = n->u.data.data;
+ wrd.length = n->u.data.len;
+ wrd.attrSet = (int) (tlist->att->parent->reference);
+ wrd.attrUse = tlist->att->locals->local;
+ (*p->addWord)(&wrd);
+ }
}
}
if (p->flagShowRecords && n->which == DATA1N_root)
return 0;
}
+int grs_extract_tree(struct recExtractCtrl *p, data1_node *n)
+{
+ oident oe;
+ int oidtmp[OID_SIZE];
+
+ oe.proto = PROTO_Z3950;
+ oe.oclass = CLASS_SCHEMA;
+ oe.value = n->u.root.absyn->reference;
+
+ if ((oid_ent_to_oid (&oe, oidtmp)))
+ (*p->addSchema)(p, oidtmp);
+
+ return dumpkeys(n, p, 0);
+}
+
static int grs_extract(struct recExtractCtrl *p)
{
data1_node *n;
NMEM mem;
struct grs_read_info gri;
- seqno = 0;
+ oident oe;
+ int oidtmp[OID_SIZE];
mem = nmem_create ();
gri.readf = p->readf;
n = read_grs_type (&gri, p->subType);
if (!n)
return -1;
+
+ oe.proto = PROTO_Z3950;
+ oe.oclass = CLASS_SCHEMA;
+ oe.value = n->u.root.absyn->reference;
+ if ((oid_ent_to_oid (&oe, oidtmp)))
+ (*p->addSchema)(p, oidtmp);
+
if (dumpkeys(n, p, 0) < 0)
{
data1_free_tree(p->dh, n);
}
if (espec)
{
- logf (LOG_LOG, "Element: Espec-1 match");
+ logf (LOG_DEBUG, "Element: Espec-1 match");
return data1_doespec1(dh, n, espec);
}
else
static int grs_retrieve(struct recRetrieveCtrl *p)
{
data1_node *node = 0, *onode = 0;
- data1_node *new;
+ data1_node *dnew;
data1_maptab *map;
int res, selected = 0;
NMEM mem;
struct grs_read_info gri;
+ char *tagname;
mem = nmem_create();
gri.readf = p->readf;
nmem_destroy (mem);
return 0;
}
- logf (LOG_DEBUG, "grs_retrieve: score");
- if (p->score >= 0 && (new =
+ logf (LOG_DEBUG, "grs_retrieve: size");
+ if ((dnew = data1_insert_taggeddata(p->dh, node, node,
+ "size", 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 = res_get_def(p->res, "tagrank", "rank");
+ if (strcmp(tagname, "0") && p->score >= 0 && (dnew =
data1_insert_taggeddata(p->dh, node,
- node, "rank",
+ node, tagname,
mem)))
{
- new->u.data.what = DATA1I_num;
- 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: %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);
}
- logf (LOG_DEBUG, "grs_retrieve: localControlNumber");
- if ((new = data1_insert_taggeddata(p->dh, node, node,
- "localControlNumber", mem)))
+
+ tagname = res_get_def(p->res, "tagsysno", "localControlNumber");
+ if (strcmp(tagname, "0") && p->localno > 0 &&
+ (dnew = data1_insert_taggeddata(p->dh, node, node, tagname, mem)))
{
- new->u.data.what = DATA1I_text;
- 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: %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);
}
+
logf (LOG_DEBUG, "grs_retrieve: schemaIdentifier");
if (p->input_format == VAL_GRS1 && node->u.root.absyn &&
node->u.root.absyn->reference != VAL_NONE)
}
*(p++) = '\0';
- if ((new = data1_insert_taggeddata(dh, node, node,
+ if ((dnew = data1_insert_taggeddata(dh, node, node,
"schemaIdentifier", mem)))
{
- new->u.data.what = DATA1I_oid;
- new->u.data.data = nmem_malloc(mem, p - tmp);
- memcpy(new->u.data.data, tmp, p - tmp);
- new->u.data.len = p - tmp;
+ dnew->u.data.what = DATA1I_oid;
+ dnew->u.data.data = nmem_malloc(mem, p - tmp);
+ memcpy(dnew->u.data.data, tmp, p - tmp);
+ dnew->u.data.len = p - tmp;
}
}
}
if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,
(int*)&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,
(int*)&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)
if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node,
selected,
(int*)&p->rec_len)))
- {
p->diagnostic = 238;
- break;
+ 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)
{
"grs",
grs_init,
+ grs_destroy,
grs_extract,
grs_retrieve
};