Bug fix: record extraction in line mode merged lines with same tag.
[ir-tcl-moved-to-github.git] / ir-tcl.c
index cf40cb5..06dc10b 100644 (file)
--- a/ir-tcl.c
+++ b/ir-tcl.c
@@ -5,7 +5,18 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: ir-tcl.c,v $
- * Revision 1.61  1995-10-18 16:42:42  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
@@ -241,14 +252,17 @@ static int do_disconnect (void *obj, Tcl_Interp *interp,
                           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:
@@ -271,6 +285,7 @@ static IrTcl_RecordList *new_IR_record (IrTcl_SetObj *setobj,
         setobj->record_list = rl;
     }
     rl->which = which;
+    ir_tcl_strdup (NULL, &rl->elements, elements);
     return rl;
 }
 
@@ -345,7 +360,9 @@ static IrTcl_RecordList *find_IR_record (IrTcl_SetObj *setobj, int no)
     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;
 }
@@ -532,6 +549,8 @@ static int do_init_request (void *obj, Tcl_Interp *interp,
         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)
@@ -554,6 +573,7 @@ static int do_init_request (void *obj, Tcl_Interp *interp,
     {
         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;
@@ -867,19 +887,23 @@ static int do_idAuthentication (void *obj, Tcl_Interp *interp,
     {
         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;
         }
@@ -1411,7 +1435,7 @@ static int do_elementSetNames (void *obj, Tcl_Interp *interp,
 }
 
 /*
- * do_smallSetElementSetNames: Set/Get element Set Names
+ * do_smallSetElementSetNames: Set/Get small Set Element Set Names
  */
 static int do_smallSetElementSetNames (void *obj, Tcl_Interp *interp,
                                int argc, char **argv)
@@ -1437,7 +1461,7 @@ static int do_smallSetElementSetNames (void *obj, Tcl_Interp *interp,
 }
 
 /*
- * do_mediumSetElementSetNames: Set/Get element Set Names
+ * do_mediumSetElementSetNames: Set/Get medium Set Element Set Names
  */
 static int do_mediumSetElementSetNames (void *obj, Tcl_Interp *interp,
                                int argc, char **argv)
@@ -1684,7 +1708,7 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv)
         Z_ElementSetNames *esn = odr_malloc (p->odr_out, sizeof(*esn));
         
         esn->which = Z_ElementSetNames_generic;
-        esn->u.generic = obj->set_inher.elementSetNames;
+        esn->u.generic = obj->set_inher.smallSetElementSetNames;
         req->smallSetElementSetNames = esn;
     }
     else
@@ -1696,7 +1720,7 @@ static int do_search (void *o, Tcl_Interp *interp, int argc, char **argv)
         Z_ElementSetNames *esn = odr_malloc (p->odr_out, sizeof(*esn));
         
         esn->which = Z_ElementSetNames_generic;
-        esn->u.generic = obj->set_inher.elementSetNames;
+        esn->u.generic = obj->set_inher.mediumSetElementSetNames;
         req->mediumSetElementSetNames = esn;
     }
     else
@@ -1873,7 +1897,7 @@ static int do_type (void *o, Tcl_Interp *interp, int argc, char **argv)
         delete_IR_records (obj);
        return TCL_OK;
     }
-    if (argc < 3)
+    if (argc != 3)
     {
         sprintf (interp->result, "wrong # args");
         return TCL_ERROR;
@@ -1916,7 +1940,7 @@ static int do_recordType (void *o, Tcl_Interp *interp, int argc, char **argv)
     {
        return TCL_OK;
     }
-    if (argc < 3)
+    if (argc != 3)
     {
         sprintf (interp->result, "wrong # args");
         return TCL_ERROR;
@@ -1937,6 +1961,36 @@ static int do_recordType (void *o, Tcl_Interp *interp, int argc, char **argv)
 }
 
 /*
+ * 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)
@@ -1974,7 +2028,7 @@ static int do_diag (void *o, Tcl_Interp *interp, int argc, char **argv)
 
     if (argc <= 0)
         return TCL_OK;
-    if (argc < 3)
+    if (argc != 3)
     {
         sprintf (interp->result, "wrong # args");
         return TCL_ERROR;
@@ -2039,7 +2093,7 @@ static int do_getSutrs (void *o, Tcl_Interp *interp, int argc, char **argv)
 
     if (argc <= 0)
         return TCL_OK;
-    if (argc < 3)
+    if (argc != 3)
     {
         sprintf (interp->result, "wrong # args");
         return TCL_ERROR;
@@ -2233,7 +2287,7 @@ static int do_loadFile (void *o, Tcl_Interp *interp,
 
     if (argc <= 0)
         return TCL_OK;
-    if (argc < 3)
+    if (argc != 3)
     {
         interp->result = "wrong # args";
         return TCL_ERROR;
@@ -2248,7 +2302,7 @@ static int do_loadFile (void *o, Tcl_Interp *interp,
     {
         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;
@@ -2273,6 +2327,7 @@ static IrTcl_Method ir_set_method_tab[] = {
     { 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 },
@@ -2803,7 +2858,8 @@ static void ir_handleDiags (IrTcl_Diagnostic **dst_list, int *dst_num,
     }
 }
 
-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;
 
@@ -2824,7 +2880,8 @@ static void ir_handleRecords (void *o, Z_Records *zrs, IrTcl_SetObj *setobj)
         {
             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,
@@ -2922,7 +2979,14 @@ static void ir_searchResponse (void *o, Z_SearchResponse *searchrs,
     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;
 }
@@ -2943,7 +3007,7 @@ static void ir_presentResponse (void *o, Z_PresentResponse *presrs,
     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;