/*
- * 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.21 1998-07-01 09:16:10 adam
+ * Revision 1.29 1999-05-26 07:49:14 adam
+ * C++ compilation.
+ *
+ * Revision 1.28 1999/05/21 12:00:17 adam
+ * Better diagnostics for extraction process.
+ *
+ * Revision 1.27 1999/05/20 12:57:18 adam
+ * Implemented TCL filter. Updated recctrl system.
+ *
+ * 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
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
-#ifndef WINDOWS
+#ifndef WIN32
#include <unistd.h>
#endif
#define GRS_MAX_WORD 512
-static data1_node *read_grs_type (struct grs_read_info *p, const char *type)
+struct grs_handler {
+ RecTypeGrs type;
+ void *clientData;
+ int initFlag;
+ struct grs_handler *next;
+};
+
+struct grs_handlers {
+ struct grs_handler *handlers;
+};
+
+static int read_grs_type (struct grs_handlers *h,
+ struct grs_read_info *p, const char *type,
+ data1_node **root)
{
- static struct {
- char *type;
- data1_node *(*func)(struct grs_read_info *p);
- } tab[] = {
- { "sgml", grs_read_sgml },
- { "regx", grs_read_regx },
- { "marc", grs_read_marc },
- { NULL, NULL }
- };
+ struct grs_handler *gh = h->handlers;
const char *cp = strchr (type, '.');
- int i;
if (cp == NULL || cp == type)
{
}
else
strcpy (p->type, cp+1);
- for (i=0; tab[i].type; i++)
+ for (gh = h->handlers; gh; gh = gh->next)
{
- if (!memcmp (type, tab[i].type, cp-type))
- return (tab[i].func)(p);
+ if (!memcmp (type, gh->type->type, cp-type))
+ {
+ if (!gh->initFlag)
+ {
+ gh->initFlag = 1;
+ gh->clientData = (*gh->type->init)();
+ }
+ p->clientData = gh->clientData;
+ *root = (gh->type->read)(p);
+ gh->clientData = p->clientData;
+ return 0;
+ }
}
- return NULL;
+ return 1;
}
-static void grs_init(void)
+static void grs_add_handler (struct grs_handlers *h, RecTypeGrs t)
{
+ struct grs_handler *gh = (struct grs_handler *) malloc (sizeof(*gh));
+ gh->next = h->handlers;
+ h->handlers = gh;
+ gh->initFlag = 0;
+ gh->clientData = 0;
+ gh->type = t;
+}
+
+static void *grs_init(RecType recType)
+{
+ struct grs_handlers *h = (struct grs_handlers *) malloc (sizeof(*h));
+ h->handlers = 0;
+
+ grs_add_handler (h, recTypeGrs_sgml);
+ grs_add_handler (h, recTypeGrs_regx);
+#if HAVE_TCL_H
+ grs_add_handler (h, recTypeGrs_tcl);
+#endif
+ grs_add_handler (h, recTypeGrs_marc);
+ return h;
+}
+
+static void grs_destroy(void *clientData)
+{
+ struct grs_handlers *h = (struct grs_handlers *) clientData;
+ struct grs_handler *gh = h->handlers, *gh_next;
+ while (gh)
+ {
+ gh_next = gh->next;
+ if (gh->initFlag)
+ (*gh->type->destroy)(gh->clientData);
+ free (gh);
+ gh = gh_next;
+ }
+ free (h);
}
static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
return dumpkeys(n, p, 0);
}
-static int grs_extract(struct recExtractCtrl *p)
+static int grs_extract(void *clientData, struct recExtractCtrl *p)
{
data1_node *n;
NMEM mem;
struct grs_read_info gri;
oident oe;
int oidtmp[OID_SIZE];
+ struct grs_handlers *h = (struct grs_handlers *) clientData;
mem = nmem_create ();
gri.readf = p->readf;
gri.mem = mem;
gri.dh = p->dh;
- n = read_grs_type (&gri, p->subType);
+ if (read_grs_type (h, &gri, p->subType, &n))
+ return RECCTRL_EXTRACT_ERROR;
if (!n)
- return -1;
+ return RECCTRL_EXTRACT_EOF;
oe.proto = PROTO_Z3950;
oe.oclass = CLASS_SCHEMA;
if (dumpkeys(n, p, 0) < 0)
{
data1_free_tree(p->dh, n);
- return -2;
+ return RECCTRL_EXTRACT_ERROR;
}
data1_free_tree(p->dh, n);
nmem_destroy(mem);
- return 0;
+ return RECCTRL_EXTRACT_OK;
}
/*
}
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)
+static int grs_retrieve(void *clientData, struct recRetrieveCtrl *p)
{
data1_node *node = 0, *onode = 0;
data1_node *dnew;
int res, selected = 0;
NMEM mem;
struct grs_read_info gri;
+ char *tagname;
+ struct grs_handlers *h = (struct grs_handlers *) clientData;
mem = nmem_create();
gri.readf = p->readf;
gri.dh = p->dh;
logf (LOG_DEBUG, "grs_retrieve");
- node = read_grs_type (&gri, p->subType);
+ if (read_grs_type (h, &gri, p->subType, &node))
+ {
+ p->diagnostic = 14;
+ nmem_destroy (mem);
+ return 0;
+ }
if (!node)
{
p->diagnostic = 14;
dnew->u.data.len = strlen(dnew->u.data.data);
}
- logf (LOG_DEBUG, "grs_retrieve: score");
- if (p->score >= 0 && (dnew =
+ 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)))
{
+ 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 (p->localno > 0 && (dnew = 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)))
{
+ 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);
"schemaIdentifier", mem)))
{
dnew->u.data.what = DATA1I_oid;
- dnew->u.data.data = nmem_malloc(mem, p - tmp);
+ dnew->u.data.data = (char *) nmem_malloc(mem, p - tmp);
memcpy(dnew->u.data.data, tmp, p - tmp);
dnew->u.data.len = p - tmp;
}
p->odr, &dummy)))
p->diagnostic = 238; /* not available in requested syntax */
else
- p->rec_len = -1;
+ 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 = -1;
+ 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 = -1;
+ p->rec_len = (size_t) (-1);
break;
case VAL_SUTRS:
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
};