Towards GPL
[idzebra-moved-to-github.git] / index / zebraapi.c
index 6537b0d..9e48592 100644 (file)
@@ -1,9 +1,26 @@
-/*
- * Copyright (C) 1995-2002, Index Data
- * All rights reserved.
- *
- * $Id: zebraapi.c,v 1.61 2002-07-03 14:10:12 adam Exp $
- */
+/* $Id: zebraapi.c,v 1.65 2002-08-02 19:26:55 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+   Index Data Aps
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Zebra; see the file LICENSE.zebra.  If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+
 
 #include <assert.h>
 #include <stdio.h>
@@ -53,6 +70,7 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg);
 ZebraHandle zebra_open (ZebraService zs)
 {
     ZebraHandle zh;
+    const char *default_encoding;
 
     if (!zs)
         return 0;
@@ -82,6 +100,21 @@ ZebraHandle zebra_open (ZebraService zs)
 
     zh->shadow_enable = 1;
 
+    default_encoding = res_get_def(zs->global_res, "encoding", "ISO-8859-1");
+    zh->record_encoding = xstrdup (default_encoding);
+#if HAVE_ICONV_H
+    zh->iconv_to_utf8 =
+        iconv_open ("UTF-8", default_encoding);
+    if (zh->iconv_to_utf8 == (iconv_t)(-1))
+        yaz_log (LOG_WARN, "iconv: %s to UTF-8 unsupported",
+           default_encoding);
+    zh->iconv_from_utf8 =
+        iconv_open (default_encoding, "UTF-8");
+    if (zh->iconv_to_utf8 == (iconv_t)(-1))
+        yaz_log (LOG_WARN, "iconv: UTF-8 to %s unsupported",
+           default_encoding);
+#endif
+
     zebra_mutex_cond_lock (&zs->session_lock);
 
     zh->next = zs->sessions;
@@ -152,7 +185,7 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name,
     yaz_log (LOG_LOG, "zebra_register_open rw = %d useshadow=%d p=%p",
              rw, useshadow, reg);
 
-    reg->dh = data1_create ();
+    reg->dh = data1_createx (DATA1_FLAG_XML);
     if (!reg->dh)
         return 0;
     reg->bfs = bfs_create (res_get (res, "register"), reg_path);
@@ -260,7 +293,29 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name,
        struct ISAMC_M_s isamc_m;
        
        if (!(reg->isamb = isamb_open (reg->bfs, "isamb",
-                                       rw, key_isamc_m(res, &isamc_m))))
+                                       rw, key_isamc_m(res, &isamc_m), 0)))
+       {
+           logf (LOG_WARN, "isamb_open");
+           return 0;
+       }
+    }
+    if (res_get_match (res, "isam", "bc", ISAM_DEFAULT))
+    {
+       struct ISAMC_M_s isamc_m;
+       
+       if (!(reg->isamb = isamb_open (reg->bfs, "isamb",
+                                       rw, key_isamc_m(res, &isamc_m), 1)))
+       {
+           logf (LOG_WARN, "isamb_open");
+           return 0;
+       }
+    }
+    if (res_get_match (res, "isam", "null", ISAM_DEFAULT))
+    {
+       struct ISAMC_M_s isamc_m;
+       
+       if (!(reg->isamb = isamb_open (reg->bfs, "isamb",
+                                       rw, key_isamc_m(res, &isamc_m), -1)))
        {
            logf (LOG_WARN, "isamb_open");
            return 0;
@@ -375,6 +430,14 @@ void zebra_close (ZebraHandle zh)
         zebra_register_close (zh->service, zh->reg);
     zebra_close_res (zh);
 
+    xfree (zh->record_encoding);
+#if HAVE_ICONV_H
+    if (zh->iconv_to_utf8 != (iconv_t) (-1))
+        iconv_close (zh->iconv_to_utf8);
+    if (zh->iconv_from_utf8 != (iconv_t) (-1))
+        iconv_close (zh->iconv_from_utf8);
+#endif
+
     xfree (zh->admin_databaseName);
     zebra_mutex_cond_lock (&zs->session_lock);
     zebra_lock_destroy (zh->lock_normal);
@@ -1282,3 +1345,9 @@ void zebra_shadow_enable (ZebraHandle zh, int value)
     zh->shadow_enable = value;
 }
 
+int zebra_record_encoding (ZebraHandle zh, const char *encoding)
+{
+    xfree (zh->record_encoding);
+    zh->record_encoding = xstrdup (encoding);
+    return 0;
+}