/*
- * Copyright (C) 1994-1997, Index Data I/S
+ * Copyright (C) 1994-1998, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: invstat.c,v $
- * Revision 1.5 1997-09-17 12:19:13 adam
+ * Revision 1.6 1998-03-06 13:54:02 adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.5 1997/09/17 12:19:13 adam
* Zebra version corresponds to YAZ version 1.4.
* Changed Zebra server so that it doesn't depend on global common_resource.
*
logf (LOG_FATAL, "dict_open fail");
exit (1);
}
- if (res_get_match (common_resource, "isam", "c", NULL))
+ if (!res_get_match (common_resource, "isam", "i", NULL))
{
isamc = isc_open (bfs, FNAME_ISAMC, 0, key_isamc_m (common_resource));
if (!isamc)
/*
- * 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.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[] = {
+#if SMALL_TEST
+ { 32, 28, 0, 3 },
+ { 64, 54, 30, 0 },
+#else
{ 32, 28, 0, 20 },
{ 512, 490, 100, 20 },
{ 4096, 3950, 1000, 20 },
{32768, 32000, 10000, 0 },
+#endif
};
ISAMC_M m = xmalloc (sizeof(*m));
m->filecat = def_cat;
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;
}
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);
(*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);
/*
- * Copyright (c) 1996, Index Data.
+ * Copyright (c) 1996-1998, Index Data.
* See the file LICENSE for details.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: merge.c,v $
- * Revision 1.5 1997-02-12 20:42:43 adam
+ * Revision 1.6 1998-03-06 13:54:03 adam
+ * Fixed two nasty bugs in isc_merge.
+ *
+ * Revision 1.5 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
if (is->method->debug > 2)
logf (LOG_LOG, "isc: flush A %d sections", ptr);
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
- 0, &numKeys);
-
+ 0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
mb[0].dirty = mb[ptr-1].dirty;
memcpy (r_buf, r_buf + mb[ptr-1].offset,
if (is->method->debug > 2)
logf (LOG_LOG, "isc: flush B %d sections", ptr-1);
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
- 0, &numKeys);
-
+ 0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
mb[0].dirty = mb[ptr-1].dirty;
memcpy (r_buf, r_buf + mb[ptr-1].offset,
logf (LOG_LOG, "isc: release C");
isc_release_block (is, pp->cat, mb[ptr].block);
mb[ptr].block = 0;
- mb[ptr].dirty = 1;
+ if (ptr > 0)
+ mb[ptr-1].dirty = 1;
}
}