-/* $Id: isamb.c,v 1.81 2005-08-19 12:58:01 adam Exp $
- Copyright (C) 1995-2005
+/* $Id: isamb.c,v 1.87 2006-12-07 19:23:56 adam Exp $
+ Copyright (C) 1995-2006
Index Data ApS
This file is part of the Zebra server.
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 <stdlib.h>
#define ISAMB_MAX_LEVEL 10
/* approx 2*max page + max size of item */
-#define DST_BUF_SIZE 16840
+#define DST_BUF_SIZE (2*4096+300)
+/* should be maximum block size of multiple thereof */
#define ISAMB_CACHE_ENTRY_SIZE 4096
/* CAT_MAX: _must_ be power of 2 */
#define decode_item_len decode_ptr
#if ISAMB_PTR_CODEC
-static void decode_ptr(const char **src1, zint *pos)
+static void decode_ptr(const char **src, zint *pos)
{
- const unsigned char **src = (const unsigned char **) src1;
zint d = 0;
unsigned char c;
unsigned r = 0;
- while (((c = *(*src)++) & 128))
+ while (((c = *(const unsigned char *)((*src)++)) & 128))
{
d += ((zint) (c & 127) << r);
r += 7;
for (i = 0; i<ISAMB_MAX_LEVEL; i++)
isamb->skipped_nodes[i] = isamb->accessed_nodes[i] = 0;
- assert(cache == 0);
+ if (cache == -1)
+ {
+ yaz_log(YLOG_WARN, "isamb_open %s. Degraded TEST mode", name);
+ }
+ else
+ {
+ assert(cache == 0 || cache == 1);
+ }
isamb->file = xmalloc(sizeof(*isamb->file) * isamb->no_cat);
+
+ for (i = 0; i < isamb->no_cat; i++)
+ {
+ isamb->file[i].bf = 0;
+ isamb->file[i].head_dirty = 0;
+ isamb->file[i].cache_entries = 0;
+ }
+
for (i = 0; i < isamb->no_cat; i++)
{
char fname[DST_BUF_SIZE];
char hbuf[DST_BUF_SIZE];
- isamb->file[i].cache_entries = 0;
- isamb->file[i].head_dirty = 0;
+
sprintf(fname, "%s%c", name, i+'A');
if (cache)
isamb->file[i].bf = bf_open(bfs, fname, ISAMB_CACHE_ENTRY_SIZE,
else
isamb->file[i].bf = bf_open(bfs, fname, b_size, writeflag);
+ if (!isamb->file[i].bf)
+ {
+ isamb_close(isamb);
+ return 0;
+ }
+
/* fill-in default values (for empty isamb) */
isamb->file[i].head.first_block = ISAMB_CACHE_ENTRY_SIZE/b_size+1;
isamb->file[i].head.last_block = isamb->file[i].head.first_block;
isamb->file[i].head.block_size = b_size;
+ assert(b_size <= ISAMB_CACHE_ENTRY_SIZE);
#if ISAMB_PTR_CODEC
if (i == isamb->no_cat-1 || b_size > 128)
isamb->file[i].head.block_offset = 8;
bf_write(isamb->file[i].bf, pos, 0, 0, hbuf + pos*b_size);
}
}
- bf_close (isamb->file[i].bf);
+ if (isamb->file[i].bf)
+ bf_close (isamb->file[i].bf);
}
xfree(isamb->file);
xfree(isamb->method);
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))
+ if (bf_read(b->file[cat].bf, pos/CAT_MAX, 0, 0, p->buf) != 1)
{
yaz_log(YLOG_FATAL, "isamb: read fail for pos=%ld block=%ld",
(long) pos, (long) pos/CAT_MAX);
- abort();
+ zebra_exit("isamb:open_block");
}
}
p->bytes = (char *)p->buf + offset;
{
yaz_log(YLOG_FATAL, "isamb: read fail for pos=%ld block=%ld",
(long) p->pos/CAT_MAX, (long) p->pos/CAT_MAX);
- abort ();
+ zebra_exit("isamb:new_block");
}
}
yaz_log(b->log_freelist, "got block " ZINT_FORMAT " from freelist %d:" ZINT_FORMAT, p->pos,
if (!*lookahead_mode)
{
yaz_log(YLOG_WARN, "isamb: Inconsistent register (1)");
- assert (*lookahead_mode);
+ assert(*lookahead_mode);
}
}
else
{
/* this is append. So a delete is bad */
yaz_log(YLOG_WARN, "isamb: Inconsistent register (2)");
- abort();
+ assert(*lookahead_mode);
}
else if (!half1 && dst > tail_cut)
{
}
return 1;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+