Fixed bug #305: Scan with preferredPositionInResponse <= -2 crashes.
[idzebra-moved-to-github.git] / index / zserver.c
index 600248a..87dab70 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: zserver.c,v 1.123 2004-11-19 10:27:08 heikki Exp $
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
-   Index Data Aps
+/* $Id: zserver.c,v 1.131 2005-04-15 10:47:49 adam Exp $
+   Copyright (C) 1995-2005
+   Index Data ApS
 
 This file is part of the Zebra server.
 
@@ -20,8 +20,9 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 */
 
-#include <stdio.h>
 #include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <fcntl.h>
 #ifdef WIN32
 #include <io.h>
@@ -32,7 +33,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #endif
 
 #include <errno.h>
-#include <yaz/ylog.h>
+#include <yaz/log.h>
 #include <yaz/ill.h>
 #include <yaz/yaz-util.h>
 
@@ -153,7 +154,8 @@ bend_initresult *bend_init (bend_initrequest *q)
                          charsets[i], right_name);
                 odr_set_charset (q->stream, right_name, "UTF-8");
                 if (selected)
-                    zebra_record_encoding (zh, right_name);
+                    zebra_record_encoding(zh, right_name);
+               zebra_octet_term_encoding(zh, right_name);
                q->charneg_response =
                    yaz_set_response_charneg (q->stream, charsets[i],
                                               0, selected);
@@ -260,6 +262,8 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r)
 int bend_search (void *handle, bend_search_rr *r)
 {
     ZebraHandle zh = (ZebraHandle) handle;
+    zint zhits = 0;
+    ZEBRA_RES res;
 
     r->hits = 0;
     r->errcode = 0;
@@ -271,15 +275,22 @@ int bend_search (void *handle, bend_search_rr *r)
         zebra_result (zh, &r->errcode, &r->errstring);
         return 0;
     }
-    yaz_log (YLOG_LOG, "ResultSet '%s'", r->setname);
+    yaz_log (YLOG_DEBUG, "ResultSet '%s'", r->setname);
     switch (r->query->which)
     {
     case Z_Query_type_1: case Z_Query_type_101:
-       zebra_search_RPN (zh, r->stream, r->query->u.type_1,
-                         r->setname, &r->hits);
-        zebra_result (zh, &r->errcode, &r->errstring);
-        if (!r->errcode)
+       res = zebra_search_RPN (zh, r->stream, r->query->u.type_1,
+                               r->setname, &zhits);
+       if (zebra_errCode(zh) == 0)
+       {
+           if (zhits >   2147483646)
+               r->hits = 2147483647;
+           else
+           r->hits = (int) zhits;
             search_terms (zh, r);
+       }
+       else
+           zebra_result (zh, &r->errcode, &r->errstring);
         break;
     case Z_Query_type_2:
        r->errcode = 107;
@@ -380,7 +391,7 @@ int bend_delete (void *handle, bend_delete_rr *rr)
 {
     ZebraHandle zh = (ZebraHandle) handle;
 
-    rr->delete_status =        zebra_deleleResultSet(zh, rr->function,
+    rr->delete_status =        zebra_deleteResultSet(zh, rr->function,
                                              rr->num_setnames, rr->setnames,
                                              rr->statuses);
     return 0;
@@ -636,7 +647,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                        }
                        else
                        {
-                           int r = -1;
+                           ZEBRA_RES r = ZEBRA_FAIL;
                            switch(action) {
                            case 1:
                                r = zebra_insert_record(
@@ -648,7 +659,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                                    rec->u.octet_aligned->buf,
                                    rec->u.octet_aligned->len,
                                    0);
-                               if (r)
+                               if (r == ZEBRA_FAIL)
                                {
                                    rr->errcode = 224;
                                    rr->errstring = "insert_record failed";
@@ -665,7 +676,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                                    rec->u.octet_aligned->buf,
                                    rec->u.octet_aligned->len,
                                    1);
-                               if (r)
+                               if (r == ZEBRA_FAIL)
                                {
                                    rr->errcode = 224;
                                    rr->errstring = "update_record failed";
@@ -681,7 +692,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
                                    rec->u.octet_aligned->buf,
                                    rec->u.octet_aligned->len,
                                    0);
-                               if (r)
+                               if (r == ZEBRA_FAIL)
                                {
                                    rr->errcode = 224;
                                    rr->errstring = "delete_record failed";