SRW record retrieval works for ZOOM
[yaz-moved-to-github.git] / zoom / zoomsh.c
index 69e3195..8097066 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: zoomsh.c,v 1.4 2001-11-15 08:58:29 adam Exp $
+ * $Id: zoomsh.c,v 1.14 2003-02-17 14:35:42 adam Exp $
  *
  * ZOOM-C Shell
  */
@@ -64,8 +64,8 @@ static int is_command (const char *cmd_str, const char *this_str, int this_len)
     return 1;
 }
 
-static void cmd_set (Z3950_connection *c, Z3950_resultset *r,
-                    Z3950_options options,
+static void cmd_set (ZOOM_connection *c, ZOOM_resultset *r,
+                    ZOOM_options options,
                     const char **args)
 {
     char key[40], val[80];
@@ -76,16 +76,29 @@ static void cmd_set (Z3950_connection *c, Z3950_resultset *r,
        return ;
     }
     if (!next_token_copy (args, val, sizeof(val)))
+       ZOOM_options_set(options, key, 0);
+    else
+       ZOOM_options_set(options, key, val);
+}
+
+static void cmd_get (ZOOM_connection *c, ZOOM_resultset *r,
+                    ZOOM_options options,
+                    const char **args)
+{
+    char key[40];
+    if (!next_token_copy (args, key, sizeof(key)))
     {
-       const char *val = Z3950_options_get(options, key);
-       printf ("%s = %s\n", key, val ? val : "<null>");
+       printf ("missing argument for get\n");
     }
     else
-       Z3950_options_set(options, key, val);
+    {
+        const char *val = ZOOM_options_get(options, key);
+        printf ("%s = %s\n", key, val ? val : "<null>");
+    }
 }
 
-static void cmd_close (Z3950_connection *c, Z3950_resultset *r,
-                      Z3950_options options,
+static void cmd_close (ZOOM_connection *c, ZOOM_resultset *r,
+                      ZOOM_options options,
                       const char **args)
 {
     char host[60];
@@ -96,137 +109,186 @@ static void cmd_close (Z3950_connection *c, Z3950_resultset *r,
        const char *h;
        if (!c[i])
            continue;
-       if ((h = Z3950_connection_host(c[i])) && !strcmp (h, host))
+       if ((h = ZOOM_connection_option_get(c[i], "host"))
+            && !strcmp (h, host))
        {
-           Z3950_connection_destroy (c[i]);
+           ZOOM_connection_destroy (c[i]);
            c[i] = 0;
        }
        else if (*host == '\0')
        {
-           Z3950_connection_destroy (c[i]);
+           ZOOM_connection_destroy (c[i]);
            c[i] = 0;
        }
     }
 }
 
-static void display_records (Z3950_connection c,
-                            Z3950_resultset r,
+static void display_records (ZOOM_connection c,
+                            ZOOM_resultset r,
                             int start, int count)
 {
     int i;
     for (i = 0; i<count; i++)
     {
        int pos = i + start;
-        Z3950_record rec = Z3950_resultset_record (r, pos);
-       const char *db = Z3950_record_get (rec, "database", 0);
+        ZOOM_record rec = ZOOM_resultset_record (r, pos);
+       const char *db = ZOOM_record_get (rec, "database", 0);
        int len;
-       const char *render = Z3950_record_get (rec, "render", &len);
-       const char *syntax = Z3950_record_get (rec, "syntax", 0);
+       const char *render = ZOOM_record_get (rec, "render", &len);
+       const char *syntax = ZOOM_record_get (rec, "syntax", 0);
        /* if rec is non-null, we got a record for display */
        if (rec)
        {
            printf ("%d %s %s\n", pos+1, (db ? db : "unknown"), syntax);
            if (render)
                fwrite (render, 1, len, stdout);
-           putchar ('\n');
+           printf ("\n");
        }
     }
 }
 
-static void cmd_show (Z3950_connection *c, Z3950_resultset *r,
-                     Z3950_options options,
+static void cmd_show (ZOOM_connection *c, ZOOM_resultset *r,
+                     ZOOM_options options,
                      const char **args)
 {
     int i;
     char start_str[10], count_str[10];
 
     if (next_token_copy (args, start_str, sizeof(start_str)))
-       Z3950_options_set (options, "start", start_str);
+       ZOOM_options_set (options, "start", start_str);
 
     if (next_token_copy (args, count_str, sizeof(count_str)))
-       Z3950_options_set (options, "count", count_str);
+       ZOOM_options_set (options, "count", count_str);
 
     for (i = 0; i<MAX_CON; i++)
-       Z3950_resultset_records (r[i], 0, atoi(start_str), atoi(count_str));
-    while (Z3950_event (MAX_CON, c))
+       ZOOM_resultset_records (r[i], 0, atoi(start_str), atoi(count_str));
+    while (ZOOM_event (MAX_CON, c))
        ;
 
     for (i = 0; i<MAX_CON; i++)
     {
        int error;
-       const char *errmsg, *addinfo;
+       const char *errmsg, *addinfo, *dset;
        /* display errors if any */
        if (!c[i])
            continue;
-       if ((error = Z3950_connection_error(c[i], &errmsg, &addinfo)))
-           fprintf (stderr, "%s error: %s (%d) %s\n",
-                    Z3950_connection_host(c[i]), errmsg,
-                    error, addinfo);
+       if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))
+           printf ("%s error: %s (%s:%d) %s\n",
+                    ZOOM_connection_option_get(c[i], "host"), errmsg,
+                    dset, error, addinfo);
        else if (r[i])
        {
            /* OK, no major errors. Display records... */
-           int start = Z3950_options_get_int (options, "start", 0);
-           int count = Z3950_options_get_int (options, "count", 0);
+           int start = ZOOM_options_get_int (options, "start", 0);
+           int count = ZOOM_options_get_int (options, "count", 0);
            display_records (c[i], r[i], start, count);
        }
     }
 }
 
-static void cmd_search (Z3950_connection *c, Z3950_resultset *r,
-                       Z3950_options options,
+static void cmd_ext (ZOOM_connection *c, ZOOM_resultset *r,
+                     ZOOM_options options,
+                     const char **args)
+{
+    ZOOM_package p[MAX_CON];
+    
+    int i;
+    
+    for (i = 0; i<MAX_CON; i++)
+    {
+       if (c[i])
+        {
+            p[i] = ZOOM_connection_package (c[i], 0);
+            ZOOM_package_send(p[i], "itemorder");
+        }
+        else
+            p[i] = 0;
+    }
+
+    while (ZOOM_event (MAX_CON, c))
+       ;
+
+    for (i = 0; i<MAX_CON; i++)
+    {
+       int error;
+       const char *errmsg, *addinfo, *dset;
+       /* display errors if any */
+       if (!p[i])
+           continue;
+       if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))
+           printf ("%s error: %s (%s:%d) %s\n",
+                    ZOOM_connection_option_get(c[i], "host"), errmsg,
+                    dset, error, addinfo);
+       else if (p[i])
+       {
+            printf ("ok\n");
+       }
+        ZOOM_package_destroy (p[i]);
+    }
+}
+
+static void cmd_search (ZOOM_connection *c, ZOOM_resultset *r,
+                       ZOOM_options options,
                        const char **args)
 {
-    Z3950_query s;
+    ZOOM_query s;
+    const char *query_str = *args;
     int i;
     
-    s = Z3950_query_create ();
-    if (Z3950_query_prefix (s, *args))
+    s = ZOOM_query_create ();
+    while (*query_str == ' ')
+        query_str++;
+    if (memcmp(query_str, "cql:", 4) == 0)
+    {
+        ZOOM_query_cql (s, query_str + 4);
+    }
+    else if (ZOOM_query_prefix (s, query_str))
     {
-       fprintf (stderr, "Bad PQF: %s\n", *args);
+       printf ("Bad PQF: %s\n", query_str);
        return;
     }
     for (i = 0; i<MAX_CON; i++)
     {
        if (c[i])
        {
-           Z3950_resultset_destroy (r[i]);
+           ZOOM_resultset_destroy (r[i]);
            r[i] = 0;
        }
        if (c[i])
-           r[i] = Z3950_connection_search (c[i], s);
+           r[i] = ZOOM_connection_search (c[i], s);
     }
 
-    while (Z3950_event (MAX_CON, c))
+    while (ZOOM_event (MAX_CON, c))
        ;
 
     for (i = 0; i<MAX_CON; i++)
     {
        int error;
-       const char *errmsg, *addinfo;
+       const char *errmsg, *addinfo, *dset;
        /* display errors if any */
        if (!c[i])
            continue;
-       if ((error = Z3950_connection_error(c[i], &errmsg, &addinfo)))
-           fprintf (stderr, "%s error: %s (%d) %s\n",
-                    Z3950_connection_host(c[i]), errmsg,
-                    error, addinfo);
+       if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))
+           printf ("%s error: %s (%s:%d) %s\n",
+                   ZOOM_connection_option_get(c[i], "host"), errmsg,
+                   dset, error, addinfo);
        else if (r[i])
        {
            /* OK, no major errors. Look at the result count */
-           int start = Z3950_options_get_int (options, "start", 0);
-           int count = Z3950_options_get_int (options, "count", 0);
+           int start = ZOOM_options_get_int (options, "start", 0);
+           int count = ZOOM_options_get_int (options, "count", 0);
 
-           printf ("%s: %d hits\n", Z3950_connection_host(c[i]),
-                   Z3950_resultset_size(r[i]));
+           printf ("%s: %d hits\n", ZOOM_connection_option_get(c[i], "host"),
+                   ZOOM_resultset_size(r[i]));
            /* and display */
            display_records (c[i], r[i], start, count);
        }
     }
