Paging support, small bug fixes
[pazpar2-moved-to-github.git] / command.c
index 4ea72e1..d2cc4a4 100644 (file)
--- a/command.c
+++ b/command.c
@@ -1,4 +1,4 @@
-/* $Id: command.c,v 1.1 2006-11-14 20:44:37 quinn Exp $ */
+/* $Id: command.c,v 1.3 2006-11-20 19:46:40 quinn Exp $ */
 
 #include <stdio.h>
 #include <sys/socket.h>
@@ -82,6 +82,37 @@ static int cmd_hitsbytarget(struct command_session *s, char **argv, int argc)
     return 1;
 }
 
+static int cmd_show(struct command_session *s, char **argv, int argc)
+{
+    struct record **recs;
+    int num = 10;
+    int i;
+
+    if (argc == 2)
+        num = atoi(argv[1]);
+
+    recs = show(s->psession, 0, &num);
+
+    for (i = 0; i < num; i++)
+    {
+        int rc;
+        struct record *cnode;
+        struct record *r = recs[i];
+
+        command_puts(s, r->merge_key);
+        for (rc = 1, cnode = r->next_cluster; cnode; cnode = cnode->next_cluster, rc++)
+            ;
+        if (rc > 1)
+        {
+            char buf[256];
+            sprintf(buf, " (%d records)", rc);
+            command_puts(s, buf);
+        }
+        command_puts(s, "\n");
+    }
+    return 1;
+}
+
 static int cmd_stat(struct command_session *s, char **argv, int argc)
 {
     char buf[1024];
@@ -139,9 +170,10 @@ static struct {
 } cmd_array[] = {
     {"quit", cmd_quit},
     {"load", cmd_load},
-    {"search", cmd_search},
+    {"find", cmd_search},
     {"ht", cmd_hitsbytarget},
     {"stat", cmd_stat},
+    {"show", cmd_show},
     {0,0}
 };
 
@@ -319,6 +351,7 @@ void command_init(int port)
     int l;
     struct protoent *p;
     struct sockaddr_in myaddr;
+    int one = 1;
 
     yaz_log(YLOG_LOG, "Command port is %d", port);
     if (!(p = getprotobyname("tcp"))) {
@@ -326,13 +359,17 @@ void command_init(int port)
     }
     if ((l = socket(PF_INET, SOCK_STREAM, p->p_proto)) < 0)
         yaz_log(YLOG_FATAL|YLOG_ERRNO, "socket");
+    if (setsockopt(l, SOL_SOCKET, SO_REUSEADDR, (char*)
+                    &one, sizeof(one)) < 0)
+        abort();
+
     bzero(&myaddr, sizeof myaddr);
     myaddr.sin_family = AF_INET;
     myaddr.sin_addr.s_addr = INADDR_ANY;
-    myaddr.sin_port = port;
+    myaddr.sin_port = htons(port);
     if (bind(l, (struct sockaddr *) &myaddr, sizeof myaddr) < 0) 
         yaz_log(YLOG_FATAL|YLOG_ERRNO, "bind");
-    if (listen(l, 5) < 0) 
+    if (listen(l, SOMAXCONN) < 0) 
         yaz_log(YLOG_FATAL|YLOG_ERRNO, "listen");
 
     c = iochan_create(l, command_accept, EVENT_INPUT | EVENT_EXCEPT);