/*
- * 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.6 1996-11-08 11:15:29 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.
+ *
+ * Revision 1.7 1997/02/12 20:42:43 adam
+ * Bug fix: during isc_merge operations, some pages weren't marked dirty
+ * even though they should be. At this point the merge operation marks
+ * a page dirty if the previous page changed at all. A better approach is
+ * to mark it dirty if the last key written changed in previous page.
+ *
+ * Revision 1.6 1996/11/08 11:15:29 adam
* Number of keys in chain are stored in first block and the function
* to retrieve this information, isc_pp_num is implemented.
*
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;
}
-ISAMC isc_open (const char *name, int writeflag, ISAMC_M method)
+ISAMC isc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M method)
{
ISAMC is;
ISAMC_filecat filecat;
char fname[512];
sprintf (fname, "%s%c", name, i+'A');
- is->files[i].bf = bf_open (fname, is->method->filecat[i].bsize,
+ is->files[i].bf = bf_open (bfs, fname, is->method->filecat[i].bsize,
writeflag);
is->files[i].head_is_dirty = 0;
if (!bf_read (is->files[i].bf, 0, 0, sizeof(ISAMC_head),
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;
int isc_read_block (ISAMC is, int cat, int pos, char *dst)
{
++(is->files[cat].no_reads);
- if (is->method->debug > 2)
- logf (LOG_LOG, "isc: read_block %d %d", cat, pos);
return bf_read (is->files[cat].bf, pos, 0, 0, dst);
}
if ((nb = is->files[cat].fc_list[j]) && (!block || nb < block))
{
is->files[cat].fc_list[j] = 0;
+ block = nb;
break;
}
}
assert (pp->next != pp->pos);
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 next=%d",
+ pp->size, pp->cat, pp->pos, pp->next);
}
return pp;
}
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;
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);
isc_release_block (is, pp->cat, pp->pos);
(*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 next=%d",
+ pp->size, pp->cat, pp->pos, pp->next);
return 2;
}
(*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src);