Added simple example
[pazpar2-moved-to-github.git] / pazpar2.c
index 359e7a8..d8d8756 100644 (file)
--- a/pazpar2.c
+++ b/pazpar2.c
@@ -1,4 +1,4 @@
-/* $Id: pazpar2.c,v 1.8 2006-12-03 06:43:24 quinn Exp $ */;
+/* $Id: pazpar2.c,v 1.11 2006-12-08 21:40:58 quinn Exp $ */;
 
 #include <stdlib.h>
 #include <stdio.h>
 #include "relevance.h"
 
 #define PAZPAR2_VERSION "0.1"
-#define MAX_CHUNK 10
+#define MAX_CHUNK 15
 
 static void client_fatal(struct client *cl);
 static void connection_destroy(struct connection *co);
 static int client_prep_connection(struct client *cl);
+static void ingest_records(struct client *cl, Z_Records *r);
 
 IOCHAN channel_list = 0;  // Master list of connections we're listening to.
 
@@ -151,6 +152,7 @@ static void send_search(IOCHAN i)
     char **databaselist;
     Z_Query *zquery;
     struct ccl_rpn_node *cn;
+    int ssub = 0, lslb = 100000, mspn = 10;
 
     yaz_log(YLOG_DEBUG, "Sending search");
 
@@ -169,6 +171,12 @@ static void send_search(IOCHAN i)
     for (ndb = 0; *db->databases[ndb]; ndb++)
        databaselist[ndb] = db->databases[ndb];
 
+    a->u.presentRequest->preferredRecordSyntax =
+            yaz_oidval_to_z3950oid(global_parameters.odr_out,
+            CLASS_RECSYN, VAL_USMARC);
+    a->u.searchRequest->smallSetUpperBound = &ssub;
+    a->u.searchRequest->largeSetLowerBound = &lslb;
+    a->u.searchRequest->mediumSetPresentNumber = &mspn;
     a->u.searchRequest->resultSetName = "Default";
     a->u.searchRequest->databaseNames = databaselist;
     a->u.searchRequest->num_databaseNames = ndb;
@@ -246,8 +254,14 @@ static void do_searchResponse(IOCHAN i, Z_APDU *a)
     if (*r->searchStatus)
     {
        cl->hits = *r->resultCount;
-        cl->state = Client_Idle;
         se->total_hits += cl->hits;
+        if (r->presentStatus && !*r->presentStatus && r->records)
+        {
+            yaz_log(YLOG_DEBUG, "Records in search response");
+            cl->records += *r->numberOfRecordsReturned;
+            ingest_records(cl, r->records);
+        }
+        cl->state = Client_Idle;
     }
     else
     {          /*"FAILED"*/
@@ -345,11 +359,11 @@ char *extract_title(struct session *s, const char *rec)
         }
     }
     wrbuf_putc(s->wrbuf, '\0');
-    obuf = nmem_strdup(s->nmem, wrbuf_buf(s->wrbuf));
+    obuf = (unsigned char*) nmem_strdup(s->nmem, wrbuf_buf(s->wrbuf));
     for (p = obuf; *p; p++)
         if (*p == '&' || *p == '<' || *p > 122 || *p < ' ')
             *p = ' ';
-    return obuf;
+    return (char*) obuf;
 }
 
 // Extract 245 $a $b 100 $a
@@ -594,7 +608,7 @@ static void pull_relevance_keys(struct session *s, struct record *head,  struct
     relevance_donerecord(s->relevance, head);
 }
 
-struct record *ingest_record(struct client *cl, char *buf, int len)
+static struct record *ingest_record(struct client *cl, char *buf, int len)
 {
     struct session *se = cl->session;
     struct record *res;
@@ -634,7 +648,7 @@ struct record *ingest_record(struct client *cl, char *buf, int len)
     return res;
 }
 
-void ingest_records(struct client *cl, Z_Records *r)
+static void ingest_records(struct client *cl, Z_Records *r)
 {
     struct record *rec;
     Z_NamePlusRecordList *rlist;
@@ -1293,6 +1307,7 @@ int main(int argc, char **argv)
 {
     int ret;
     char *arg;
+    int setport = 0;
 
     if (signal(SIGPIPE, SIG_IGN) < 0)
         yaz_log(YLOG_WARN|YLOG_ERRNO, "signal");
@@ -1302,16 +1317,16 @@ int main(int argc, char **argv)
     while ((ret = options("c:h:p:C:s:", argv, argc, &arg)) != -2)
     {
        switch (ret) {
-           case 0:
-               break;
            case 'c':
                command_init(atoi(arg));
+                setport++;
                break;
-            case 'C':
-                global_parameters.ccl_filter = load_cclfile(arg);
-                break;
             case 'h':
                 http_init(atoi(arg));
+                setport++;
+                break;
+            case 'C':
+                global_parameters.ccl_filter = load_cclfile(arg);
                 break;
             case 'p':
                 http_set_proxyaddr(arg);
@@ -1320,11 +1335,22 @@ int main(int argc, char **argv)
                 load_simpletargets(arg);
                 break;
            default:
-               fprintf(stderr, "Usage: pazpar2 -d comport");
+               fprintf(stderr, "Usage: pazpar2\n"
+                        "    -h httpport             (REST)\n"
+                        "    -c cmdport              (telnet-style)\n"
+                        "    -C cclconfig\n"
+                        "    -s simpletargetfile\n"
+                        "    -p hostname[:portno]    (HTTP proxy)\n");
                exit(1);
        }
     }
 
+    if (!setport)
+    {
+        fprintf(stderr, "Set command port with -h or -c\n");
+        exit(1);
+    }
+
     global_parameters.ccl_filter = load_cclfile("default.bib");
     global_parameters.yaz_marc = yaz_marc_create();
     yaz_marc_subfield_str(global_parameters.yaz_marc, "\t");