-/* $Id: isamb.c,v 1.74 2005-03-18 12:05:11 adam Exp $
+/* $Id: isamb.c,v 1.75 2005-03-21 17:20:54 adam Exp $
Copyright (C) 1995-2005
Index Data ApS
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
either it's empty (new) or all file items have been read in
previous loop */
- /* determine maximum ptr for tail */
- if (half2)
- {
- /* split already. No more splits - fill up to one full (Extra) block */
- maxp = half2 + b->file[b->no_cat-1].head.block_max;
- }
- else
- {
- /* no split. Fill up to 1+1/4 block */
- maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
- }
+ maxp = dst_buf + b->file[b->no_cat-1].head.block_max + quater;
while (lookahead_item)
{
char *dst_item;
/* 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;
-/* $Id: tstisamb.c,v 1.18 2005-03-18 12:05:11 adam Exp $
+/* $Id: tstisamb.c,v 1.19 2005-03-21 17:20:54 adam Exp $
Copyright (C) 1995-2005
Index Data ApS
isamb_unlink(isb, isamc_p);
}
+void tst_x(ISAMB isb)
+{
+ ISAMC_I isamc_i;
+ ISAMB_P isamb_p = 0;
+ struct read_info ri;
+
+ isamc_i.clientData = &ri;
+ isamc_i.read_item = code_read;
+ ri.no = 1000;
+ ri.step = 1;
+ ri.max = 1500;
+
+ isamb_p = isamb_merge (isb, isamb_p , &isamc_i);
+
+ ri.no = 1;
+ ri.step = 1;
+ ri.max = 500;
+
+ isamb_p = isamb_merge (isb, isamb_p , &isamc_i);
+}
+
void tst_append(ISAMB isb, int n)
{
ISAMC_I isamc_i;
tst_forward(isb, 10000);
- tst_append(isb, 10000);
+ tst_x(isb);
+
+ tst_append(isb, 1000);
/* close isam handle */
isamb_close(isb);