* Sebastian Hammer, Adam Dickmeiss
*
* $Log: ir-tcl.c,v $
- * Revision 1.60 1995-10-18 15:43:31 adam
+ * Revision 1.64 1995-11-13 15:39:18 adam
+ * Bug fix: {small,medium}SetElementSetNames weren't set correctly.
+ * Bug fix: idAuthentication weren't set correctly.
+ *
+ * Revision 1.63 1995/11/13 09:55:39 adam
+ * Multiple records at a position in a result-set with differnt
+ * element specs.
+ *
+ * Revision 1.62 1995/10/18 17:20:33 adam
+ * Work on target setup in client.tcl.
+ *
+ * Revision 1.61 1995/10/18 16:42:42 adam
+ * New settings: smallSetElementSetNames and mediumSetElementSetNames.
+ *
+ * Revision 1.60 1995/10/18 15:43:31 adam
* In search: mediumSetElementSetNames and smallSetElementSetNames are
* set to elementSetNames.
*
int argc, char **argv);
static IrTcl_RecordList *new_IR_record (IrTcl_SetObj *setobj,
- int no, int which)
+ int no, int which,
+ const char *elements)
{
IrTcl_RecordList *rl;
for (rl = setobj->record_list; rl; rl = rl->next)
{
- if (no == rl->no)
+ if (no == rl->no && (!rl->elements || !elements ||
+ !strcmp(elements, rl->elements)))
{
+ free (rl->elements);
switch (rl->which)
{
case Z_NamePlusRecord_databaseRecord:
setobj->record_list = rl;
}
rl->which = which;
+ ir_tcl_strdup (NULL, &rl->elements, elements);
return rl;
}
IrTcl_RecordList *rl;
for (rl = setobj->record_list; rl; rl = rl->next)
- if (no == rl->no)
+ if (no == rl->no &&
+ (!setobj->recordElements || !rl->elements ||
+ !strcmp (setobj->recordElements, rl->elements)))
return rl;
return NULL;
}
Z_IdPass *pass = odr_malloc (p->odr_out, sizeof(*pass));
Z_IdAuthentication *auth = odr_malloc (p->odr_out, sizeof(*auth));
+ logf (LOG_DEBUG, "using pass authentication");
+
auth->which = Z_IdAuthentication_idPass;
auth->u.idPass = pass;
if (p->idAuthenticationGroupId && *p->idAuthenticationGroupId)
{
Z_IdAuthentication *auth = odr_malloc (p->odr_out, sizeof(*auth));
+ logf (LOG_DEBUG, "using open authentication");
auth->which = Z_IdAuthentication_open;
auth->u.open = p->idAuthenticationOpen;
req->idAuthentication = auth;
{
if (argc == 3)
{
- if (ir_tcl_strdup (interp, &p->idAuthenticationOpen, argv[2])
+ if (argv[2][0] &&
+ ir_tcl_strdup (interp, &p->idAuthenticationOpen, argv[2])
== TCL_ERROR)
return TCL_ERROR;
}
else if (argc == 5)
{
- if (ir_tcl_strdup (interp, &p->idAuthenticationGroupId, argv[2])
+ if (argv[2][0] &&
+ ir_tcl_strdup (interp, &p->idAuthenticationGroupId, argv[2])
== TCL_ERROR)
return TCL_ERROR;
- if (ir_tcl_strdup (interp, &p->idAuthenticationUserId, argv[3])
+ if (argv[3][0] &&
+ ir_tcl_strdup (interp, &p->idAuthenticationUserId, argv[3])
== TCL_ERROR)
return TCL_ERROR;
- if (ir_tcl_strdup (interp, &p->idAuthenticationPassword, argv[4])
+ if (argv[4][0] &&
+ ir_tcl_strdup (interp, &p->idAuthenticationPassword, argv[4])
== TCL_ERROR)
return TCL_ERROR;
}
return TCL_OK;
}
+/*
+ * do_smallSetElementSetNames: Set/Get small Set Element Set Names
+ */
+static int do_smallSetElementSetNames (void *obj, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IrTcl_SetCObj *p = obj;
+
+ if (argc == 0)
+ {
+ p->smallSetElementSetNames = NULL;
+ return TCL_OK;
+ }
+ else if (argc == -1)
+ return ir_tcl_strdel (interp, &p->smallSetElementSetNames);
+ if (argc == 3)
+ {
+ free (p->smallSetElementSetNames);
+ if (ir_tcl_strdup (interp, &p->smallSetElementSetNames,
+ argv[2]) == TCL_ERROR)
+ return TCL_ERROR;
+ }
+ Tcl_AppendResult (interp, p->smallSetElementSetNames, NULL);
+ return TCL_OK;
+}
+
+/*
+ * do_mediumSetElementSetNames: Set/Get medium Set Element Set Names
+ */
+static int do_mediumSetElementSetNames (void *obj, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IrTcl_SetCObj *p = obj;
+
+ if (argc == 0)
+ {
+ p->mediumSetElementSetNames = NULL;
+ return TCL_OK;
+ }
+ else if (argc == -1)
+ return ir_tcl_strdel (interp, &p->mediumSetElementSetNames);
+ if (argc == 3)
+ {
+ free (p->mediumSetElementSetNames);
+ if (ir_tcl_strdup (interp, &p->mediumSetElementSetNames,
+ argv[2]) == TCL_ERROR)
+ return TCL_ERROR;
+ }
+ Tcl_AppendResult (interp, p->mediumSetElementSetNames, NULL);
+ return TCL_OK;
+}
+
static IrTcl_Method ir_method_tab[] = {
{ 1, "comstack", do_comstack },
{ 0, "mediumSetPresentNumber", do_mediumSetPresentNumber},
{ 0, "referenceId", do_referenceId },
{ 0, "elementSetNames", do_elementSetNames },
+{ 0, "smallSetElementSetNames", do_smallSetElementSetNames },
+{ 0, "mediumSetElementSetNames", do_mediumSetElementSetNames },
{ 0, NULL, NULL}
};
apdu = zget_APDU (p->odr_out, Z_APDU_searchRequest);
req = apdu->u.searchRequest;
+ obj->start = 1;
+
bib1.proto = p->protocol_type;
bib1.class = CLASS_ATTSET;
bib1.value = VAL_BIB1;
else
req->preferredRecordSyntax = 0;
- if (obj->set_inher.elementSetNames && *obj->set_inher.elementSetNames)
+ if (obj->set_inher.smallSetElementSetNames &&
+ *obj->set_inher.smallSetElementSetNames)
{
Z_ElementSetNames *esn = odr_malloc (p->odr_out, sizeof(*esn));
-
+
esn->which = Z_ElementSetNames_generic;
- esn->u.generic = obj->set_inher.elementSetNames;
- req->mediumSetElementSetNames = esn;
+ esn->u.generic = obj->set_inher.smallSetElementSetNames;
req->smallSetElementSetNames = esn;
}
else
- {
- req->mediumSetElementSetNames = NULL;
req->smallSetElementSetNames = NULL;
+
+ if (obj->set_inher.mediumSetElementSetNames &&
+ *obj->set_inher.mediumSetElementSetNames)
+ {
+ Z_ElementSetNames *esn = odr_malloc (p->odr_out, sizeof(*esn));
+
+ esn->which = Z_ElementSetNames_generic;
+ esn->u.generic = obj->set_inher.mediumSetElementSetNames;
+ req->mediumSetElementSetNames = esn;
}
-
+ else
+ req->mediumSetElementSetNames = NULL;
+
req->query = &query;
-
+
if (!strcmp (obj->set_inher.queryType, "rpn"))
{
Z_RPNQuery *RPNquery;
delete_IR_records (obj);
return TCL_OK;
}
- if (argc < 3)
+ if (argc != 3)
{
sprintf (interp->result, "wrong # args");
return TCL_ERROR;
return TCL_ERROR;
rl = find_IR_record (obj, offset);
if (!rl)
+ {
+ logf (LOG_DEBUG, "No record at position %d", offset);
return TCL_OK;
+ }
switch (rl->which)
{
case Z_NamePlusRecord_databaseRecord:
{
return TCL_OK;
}
- if (argc < 3)
+ if (argc != 3)
{
sprintf (interp->result, "wrong # args");
return TCL_ERROR;
}
/*
+ * set record elements (for record extraction)
+ */
+static int do_recordElements (void *o, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IrTcl_SetObj *obj = o;
+
+ if (argc == 0)
+ {
+ obj->recordElements = NULL;
+ return TCL_OK;
+ }
+ else if (argc == -1)
+ return ir_tcl_strdel (NULL, &obj->recordElements);
+ if (argc > 3)
+ {
+ sprintf (interp->result, "wrong # args");
+ return TCL_ERROR;
+ }
+ if (argc == 3)
+ {
+ free (obj->recordElements);
+ return ir_tcl_strdup (NULL, &obj->recordElements,
+ (*argv[2] ? argv[2] : NULL));
+ }
+ Tcl_AppendResult (interp, obj->recordElements, NULL);
+ return TCL_OK;
+}
+
+/*
* ir_diagResult
*/
static int ir_diagResult (Tcl_Interp *interp, IrTcl_Diagnostic *list, int num)
if (argc <= 0)
return TCL_OK;
- if (argc < 3)
+ if (argc != 3)
{
sprintf (interp->result, "wrong # args");
return TCL_ERROR;
if (argc <= 0)
return TCL_OK;
- if (argc < 3)
+ if (argc != 3)
{
sprintf (interp->result, "wrong # args");
return TCL_ERROR;
}
else
req->preferredRecordSyntax = 0;
+
if (obj->set_inher.elementSetNames && *obj->set_inher.elementSetNames)
{
Z_ElementSetNames *esn = odr_malloc (p->odr_out, sizeof(*esn));
if (argc <= 0)
return TCL_OK;
- if (argc < 3)
+ if (argc != 3)
{
interp->result = "wrong # args";
return TCL_ERROR;
{
IrTcl_RecordList *rl;
- rl = new_IR_record (setobj, no, Z_NamePlusRecord_databaseRecord);
+ rl = new_IR_record (setobj, no, Z_NamePlusRecord_databaseRecord, "F");
rl->u.dbrec.type = VAL_USMARC;
rl->u.dbrec.buf = buf;
rl->u.dbrec.size = size;
{ 0, "getSutrs", do_getSutrs },
{ 0, "getGrs", do_getGrs },
{ 0, "recordType", do_recordType },
+ { 0, "recordElements", do_recordElements },
{ 0, "diag", do_diag },
{ 0, "responseStatus", do_responseStatus },
{ 0, "loadFile", do_loadFile },
== TCL_ERROR)
return TCL_ERROR;
+ if (ir_tcl_strdup (interp, &dst->smallSetElementSetNames,
+ src->smallSetElementSetNames)
+ == TCL_ERROR)
+ return TCL_ERROR;
+
+ if (ir_tcl_strdup (interp, &dst->mediumSetElementSetNames,
+ src->mediumSetElementSetNames)
+ == TCL_ERROR)
+ return TCL_ERROR;
+
if (src->preferredRecordSyntax &&
(dst->preferredRecordSyntax
= ir_tcl_malloc (sizeof(*dst->preferredRecordSyntax))))
}
}
-static void ir_handleRecords (void *o, Z_Records *zrs, IrTcl_SetObj *setobj)
+static void ir_handleRecords (void *o, Z_Records *zrs, IrTcl_SetObj *setobj,
+ const char *elements)
{
IrTcl_Obj *p = o;
{
rl = new_IR_record (setobj, setobj->start + offset,
zrs->u.databaseOrSurDiagnostics->
- records[offset]->which);
+ records[offset]->which,
+ elements);
if (rl->which == Z_NamePlusRecord_surrogateDiagnostic)
{
ir_handleDiags (&rl->u.surrogateDiagnostics.list,
logf (LOG_DEBUG, "Search response %d, %d hits",
setobj->searchStatus, setobj->resultCount);
if (zrs)
- ir_handleRecords (o, zrs, setobj);
+ {
+ const char *es;
+ if (setobj->resultCount <= setobj->set_inher.smallSetUpperBound)
+ es = setobj->set_inher.smallSetElementSetNames;
+ else
+ es = setobj->set_inher.mediumSetElementSetNames;
+ ir_handleRecords (o, zrs, setobj, es);
+ }
else
setobj->recordFlag = 0;
}
get_referenceId (&setobj->set_inher.referenceId, presrs->referenceId);
setobj->nextResultSetPosition = *presrs->nextResultSetPosition;
if (zrs)
- ir_handleRecords (o, zrs, setobj);
+ ir_handleRecords (o, zrs, setobj, setobj->set_inher.elementSetNames);
else
{
setobj->recordFlag = 0;