+
+ if (!*info.database )
+ {
+ fprintf (reply_fd, "%s\n",
+ gw_res_get (info.kernel_res, "gw.err.no.database",
+ "You must select database"));
+ return -3;
+ }
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Searching in database %s",
+ info.database );
+ assert (info.zass);
+ p = zass_search (info.zass, rpn, "Default", info.database );
+ if (!p)
+ return -1;
+ if (p->errcode != -1)
+ {
+ display_diag_error (p->errcode, p->errstring);
+ return -2;
+ }
+ fprintf (reply_fd, "%d %s\n", p->num,
+ gw_res_get (info.kernel_res, "gw.msg.hits", "hit(s)"));
+ us->hits = p->num;
+ return 0;
+}
+
+static int exec_target (struct ccl_token *list)
+{
+ int len;
+ if (list->kind == CCL_TOK_EOL)
+ return -1;
+ len = list->len;
+ memcpy (info.target, list->name, len);
+ info.target [len] = '\0';
+
+ read_kernel_res ();
+ return reopen_target ();
+}
+
+static int exec_base (struct ccl_token *list)
+{
+ struct ccl_token *li = list;
+ int len = 0;
+
+ assert (info.zass);
+ if (list->kind == CCL_TOK_EOL)
+ return -1;
+ free (info.database);
+ while (li->kind != CCL_TOK_EOL)
+ {
+ len += li->len + 1;
+ li = li->next;
+ if (li->kind == CCL_TOK_COMMA)
+ li = li->next;
+ }
+ info.database = malloc (len);
+ assert (info.database );
+ len = 0;
+ li = list;
+ while (li->kind != CCL_TOK_EOL)
+ {
+ memcpy (info.database+len, li->name, li->len);
+ len += li->len;
+ info.database[len++] = ',';
+ li = li->next;
+ if (li->kind == CCL_TOK_COMMA)
+ li = li->next;
+ }
+ info.database[len-1] = '\0';
+ return 0;
+}
+
+struct command_word show_tab [] =
+{
+{ "f", "format"},
+{ "p", "position"},
+{ NULL, NULL }
+};
+
+static void present (const char *set, int offset, int number,
+ struct ccl_token *format_token)
+{
+ const struct zass_presentent *zp;
+ int len;
+ int max_number;
+ char format_str[16];
+
+ max_number = atoi (gw_res_get (info.kernel_res, "gw.max.show",
+ "200"));
+ if (number > max_number)
+ number = max_number;
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "present in set %s", set);
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "present of %d records from offset %d",
+ number, offset);
+ zp = zass_present(info.zass, (char *) set, offset, number);
+ if (zp)
+ {
+ int i;
+ zass_record *pp;
+ char path[128];
+ int record_log_fd = -1;
+ const char *record_log_name;
+
+ record_log_name = gw_res_get (info.kernel_res, "gw.marc.log",
+ NULL);
+ if (record_log_name)
+ {
+ sprintf (path, "%s/%s", gw_res_get (info.kernel_res,
+ "gw.path", "."),
+ record_log_name );
+ record_log_fd = open (path, O_WRONLY|O_CREAT|O_APPEND, 0666);
+ if (record_log_fd == -1)
+ gw_log (GW_LOG_WARN, "Cannot open %s", path);
+ }
+ fprintf (reply_fd, gw_res_get (info.kernel_res,
+ "gw.msg.records",
+ "Got %d records"),
+ zp->num);
+ fprintf (reply_fd, "\n");
+ for (i = 0, pp = zp->records; pp; pp = pp->next, i++)
+ {
+ Iso2709Rec rec;
+#if USE_FML
+ const char *arg_ar[5];
+#endif
+ fprintf (reply_fd, "--- %d/%d ---\n",
+ i+offset, offset+zp->num-1);
+ if (!gw_res_get (info.kernel_res, "gw.ignore.which", NULL))
+ {
+ if (pp->which == ZASS_REC_DIAG)
+ {
+ display_diag_error (pp->errcode, pp->errstring);
+ continue;
+ }
+ else if (pp->which != ZASS_REC_USMARC)
+ {
+ fprintf (reply_fd, "Unknown record kind %d\n",
+ pp->which);
+ continue;
+ }
+ }
+ if (record_log_fd != -1)
+ write (record_log_fd, pp->record, strlen(pp->record));
+ rec = iso2709_cvt (pp->record);
+ if (rec)
+ {
+#if USE_FML
+ if (format_token)
+ {
+ len = format_token->len;
+ if (len >= sizeof(format_str))
+ len = sizeof(format_str)-1;
+ memcpy (format_str, format_token->name, len);
+ format_str[len] = '\0';
+ }
+ if (info.fml && format_token &&
+ (!strcmp (format_str, "0") || !strcmp (format_str, "1")
+ || !strcmp(format_str, "2")))
+ {
+ arg_ar[0] = "\\f";
+ arg_ar[1] = format_str;
+ arg_ar[2] = " \\list";
+ arg_ar[3] = marc_to_str (info.fml, rec);
+ arg_ar[4] = NULL;
+ fml_exec_call_argv (info.fml, arg_ar);
+ }
+ else
+ iso2709_display (rec, reply_fd);
+#else
+ iso2709_display (rec, reply_fd);
+#endif
+ iso2709_rm (rec);
+ }
+ else
+ fprintf (reply_fd, "Not a MARC record\n");
+ }
+ if (record_log_fd != -1)
+ close (record_log_fd);
+ }
+}
+
+static int exec_show (struct ccl_token *list)
+{
+ char tmp_str[20];
+ struct ccl_token *set_token = NULL;
+ struct ccl_token *format_token = NULL;
+ struct ccl_token *li = list;
+ int no_of_present = 0;
+
+ assert (info.zass);
+ while (li->kind != CCL_TOK_EOL)
+ {
+ int modifier_no = 0;
+ if (li->next->kind == CCL_TOK_EQ)
+ {
+ if (li->kind == CCL_TOK_SET) /* set = <name> ? */
+ {
+ li = li->next->next;
+ set_token = li;
+ }
+ else
+ {
+ modifier_no = command_search (show_tab, li, "ccl.token.");
+ if (!modifier_no)
+ {
+ fprintf (reply_fd, "Unknown modifier in show\n");
+ return -1;
+ }
+ li = li->next->next;
+ if (modifier_no == 1) /* f = <name> ? */
+ format_token = li;
+ else if (modifier_no == 2) /* p = <name> ? */
+ {
+ if (li->kind != CCL_TOK_EOL /* p = <name> - <name> ? */
+ && li->next->kind == CCL_TOK_MINUS
+ && li->next->next != CCL_TOK_EOL)
+ li = li->next->next;
+ }
+ }
+ if (!li->next)
+ {
+ fprintf (reply_fd, "%s\n", "Missing token after '='");
+ return -2;
+ }
+ li = li->next;
+ }
+ else
+ li = li->next;
+ }
+ if (set_token)
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Got set=%.*s", set_token->len,
+ set_token->name);
+ if (format_token)
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Got format=%.*s", format_token->len,
+ format_token->name);
+
+ li = list;
+ while (li->kind != CCL_TOK_EOL)
+ {
+ int modifier_no = 0;
+ int offset = 0;
+ int number = 0;
+ int len;
+ if (li->next->kind == CCL_TOK_EQ && li->kind != CCL_TOK_SET)
+ {
+ modifier_no = command_search (show_tab, li, "ccl.token.");
+ li = li->next->next;
+ if (modifier_no == 2) /* p = <name> ? */
+ {
+ if (li->kind != CCL_TOK_EOL /* p = <name> - <name> ? */
+ && li->next->kind == CCL_TOK_MINUS
+ && li->next->next != CCL_TOK_EOL)
+ {
+ len = li->len;
+ memcpy (tmp_str, li->name, len);
+ tmp_str [len] = '\0';
+ offset = atoi (tmp_str);
+ li = li->next->next;
+
+ len = li->len;
+ memcpy (tmp_str, li->name, len);
+ tmp_str [len] = '\0';
+ number = atoi (tmp_str) - offset + 1;
+ }
+ else
+ {
+ len = li->len;
+ memcpy (tmp_str, li->name, len);
+ tmp_str [len] = '\0';
+ offset = atoi (tmp_str);
+ number = 1;
+ }
+ }
+ li = li->next;
+ }
+ else
+ {
+ len = li->len;
+ memcpy (tmp_str, li->name, len);
+ tmp_str[len] = '\0';
+ number = atoi (tmp_str);
+ offset = 1;
+ li = li->next;
+ }
+ if (offset > 0 && number > 0)
+ {
+ struct gw_user_set *us;
+
+ if (set_token)
+ {
+ len = set_token->len;
+ memcpy (tmp_str, set_token->name, len);
+ tmp_str[len] = '\0';
+ us = user_set_search (tmp_str);
+ }
+ else
+ us = user_set_search (NULL);
+ if (us && us->hits != -1) /* proper result-set? */
+ {
+ if (offset <= us->hits)
+ {
+ if (offset+number-1 > us->hits)
+ number = us->hits - offset+1;
+ present (us->name, offset, number, format_token);
+ }
+ }
+ else if (!no_of_present) /* display error message once! */
+ {
+ fprintf (reply_fd, "%s\n",
+ gw_res_get (info.kernel_res, "gw.err.no.set",
+ "No result-set generated"));
+ }
+ no_of_present++;
+ }
+ }
+ if (!no_of_present) /* no records shown so far? */
+ {
+ struct gw_user_set *us;
+ int default_show;
+
+ us = user_set_search (NULL);
+ if (us && us->hits != -1) /* proper result-set? */
+ {
+ default_show = atoi (gw_res_get (info.kernel_res,
+ "gw.default.show", "20"));
+ if (us->hits > default_show)
+ present (us->name, 1, default_show, format_token);
+ else if (us->hits > 0)
+ present (us->name, 1, us->hits, format_token);
+ }
+ else /* display error message */
+ {
+ fprintf (reply_fd, "%s\n",
+ gw_res_get (info.kernel_res, "gw.err.no.set",
+ "No result-set generated"));
+ return -3;
+ }
+ }