X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isamb%2Fisamb.c;h=bb5139300cd1de37743d70eb00ed90d55d6f821e;hb=8b2d919ca1ab2134c098057bb0965ec7dc42cd9d;hp=294683d01ac3cdbd267c42fd8e496f058bd1a7aa;hpb=ecf94fc25324414287d3bbfbeba4440e558edd17;p=idzebra-moved-to-github.git diff --git a/isamb/isamb.c b/isamb/isamb.c index 294683d..bb51393 100644 --- a/isamb/isamb.c +++ b/isamb/isamb.c @@ -1,5 +1,5 @@ -/* $Id: isamb.c,v 1.76 2005-04-13 13:03:47 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: isamb.c,v 1.83 2006-08-14 10:40:17 adam Exp $ + Copyright (C) 1995-2006 Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include @@ -196,7 +196,7 @@ ISAMB isamb_open(BFiles bfs, const char *name, int writeflag, ISAMC_M *method, isamb->skipped_numbers = 0; isamb->returned_numbers = 0; for (i = 0; iskipped_nodes[i] = isamb->accessed_nodes[i] = 0; + isamb->skipped_nodes[i] = isamb->accessed_nodes[i] = 0; assert(cache == 0); isamb->file = xmalloc(sizeof(*isamb->file) * isamb->no_cat); @@ -299,7 +299,7 @@ static void flush_blocks (ISAMB b, int cat) } } -static int cache_block (ISAMB b, ISAM_P pos, char *userbuf, int wr) +static int cache_block (ISAMB b, ISAM_P pos, unsigned char *userbuf, int wr) { int cat = (int) (pos&CAT_MASK); int off = (int) (((pos/CAT_MAX) & @@ -456,7 +456,7 @@ static struct ISAMB_block *open_block(ISAMB b, ISAM_P pos) abort(); } } - p->bytes = p->buf + offset; + p->bytes = (char *)p->buf + offset; p->leaf = p->buf[0]; p->size = (p->buf[1] + 256 * p->buf[2]) - offset; if (p->size < 0) @@ -465,7 +465,7 @@ static struct ISAMB_block *open_block(ISAMB b, ISAM_P pos) p->size, pos); } assert (p->size >= 0); - src = p->buf + 3; + src = (char*) p->buf + 3; decode_ptr(&src, &p->no_items); p->offset = 0; @@ -509,7 +509,7 @@ struct ISAMB_block *new_block (ISAMB b, int leaf, int cat) p->cat = cat; b->file[cat].head_dirty = 1; memset (p->buf, 0, b->file[cat].head.block_size); - p->bytes = p->buf + b->file[cat].head.block_offset; + p->bytes = (char*)p->buf + b->file[cat].head.block_offset; p->leaf = leaf; p->size = 0; p->dirty = 1; @@ -592,7 +592,7 @@ void close_block(ISAMB b, struct ISAMB_block *p) { int offset = b->file[p->cat].head.block_offset; int size = p->size + offset; - char *dst = p->buf + 3; + char *dst = (char*)p->buf + 3; assert (p->size >= 0); /* memset becuase encode_ptr usually does not write all bytes */ @@ -732,11 +732,12 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item, p->size = dst - dst_buf; assert (p->size >= 0); - if (p->size <= b->file[p->cat].head.block_max) { /* it fits OK in this block */ memcpy (startp, dst_buf, dst - dst_buf); + + close_block(b, sub_p2); } else { @@ -754,6 +755,9 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item, src = dst_buf; endp = dst; + p->dirty = 1; + close_block(b, sub_p2); + half = src + b->file[p->cat].head.block_size/2; decode_ptr(&src, &pos); @@ -807,8 +811,7 @@ int insert_int (ISAMB b, struct ISAMB_block *p, void *lookahead_item, (*sp)->no_items = p->no_items - no_items_first_half; p->no_items = no_items_first_half; } - p->dirty = 1; - close_block(b, sub_p2); + p->dirty = 1; } close_block(b, sub_p1); (*b->method->codec.stop)(c1); @@ -1799,10 +1802,10 @@ int isamb_pp_forward (ISAMB_PP pp, void *buf, const void *untilbuf) void isamb_pp_pos(ISAMB_PP pp, double *current, double *total) { /* return an estimate of the current position and of the total number of */ /* occureences in the isam tree, based on the current leaf */ - struct ISAMB_block *p = pp->block[pp->level]; assert(total); assert(current); - assert(p->leaf); + + /* if end-of-stream PP may not be leaf */ *total = (double) (pp->block[0]->no_items); *current = (double) pp->returned_numbers; @@ -1944,3 +1947,11 @@ again: } return 1; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +