New functions isc_block_used and isc_block_size. Fixed 'leak'
[idzebra-moved-to-github.git] / isamc / isamc.c
index 6d64d79..44155d2 100644 (file)
@@ -1,10 +1,20 @@
 /*
- * Copyright (c) 1995-1996, Index Data.
+ * Copyright (c) 1995-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: isamc.c,v $
- * Revision 1.8  1997-09-17 12:19:20  adam
+ * Revision 1.11  1998-03-13 15:30:50  adam
+ * New functions isc_block_used and isc_block_size. Fixed 'leak'
+ * in isc_alloc_block.
+ *
+ * Revision 1.10  1998/03/11 11:18:18  adam
+ * Changed the isc_merge to take into account the mfill (minimum-fill).
+ *
+ * Revision 1.9  1998/03/06 13:54:02  adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.8  1997/09/17 12:19:20  adam
  * Zebra version corresponds to YAZ version 1.4.
  * Changed Zebra server so that it doesn't depend on global common_resource.
  *
 static void release_fc (ISAMC is, int cat);
 static void init_fc (ISAMC is, int cat);
 
+#define SMALL_TEST 0
+
 ISAMC_M isc_getmethod (void)
 {
     static struct ISAMC_filecat_s def_cat[] = {
-        {   32,    28,     0,    20 },
-        {  512,   490,   100,    20 },
-        { 4096,  3950,  1000,    20 },
-        {32768, 32000, 10000,     0 },
+#if SMALL_TEST
+        {   32,    28,     0,    3 },
+       {   64,    54,    30,    0 },
+#else
+        {   32,    28,    24,    20 },
+        {  512,   490,   350,    20 },
+        { 4096,  3950,  4200,    20 },
+        {32768, 32000, 30000,     0 },
+#endif
     };
     ISAMC_M m = xmalloc (sizeof(*m));
     m->filecat = def_cat;
@@ -148,6 +165,21 @@ ISAMC isc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M method)
     return is;
 }
 
+int isc_block_used (ISAMC is, int type)
+{
+    if (type < 0 || type >= is->no_files)
+       return -1;
+    return is->files[type].head.lastblock-1;
+}
+
+int isc_block_size (ISAMC is, int type)
+{
+    ISAMC_filecat filecat = is->method->filecat;
+    if (type < 0 || type >= is->no_files)
+       return -1;
+    return filecat[type].bsize;
+}
+
 int isc_close (ISAMC is)
 {
     int i;
@@ -233,6 +265,7 @@ int isc_alloc_block (ISAMC is, int cat)
             if ((nb = is->files[cat].fc_list[j]) && (!block || nb < block))
             {
                 is->files[cat].fc_list[j] = 0;
+               block = nb;
                 break;
             }
     }
@@ -334,8 +367,8 @@ ISAMC_PP isc_pp_open (ISAMC is, ISAMC_P ipos)
         pp->offset = src - pp->buf; 
         assert (pp->offset == ISAMC_BLOCK_OFFSET_1);
         if (is->method->debug > 2)
-            logf (LOG_LOG, "isc: read_block size=%d %d %d",
-                 pp->size, pp->cat, pp->pos);
+            logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d",
+                 pp->size, pp->cat, pp->pos, pp->next);
     }
     return pp;
 }
@@ -346,7 +379,11 @@ int isc_pp_read (ISAMC_PP pp, void *buf)
     return isc_read_item (pp, (char **) &buf);
 }
 
-/* returns non-zero if item could be read; 0 otherwise */
+/* read one item from file - decode and store it in *dst.
+   Returns
+     0 if end-of-file
+     1 if item could be read ok and NO boundary
+     2 if item could be read ok and boundary */
 int isc_read_item (ISAMC_PP pp, char **dst)
 {
     ISAMC is = pp->is;
@@ -354,10 +391,12 @@ int isc_read_item (ISAMC_PP pp, char **dst)
 
     if (pp->offset >= pp->size)
     {
+       /* out new block position */
         pp->pos = pp->next;
         if (!pp->pos)
-            return 0;
+            return 0;    /* end of file */
         src = pp->buf;
+       /* read block and save 'next' and 'size' entry */
         isc_read_block (is, pp->cat, pp->pos, src);
         memcpy (&pp->next, src, sizeof(pp->next));
         src += sizeof(pp->next);
@@ -371,8 +410,8 @@ int isc_read_item (ISAMC_PP pp, char **dst)
         (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src);
         pp->offset = src - pp->buf; 
         if (is->method->debug > 2)
-            logf (LOG_LOG, "isc: read_block size=%d %d %d",
-                 pp->size, pp->cat, pp->pos);
+            logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d",
+                 pp->size, pp->cat, pp->pos, pp->next);
         return 2;
     }
     (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src);