Using timing utility
[idzebra-moved-to-github.git] / isamb / isamb.c
index dd2f84a..61d7036 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: isamb.c,v 1.84 2006-09-26 12:56:33 adam Exp $
+/* $Id: isamb.c,v 1.87 2006-12-07 19:23:56 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -53,8 +53,9 @@ struct ISAMB_head {
 
 #define ISAMB_MAX_LEVEL 10
 /* approx 2*max page + max size of item */
-#define DST_BUF_SIZE 16840
+#define DST_BUF_SIZE (2*4096+300)
 
+/* should be maximum block size of multiple thereof */
 #define ISAMB_CACHE_ENTRY_SIZE 4096
 
 /* CAT_MAX: _must_ be power of 2 */
@@ -197,14 +198,28 @@ ISAMB isamb_open(BFiles bfs, const char *name, int writeflag, ISAMC_M *method,
     for (i = 0; i<ISAMB_MAX_LEVEL; i++)
        isamb->skipped_nodes[i] = isamb->accessed_nodes[i] = 0;
 
-    assert(cache == 0);
+    if (cache == -1)
+    {
+        yaz_log(YLOG_WARN, "isamb_open %s. Degraded TEST mode", name);
+    }
+    else
+    {
+        assert(cache == 0 || cache == 1);
+    }
     isamb->file = xmalloc(sizeof(*isamb->file) * isamb->no_cat);
+
+    for (i = 0; i < isamb->no_cat; i++)
+    {
+        isamb->file[i].bf = 0;
+        isamb->file[i].head_dirty = 0;
+        isamb->file[i].cache_entries = 0;
+    }
+
     for (i = 0; i < isamb->no_cat; i++)
     {
         char fname[DST_BUF_SIZE];
        char hbuf[DST_BUF_SIZE];
-        isamb->file[i].cache_entries = 0;
-        isamb->file[i].head_dirty = 0;
+
         sprintf(fname, "%s%c", name, i+'A');
         if (cache)
             isamb->file[i].bf = bf_open(bfs, fname, ISAMB_CACHE_ENTRY_SIZE,
@@ -212,10 +227,17 @@ ISAMB isamb_open(BFiles bfs, const char *name, int writeflag, ISAMC_M *method,
         else
             isamb->file[i].bf = bf_open(bfs, fname, b_size, writeflag);
 
+        if (!isamb->file[i].bf)
+        {
+            isamb_close(isamb);
+            return 0;
+        }
+
         /* fill-in default values (for empty isamb) */
        isamb->file[i].head.first_block = ISAMB_CACHE_ENTRY_SIZE/b_size+1;
        isamb->file[i].head.last_block = isamb->file[i].head.first_block;
        isamb->file[i].head.block_size = b_size;
+        assert(b_size <= ISAMB_CACHE_ENTRY_SIZE);
 #if ISAMB_PTR_CODEC
        if (i == isamb->no_cat-1 || b_size > 128)
            isamb->file[i].head.block_offset = 8;
@@ -414,7 +436,8 @@ void isamb_close (ISAMB isamb)
                bf_write(isamb->file[i].bf, pos, 0, 0, hbuf + pos*b_size);
            }
        }
-        bf_close (isamb->file[i].bf);
+        if (isamb->file[i].bf)
+            bf_close (isamb->file[i].bf);
     }
     xfree(isamb->file);
     xfree(isamb->method);
@@ -448,11 +471,11 @@ static struct ISAMB_block *open_block(ISAMB b, ISAM_P pos)
     if (!cache_block (b, pos, p->buf, 0))
     {
         yaz_log(b->log_io, "bf_read: open_block");
-        if (!bf_read(b->file[cat].bf, pos/CAT_MAX, 0, 0, p->buf))
+        if (bf_read(b->file[cat].bf, pos/CAT_MAX, 0, 0, p->buf) != 1)
         {
             yaz_log(YLOG_FATAL, "isamb: read fail for pos=%ld block=%ld",
                      (long) pos, (long) pos/CAT_MAX);
-            abort();
+            zebra_exit("isamb:open_block");
         }
     }
     p->bytes = (char *)p->buf + offset;
@@ -498,7 +521,7 @@ struct ISAMB_block *new_block (ISAMB b, int leaf, int cat)
             {
                 yaz_log(YLOG_FATAL, "isamb: read fail for pos=%ld block=%ld",
                          (long) p->pos/CAT_MAX, (long) p->pos/CAT_MAX);
-                abort ();
+                zebra_exit("isamb:new_block");
             }
         }
         yaz_log(b->log_freelist, "got block " ZINT_FORMAT " from freelist %d:" ZINT_FORMAT, p->pos,
@@ -875,7 +898,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
                 if (!*lookahead_mode)
                 {
                     yaz_log(YLOG_WARN, "isamb: Inconsistent register (1)");
-                    assert (*lookahead_mode);
+                    assert(*lookahead_mode);
                 }
             }
             else
@@ -993,7 +1016,7 @@ int insert_leaf (ISAMB b, struct ISAMB_block **sp1, void *lookahead_item,
         {
            /* this is append. So a delete is bad */
             yaz_log(YLOG_WARN, "isamb: Inconsistent register (2)");
-            abort();
+            assert(*lookahead_mode);
         }
         else if (!half1 && dst > tail_cut)
         {