-/* $Id: isamb.c,v 1.71 2005-01-16 23:14:57 adam Exp $
+/* $Id: isamb.c,v 1.75 2005-03-21 17:20:54 adam Exp $
Copyright (C) 1995-2005
Index Data ApS
while (pos > 127)
{
- *bp++ = 128 | (pos & 127);
+ *bp++ = (unsigned char) (128 | (pos & 127));
pos = pos >> 7;
}
- *bp++ = pos;
+ *bp++ = (unsigned char) pos;
*dst = (char *) bp;
}
#else
decode_ptr(&src, &isamb->file[i].head.first_block);
decode_ptr(&src, &isamb->file[i].head.last_block);
decode_ptr(&src, &zint_tmp);
- isamb->file[i].head.block_size = zint_tmp;
+ isamb->file[i].head.block_size = (int) zint_tmp;
decode_ptr(&src, &zint_tmp);
- isamb->file[i].head.block_max = zint_tmp;
+ isamb->file[i].head.block_max = (int) zint_tmp;
decode_ptr(&src, &isamb->file[i].head.free_list);
}
assert (isamb->file[i].head.block_size >= isamb->file[i].head.block_offset);
}
}
-static int get_block (ISAMB b, ISAMC_P pos, char *userbuf, int wr)
+static int cache_block (ISAMB b, ISAMC_P pos, char *userbuf, int wr)
{
int cat = (int) (pos&CAT_MASK);
int off = (int) (((pos/CAT_MAX) &
*ce_last = 0; /* remove the last entry from list */
if (ce_this->dirty)
{
- yaz_log(b->log_io, "bf_write: get_block");
+ yaz_log(b->log_io, "bf_write: cache_block");
bf_write(b->file[cat].bf, ce_this->pos, 0, 0, ce_this->buf);
}
xfree(ce_this->buf);
b->file[cat].cache_entries = ce_this;
ce_this->buf = xmalloc(ISAMB_CACHE_ENTRY_SIZE);
ce_this->pos = norm;
- yaz_log(b->log_io, "bf_read: get_block");
+ yaz_log(b->log_io, "bf_read: cache_block");
if (!bf_read(b->file[cat].bf, norm, 0, 0, ce_this->buf))
memset (ce_this->buf, 0, ISAMB_CACHE_ENTRY_SIZE);
if (wr)
p->buf = xmalloc(b->file[cat].head.block_size);
p->cbuf = 0;
- if (!get_block (b, pos, p->buf, 0))
+ 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))
{
p->pos = b->file[cat].head.free_list;
assert((p->pos & CAT_MASK) == cat);
- if (!get_block (b, p->pos, p->buf, 0))
+ if (!cache_block (b, p->pos, p->buf, 0))
{
yaz_log(b->log_io, "bf_read: new_block");
if (!bf_read(b->file[cat].bf, p->pos/CAT_MAX, 0, 0, p->buf))
p->pos, p->cat, p->pos/CAT_MAX);
memcpy (p->buf, &b->file[p->cat].head.free_list, sizeof(zint));
b->file[p->cat].head.free_list = p->pos;
- if (!get_block (b, p->pos, p->buf, 1))
+ if (!cache_block (b, p->pos, p->buf, 1))
{
yaz_log(b->log_io, "bf_write: close_block (deleted)");
bf_write(b->file[p->cat].bf, p->pos/CAT_MAX, 0, 0, p->buf);
p->buf[2] = size >> 8;
encode_ptr(&dst, p->no_items);
check_block(b, p);
- if (!get_block (b, p->pos, p->buf, 1))
+ if (!cache_block (b, p->pos, p->buf, 1))
{
yaz_log(b->log_io, "bf_write: close_block");
bf_write(b->file[p->cat].bf, p->pos/CAT_MAX, 0, 0, p->buf);
int cut_item_size = 0;
int no_items = 0; /* number of items (total) */
int no_items_1 = 0; /* number of items (first half) */
+ int inserted_dst_bytes = 0;
if (p && p->size)
{
{
const char *dst_item = 0; /* resulting item to be inserted */
char *lookahead_next;
+ char *dst_0 = dst;
int d = -1;
if (lookahead_item)
else
dst_item = file_item_buf;
-
if (!*lookahead_mode && d == 0)
{
/* it's a deletion and they match so there is nothing to be
{
/* we must move the lookahead pointer */
- if (dst > maxp)
+ inserted_dst_bytes += (dst - dst_0);
+ if (inserted_dst_bytes >= quater)
/* no more room. Mark lookahead as "gone".. */
lookahead_item = 0;
else
}
}
}
- maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
+
/* this loop runs when we are "appending" to a leaf page. That is
either it's empty (new) or all file items have been read in
previous loop */
+
+ maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
while (lookahead_item)
{
char *dst_item;
const char *src = lookahead_item;
char *dst_0 = dst;
- /* compare lookahead with max item */
+ /* if we have a lookahead item, we stop if we exceed the value of it */
if (max_item &&
(*b->method->compare_item)(max_item, lookahead_item) <= 0)
{
/* first half */
p->size = half1 - dst_buf;
+ assert(p->size <= b->file[p->cat].head.block_max);
memcpy (p->bytes, dst_buf, half1 - dst_buf);
p->no_items = no_items_1;
memcpy (first_dst, half2, dst - half2);
(*sp2)->size = (first_dst - (*sp2)->bytes) + (dst - half2);
+ assert((*sp2)->size <= b->file[p->cat].head.block_max);
(*sp2)->no_items = no_items - no_items_1;
(*sp2)->dirty = 1;
p->dirty = 1;
return isamb_pp_open_x(isamb, pos, 0, scope);
}
-void isamb_pp_close_x(ISAMB_PP pp, int *size, int *blocks)
+void isamb_pp_close_x(ISAMB_PP pp, zint *size, zint *blocks)
{
int i;
if (!pp)
assert(current);
assert(p->leaf);
- *total = pp->block[0]->no_items;
+ *total = (double) (pp->block[0]->no_items);
*current = (double) pp->returned_numbers;
#if ISAMB_DEBUG
yaz_log(YLOG_LOG, "isamb_pp_pos returning: cur= %0.1f tot=%0.1f rn="