-    Z3950_query_destroy (s);
+    ZOOM_query_destroy (s);
 }
 
-static void cmd_help (Z3950_connection *c, Z3950_resultset *r,
-                     Z3950_options options,
+static void cmd_help (ZOOM_connection *c, ZOOM_resultset *r,
+                     ZOOM_options options,
                      const char **args)
 {
     printf ("connect <zurl>\n");
@@ -234,7 +296,8 @@ static void cmd_help (Z3950_connection *c, Z3950_resultset *r,
     printf ("show [<start> [<count>]\n");
     printf ("quit\n");
     printf ("close <zurl>\n");
-    printf ("set <option> [<value>]]\n");
+    printf ("set <option> [<value>]\n");
+    printf ("get <option>\n");
     printf ("\n");
     printf ("options:\n");
     printf (" start\n");
@@ -251,14 +314,16 @@ static void cmd_help (Z3950_connection *c, Z3950_resultset *r,
     printf (" user\n");
     printf (" pass\n");
     printf (" implementationName\n");
+    printf (" charset\n");
+    printf (" lang\n");
 }
 
-static void cmd_connect (Z3950_connection *c, Z3950_resultset *r,
-                        Z3950_options options,
+static void cmd_connect (ZOOM_connection *c, ZOOM_resultset *r,
+                        ZOOM_options options,
                         const char **args)
 {
     int error;
-    const char *errmsg, *addinfo;
+    const char *errmsg, *addinfo, *dset;
     char host[60];
     int j, i;
     if (!next_token_copy (args, host, sizeof(host)))
@@ -269,10 +334,10 @@ static void cmd_connect (Z3950_connection *c, Z3950_resultset *r,
     for (j = -1, i = 0; i<MAX_CON; i++)
     {
        const char *h;
-       if (c[i] && (h = Z3950_connection_host(c[i])) &&
+       if (c[i] && (h = ZOOM_connection_option_get(c[i], "host")) &&
            !strcmp (h, host))
        {
-           Z3950_connection_destroy (c[i]);
+           ZOOM_connection_destroy (c[i]);
            break;
        }
        else if (c[i] == 0 && j == -1)
@@ -287,17 +352,17 @@ static void cmd_connect (Z3950_connection *c, Z3950_resultset *r,
        }
        i = j;   /* OK, use this one is available */
     }
-    c[i] = Z3950_connection_create (options);
-    Z3950_connection_connect (c[i], host, 0);
-
-    if ((error = Z3950_connection_error(c[i], &errmsg, &addinfo)))
-       printf ("%s error: %s (%d) %s\n", Z3950_connection_host(c[i]),
-               errmsg, error, addinfo);
-    
+    c[i] = ZOOM_connection_create (options);
+    ZOOM_connection_connect (c[i], host, 0);
+       
+    if ((error = ZOOM_connection_error_x(c[i], &errmsg, &addinfo, &dset)))
+       printf ("%s error: %s (%s:%d) %s\n",
+           ZOOM_connection_option_get(c[i], "host"), errmsg,
+           dset, error, addinfo);
 }
 
-static int cmd_parse (Z3950_connection *c, Z3950_resultset *r,
-                     Z3950_options options, 
+static int cmd_parse (ZOOM_connection *c, ZOOM_resultset *r,
+                     ZOOM_options options, 
                      const char **buf)
 {
     int cmd_len;
@@ -310,26 +375,36 @@ static int cmd_parse (Z3950_connection *c, Z3950_resultset *r,
        return 0;
     else if (is_command ("set", cmd_str, cmd_len))
        cmd_set (c, r, options, buf);
+    else if (is_command ("get", cmd_str, cmd_len))
+       cmd_get (c, r, options, buf);
     else if (is_command ("connect", cmd_str, cmd_len))
        cmd_connect (c, r, options, buf);
+    else if (is_command ("open", cmd_str, cmd_len))
+       cmd_connect (c, r, options, buf);
     else if (is_command ("search", cmd_str, cmd_len))
        cmd_search (c, r, options, buf);
+    else if (is_command ("find", cmd_str, cmd_len))
+       cmd_search (c, r, options, buf);
     else if (is_command ("show", cmd_str, cmd_len))
        cmd_show (c, r, options, buf);
     else if (is_command ("close", cmd_str, cmd_len))
        cmd_close (c, r, options, buf);
     else if (is_command ("help", cmd_str, cmd_len))
        cmd_help(c, r, options, buf);
+    else if (is_command ("ext", cmd_str, cmd_len))
+       cmd_ext(c, r, options, buf);
     else
        printf ("unknown command %.*s\n", cmd_len, cmd_str);
     return 2;
 }
 
-void shell(Z3950_connection *c, Z3950_resultset *r, Z3950_options options)
+void shell(ZOOM_connection *c, ZOOM_resultset *r,
+           ZOOM_options options)
 {
     while (1)
     {
         char buf[1000];
+       char *cp;
        const char *bp = buf;
 #if HAVE_READLINE_READLINE_H
        char* line_in;
@@ -341,7 +416,7 @@ void shell(Z3950_connection *c, Z3950_resultset *r, Z3950_options options)
            add_history(line_in);
 #endif
        if(strlen(line_in) > 999) {
-           fprintf(stderr,"Input line too long\n");
+           printf("Input line too long\n");
            break;
        };
        strcpy(buf,line_in);
@@ -351,6 +426,8 @@ void shell(Z3950_connection *c, Z3950_resultset *r, Z3950_options options)
        if (!fgets (buf, 999, stdin))
            break;
 #endif 
+       if ((cp = strchr(buf, '\n')))
+           *cp = '\0';
        if (!cmd_parse (c, r, options, &bp))
            break;
     }
@@ -358,10 +435,14 @@ void shell(Z3950_connection *c, Z3950_resultset *r, Z3950_options options)
 
 int main (int argc, char **argv)
 {
-    Z3950_options options = Z3950_options_create();
+    ZOOM_options options = ZOOM_options_create();
     int i, res;
-    Z3950_connection z39_con[MAX_CON];
-    Z3950_resultset  z39_res[MAX_CON];
+    ZOOM_connection z39_con[MAX_CON];
+    ZOOM_resultset  z39_res[MAX_CON];
+
+#if 0
+    yaz_log_init_level(65535);
+#endif
     for (i = 0; i<MAX_CON; i++)
     {
        z39_con[i] = 0;
@@ -381,12 +462,12 @@ int main (int argc, char **argv)
     }
     if (res)  /* do cmdline shell only if not quitting */
        shell(z39_con, z39_res, options);
-    Z3950_options_destroy(options);
+    ZOOM_options_destroy(options);
 
     for (i = 0; i<MAX_CON; i++)
     {
-       Z3950_connection_destroy(z39_con[i]);
-       Z3950_resultset_destroy(z39_res[i]);
+       ZOOM_connection_destroy(z39_con[i]);
+       ZOOM_resultset_destroy(z39_res[i]);
     }
     exit (0);
 }