zebra_begin_trans got extra "write" flag. zebra_begin_read
[idzebra-moved-to-github.git] / index / zserver.c
index cfdd3dd..24b7648 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zserver.c,v 1.100 2002-10-22 12:51:08 adam Exp $
+/* $Id: zserver.c,v 1.104 2003-03-04 23:30:20 adam Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
    Index Data Aps
 
@@ -34,6 +34,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include <yaz/log.h>
 #include <yaz/ill.h>
+#include <yaz/yaz-util.h>
 
 #include "zserver.h"
 
@@ -67,7 +68,7 @@ bend_initresult *bend_init (bend_initrequest *q)
     q->implementation_name = "Zebra Information Server";
     q->implementation_version = "Zebra " ZEBRAVER;
 
-    logf (LOG_DEBUG, "bend_init");
+    yaz_log (LOG_DEBUG, "bend_init");
 
     sob = statserv_getcontrol ();
     if (!(zh = zebra_open (sob->handle)))
@@ -107,29 +108,54 @@ bend_initresult *bend_init (bend_initrequest *q)
         int num_langs = 0;
         int selected = 0;
         int i;
+        NMEM nmem = nmem_create();
 
-        NMEM nmem = nmem_create ();
         yaz_log (LOG_LOG, "character set and language negotiation");
 
         yaz_get_proposal_charneg (nmem, q->charneg_request,
                                   &charsets, &num_charsets,
                                   &langs, &num_langs, &selected);
+        
         for (i = 0; i < num_charsets; i++)
         {
-            yaz_log (LOG_LOG, "charset %d %s", i, charsets[i]);
+            const char *right_name = "";
+           /*
+            * FIXME! It is like rudiment :-))
+            * We have to support this short names of character sets,
+            * because a lot servers in Russia to use own in during
+            * character set and language negotiation still.
+            */
             
-            if (odr_set_charset (q->decode, "UTF-8", charsets[i]) == 0)
+            if (!yaz_matchstr(charsets[i], "win")) {
+                right_name = "WINDOWS-1251";
+            } else if (!yaz_matchstr(charsets[i], "koi")) {
+                right_name = "KOI8-R";
+            } else if (!yaz_matchstr(charsets[i], "iso")) {
+                right_name = "ISO-8859-5";
+            } else if (!yaz_matchstr(charsets[i], "dos")) {
+                right_name = "CP866";
+            } else if (!yaz_matchstr(charsets[i], "uni")) {
+                right_name = "UTF-8";
+            } else {
+                right_name = charsets[i];
+            }
+            if (odr_set_charset (q->decode, "UTF-8", right_name) == 0)
             {
-                odr_set_charset (q->stream, charsets[i], "UTF-8");
+                yaz_log (LOG_LOG, "charset %d %s (proper name %s): OK", i,
+                         charsets[i], right_name);
+                odr_set_charset (q->stream, right_name, "UTF-8");
                 if (selected)
-                    zebra_record_encoding (zh, charsets[i]);
-                q->charneg_response =
-                    yaz_set_response_charneg (q->stream, charsets[i],
+                    zebra_record_encoding (zh, right_name);
+               q->charneg_response =
+                   yaz_set_response_charneg (q->stream, right_name,
                                               0, selected);
-                break;
+               break;
+            } else {
+                yaz_log (LOG_LOG, "charset %d %s (proper name %s): unsupported", i,
+                         charsets[i], right_name);
             }
         }
-        nmem_destroy (nmem);
+        nmem_destroy(nmem);
     }
     return r;
 }
@@ -232,7 +258,7 @@ int bend_search (void *handle, bend_search_rr *r)
         zebra_result (zh, &r->errcode, &r->errstring);
         return 0;
     }
-    logf (LOG_LOG, "ResultSet '%s'", r->setname);
+    yaz_log (LOG_LOG, "ResultSet '%s'", r->setname);
     switch (r->query->which)
     {
     case Z_Query_type_1: case Z_Query_type_101:
@@ -493,7 +519,7 @@ int bend_esrequest (void *handle, bend_esrequest_rr *rr)
            if (notToKeep)
            {
                int i;
-                zebra_begin_trans (zh);
+                zebra_begin_trans (zh, 1);
                for (i = 0; i < notToKeep->num; i++)
                {
                    Z_External *rec = notToKeep->elements[i]->record;
@@ -623,7 +649,7 @@ static void bend_start (struct statserv_options_block *sob)
         char *pidfile = "zebrasrv.pid";
         int fd = creat (pidfile, 0666);
         if (fd == -1)
-            logf (LOG_WARN|LOG_ERRNO, "creat %s", pidfile);
+            yaz_log (LOG_WARN|LOG_ERRNO, "creat %s", pidfile);
         else
         {
            char pidstr[30];