Start work on ICU based regexp searches
[idzebra-moved-to-github.git] / bfile / bfile.c
index 7fb6a8c..07af217 100644 (file)
@@ -1,8 +1,5 @@
-/* $Id: bfile.c,v 1.51 2006-11-08 22:08:27 adam Exp $
-   Copyright (C) 1995-2006
-   Index Data ApS
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+   Copyright (C) 1994-2011 Index Data
 
 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
@@ -20,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -55,7 +55,7 @@ struct BFile_struct
 
 struct BFiles_struct {
     MFile_area commit_area;
-    MFile_area_struct *register_area;
+    MFile_area register_area;
     char *base;
     char *cache_fname;
 };
@@ -68,7 +68,7 @@ BFiles bfs_create (const char *spec, const char *base)
     bfs->cache_fname = 0;
     if (base)
         bfs->base = xstrdup(base);
-    bfs->register_area = mf_init("register", spec, base);
+    bfs->register_area = mf_init("register", spec, base, 0);
     if (!bfs->register_area)
     {
         bfs_destroy(bfs);
@@ -98,7 +98,8 @@ static FILE *open_cache(BFiles bfs, const char *flags)
 
 static void unlink_cache(BFiles bfs)
 {
-    unlink(bfs->cache_fname);
+    if (bfs->cache_fname)
+        unlink(bfs->cache_fname);
 }
 
 ZEBRA_RES bf_cache(BFiles bfs, const char *spec)
@@ -107,7 +108,7 @@ ZEBRA_RES bf_cache(BFiles bfs, const char *spec)
     {
         yaz_log(YLOG_LOG, "enabling shadow spec=%s", spec);
         if (!bfs->commit_area)
-           bfs->commit_area = mf_init("shadow", spec, bfs->base);
+           bfs->commit_area = mf_init("shadow", spec, bfs->base, 1);
         if (bfs->commit_area)
         {
             bfs->cache_fname = xmalloc(strlen(bfs->commit_area->dirs->name)+
@@ -127,19 +128,35 @@ ZEBRA_RES bf_cache(BFiles bfs, const char *spec)
     return ZEBRA_OK;
 }
 
-int bf_close(BFile bf)
+int bf_close2(BFile bf)
 {
+    int ret = 0;
     zebra_lock_rdwr_destroy(&bf->rdwr_lock);
     if (bf->cf)
-        cf_close(bf->cf);
+    {
+        if (cf_close(bf->cf))
+            ret = -1;
+    }
     if (bf->mf)
-        mf_close(bf->mf);
+    {
+        if (mf_close(bf->mf))
+            ret = -1;
+    }
     xfree(bf->alloc_buf);
     xfree(bf->magic);
     xfree(bf);
-    return 0;
+    return ret;
+}
+
+void bf_close(BFile bf)
+{
+    if (bf_close2(bf))
+    {
+        zebra_exit("bf_close");
+    }
 }
 
+
 #define HEADER_SIZE 256
 
 BFile bf_xopen(BFiles bfs, const char *name, int block_size, int wrflag,
@@ -238,7 +255,7 @@ int bf_xclose(BFile bf, int version, const char *more_info)
                break;
        }
     }
-    return bf_close(bf);
+    return bf_close2(bf);
 }
 
 BFile bf_open(BFiles bfs, const char *name, int block_size, int wflag)
@@ -305,7 +322,7 @@ int bf_read(BFile bf, zint no, int offset, int nbytes, void *buf)
 
     if (ret == -1)
     {
-        exit(1);
+        zebra_exit("bf_read");
     }
     return ret;
 }
@@ -332,7 +349,7 @@ int bf_write(BFile bf, zint no, int offset, int nbytes, const void *buf)
 
     if (ret == -1)
     {
-        exit(1);
+        zebra_exit("bf_write");
     }
     return ret;
 }
@@ -371,7 +388,7 @@ void bf_reset(BFiles bfs)
     unlink_cache(bfs);
 }
 
-void bf_commitExec(BFiles bfs)
+int bf_commitExec(BFiles bfs)
 {
     FILE *inf;
     int block_size;
@@ -379,24 +396,40 @@ void bf_commitExec(BFiles bfs)
     MFile mf;
     CFile cf;
     int first_time;
+    int r = 0;
 
     assert(bfs->commit_area);
     if (!(inf = open_cache(bfs, "rb")))
     {
         yaz_log(YLOG_LOG, "No commit file");
-        return ;
+        return -1;
     }
     while (fscanf(inf, "%s %d", path, &block_size) == 2)
     {
         mf = mf_open(bfs->register_area, path, block_size, 1);
+        if (!mf)
+        {
+            r = -1;
+            break;
+        }
         cf = cf_open(mf, bfs->commit_area, path, block_size, 0, &first_time);
+        if (!cf)
+        {
+            mf_close(mf);
+            r = -1;
+            break;
+        }
 
-        cf_commit(cf);
+        r = cf_commit(cf);
 
         cf_close(cf);
         mf_close(mf);
+
+        if (r)
+            break;
     }
     fclose(inf);
+    return r;
 }
 
 void bf_commitClean(BFiles bfs, const char *spec)
@@ -432,11 +465,11 @@ int bf_alloc(BFile bf, int no, zint *blocks)
            memset(buf, '\0', sizeof(buf));
 
            blocks[i] = bf->free_list;
-           if (!bf_read(bf, bf->free_list, 0, sizeof(buf), buf))
+           if (bf_read(bf, bf->free_list, 0, sizeof(buf), buf) != 1)
            {
                yaz_log(YLOG_WARN, "Bad freelist entry " ZINT_FORMAT,
                        bf->free_list);
-               exit(1);
+                return -1;
            }
            zebra_zint_decode(&cp, &bf->free_list);
        }
@@ -480,6 +513,7 @@ int bfs_shadow_directory_stat(BFiles bfs, int no, const char **directory,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab