-/*
- * Copyright (C) 1994-1997, Index Data I/S
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: isam.c,v $
- * Revision 1.24 1997-10-27 14:25:39 adam
- * Fixed memory leaks.
- *
- * Revision 1.23 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.
- *
- * Revision 1.22 1996/10/29 13:56:53 adam
- * Include of zebrautl.h instead of alexutil.h.
- *
- * Revision 1.21 1996/03/29 14:11:47 quinn
- * Change to is_merge
- *
- * Revision 1.20 1996/03/19 13:14:57 quinn
- * Moved an xfree()
- *
- * Revision 1.19 1996/02/10 12:20:56 quinn
- * *** empty log message ***
- *
- * Revision 1.18 1996/02/06 10:19:56 quinn
- * Attempt at fixing bug. Not all blocks were read before they were unlinked
- * prior to a remap operation.
- *
- * Revision 1.17 1995/12/06 15:48:44 quinn
- * Fixed update-problem.
- *
- * Revision 1.16 1995/12/06 14:48:26 quinn
- * Fixed some strange bugs.
- *
- * Revision 1.15 1995/12/06 09:59:45 quinn
- * Fixed memory-consumption bug in memory.c
- * Added more blocksizes to the default ISAM configuration.
- *
- * Revision 1.14 1995/11/24 17:26:19 quinn
- * Mostly about making some ISAM stuff in the config file optional.
- *
- * Revision 1.13 1995/10/17 18:03:15 adam
- * Commented out qsort in is_merge.
- *
- * Revision 1.12 1995/09/06 16:11:41 adam
- * Keysize parameter to is_open (if non-zero).
- *
- * Revision 1.11 1995/09/04 12:33:46 adam
- * Various cleanup. YAZ util used instead.
- *
- * Revision 1.10 1994/09/28 16:58:32 quinn
- * Small mod.
- *
- * Revision 1.9 1994/09/28 12:56:15 quinn
- * Added access functions (ISPT)
- *
- * Revision 1.8 1994/09/28 12:32:17 quinn
- * Trivial
- *
- * Revision 1.7 1994/09/28 11:56:25 quinn
- * Added sort of input to is_merge
- *
- * Revision 1.6 1994/09/28 11:29:33 quinn
- * Added cmp parameter.
- *
- * Revision 1.5 1994/09/27 20:03:50 quinn
- * Seems relatively bug-free.
- *
- * Revision 1.4 1994/09/26 17:11:29 quinn
- * Trivial
- *
- * Revision 1.3 1994/09/26 17:06:35 quinn
- * Back again...
- *
- * Revision 1.1 1994/09/12 08:02:13 quinn
- * Not functional yet
- *
- */
+/* $Id: isam.c,v 1.27 2002-08-02 19:26:56 adam Exp $
+ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+ Index Data Aps
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+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.
+*/
+
+
#include <stdio.h>
#include <stdlib.h>
int skipped_inserts;
int delete_insert_noop;
int delete_replace;
- int delete;
+ int deletes;
int remaps;
int block_jumps;
int tab_deletes;
ispt_freelist = ispt_freelist->next;
}
else
- p = xmalloc(sizeof(ispt_struct));
+ p = (ISPT) xmalloc(sizeof(ispt_struct));
return p;
}
int (*cmp)(const void *p1, const void *p2),
int writeflag, int keysize, Res res)
{
- ISAM new;
+ ISAM inew;
char *nm, *r, *pp[IS_MAX_BLOCKTYPES+1], m[2];
int num, size, rs, tmp, i;
is_type_header th;
statistics.skipped_inserts = 0;
statistics.delete_insert_noop = 0;
statistics.delete_replace = 0;
- statistics.delete = 0;
+ statistics.deletes = 0;
statistics.remaps = 0;
statistics.new_tables = 0;
statistics.block_jumps = 0;
statistics.tab_deletes = 0;
}
- new = xmalloc(sizeof(*new));
- new->writeflag = writeflag;
+ inew = (ISAM) xmalloc(sizeof(*inew));
+ inew->writeflag = writeflag;
for (i = 0; i < IS_MAX_BLOCKTYPES; i++)
- new->types[i].index = 0; /* dummy */
+ inew->types[i].index = 0; /* dummy */
/* determine number and size of blocktypes */
if (!(r = res_get_def(res,
logf (LOG_FATAL, "Failed to locate resource %s", nm);
return 0;
}
- new->num_types = num;
+ inew->num_types = num;
for (i = 0; i < num; i++)
{
if ((rs = sscanf(pp[i], "%d%1[bBkKmM]", &size, m)) < 1)
switch (*m)
{
case 'b': case 'B':
- new->types[i].blocksize = size; break;
+ inew->types[i].blocksize = size; break;
case 'k': case 'K':
- new->types[i].blocksize = size * 1024; break;
+ inew->types[i].blocksize = size * 1024; break;
case 'm': case 'M':
- new->types[i].blocksize = size * 1048576; break;
+ inew->types[i].blocksize = size * 1048576; break;
default:
logf (LOG_FATAL, "Illegal size suffix: %c", *m);
return 0;
}
- new->types[i].dbuf = xmalloc(new->types[i].blocksize);
+ inew->types[i].dbuf = (char *) xmalloc(inew->types[i].blocksize);
m[0] = 'A' + i;
m[1] = '\0';
- if (!(new->types[i].bf = bf_open(bfs, strconcat(name, m, 0),
- new->types[i].blocksize, writeflag)))
+ if (!(inew->types[i].bf = bf_open(bfs, strconcat(name, m, 0),
+ inew->types[i].blocksize, writeflag)))
{
logf (LOG_FATAL, "bf_open failed");
return 0;
}
- if ((rs = is_rb_read(&new->types[i], &th)) > 0)
+ if ((rs = is_rb_read(&inew->types[i], &th)) > 0)
{
- if (th.blocksize != new->types[i].blocksize)
+ if (th.blocksize != inew->types[i].blocksize)
{
logf (LOG_FATAL, "File blocksize mismatch in %s", name);
exit(1);
}
- new->types[i].freelist = th.freelist;
- new->types[i].top = th.top;
+ inew->types[i].freelist = th.freelist;
+ inew->types[i].top = th.top;
}
else if (writeflag) /* write dummy superblock to determine top */
{
- if ((rs = is_rb_write(&new->types[i], &th)) <=0) /* dummy */
+ if ((rs = is_rb_write(&inew->types[i], &th)) <=0) /* dummy */
{
logf (LOG_FATAL, "Failed to write initial superblock.");
exit(1);
}
- new->types[i].freelist = -1;
- new->types[i].top = rs;
+ inew->types[i].freelist = -1;
+ inew->types[i].top = rs;
}
/* ELSE: this is an empty file opened in read-only mode. */
}
if (keysize > 0)
- new->keysize = keysize;
+ inew->keysize = keysize;
else
{
if (!(r = res_get_def(res, nm = strconcat(name, ".",
logf (LOG_FATAL, "Failed to locate resource %s", nm);
return 0;
}
- if ((new->keysize = atoi(r)) <= 0)
+ if ((inew->keysize = atoi(r)) <= 0)
{
logf (LOG_FATAL, "Must specify positive keysize.");
return 0;
logf (LOG_FATAL, "Failed to locate resource %s", nm);
return 0;
}
- new->repack = atoi(r);
+ inew->repack = atoi(r);
/* determine max keys/blocksize */
if (!(r = res_get_def(res,
logf (LOG_FATAL, "Failed to locate resource %s", nm);
return 0;
}
- if (num < new->num_types -1)
+ if (num < inew->num_types -1)
{
logf (LOG_FATAL, "Not enough elements in %s", nm);
return 0;
logf (LOG_FATAL, "Error in resource %s: %s", r, pp[i]);
return 0;
}
- new->types[i].max_keys = tmp;
+ inew->types[i].max_keys = tmp;
}
/* determine max keys/block */
- for (i = 0; i < new->num_types; i++)
+ for (i = 0; i < inew->num_types; i++)
{
- if (!new->types[i].index)
+ if (!inew->types[i].index)
{
- new->types[i].max_keys_block = (new->types[i].blocksize - 2 *
- sizeof(int)) / new->keysize;
- new->types[i].max_keys_block0 = (new->types[i].blocksize - 3 *
- sizeof(int)) / new->keysize;
+ inew->types[i].max_keys_block = (inew->types[i].blocksize - 2 *
+ sizeof(int)) / inew->keysize;
+ inew->types[i].max_keys_block0 = (inew->types[i].blocksize - 3 *
+ sizeof(int)) / inew->keysize;
}
else
- new->types[i].max_keys_block = new->types[i].max_keys_block0 /
- new->keysize;
- if (new->types[i].max_keys_block0 < 1)
+ inew->types[i].max_keys_block = inew->types[i].max_keys_block0 /
+ inew->keysize;
+ if (inew->types[i].max_keys_block0 < 1)
{
logf (LOG_FATAL, "Blocksize too small in %s", name);
exit(1);
logf (LOG_FATAL, "Failed to locate resource %s", nm);
return 0;
}
- if (num < new->num_types)
+ if (num < inew->num_types)
{
logf (LOG_FATAL, "Not enough elements in %s", nm);
return 0;
logf (LOG_FATAL, "Error in resource %s: %s", r, pp[i]);
return 0;
}
- new->types[i].nice_keys_block = (new->types[i].max_keys_block0 * tmp) /
+ inew->types[i].nice_keys_block = (inew->types[i].max_keys_block0 * tmp) /
100;
- if (new->types[i].nice_keys_block < 1)
- new->types[i].nice_keys_block = 1;
+ if (inew->types[i].nice_keys_block < 1)
+ inew->types[i].nice_keys_block = 1;
}
- new->cmp = cmp ? cmp : is_default_cmp;
- return new;
+ inew->cmp = cmp ? cmp : is_default_cmp;
+ return inew;
}
/*
statistics.delete_insert_noop);
logf(LOG_LOG, "delete_replace %d",
statistics.delete_replace);
- logf(LOG_LOG, "delete %d", statistics.delete);
+ logf(LOG_LOG, "delete %d", statistics.deletes);
logf(LOG_LOG, "remaps %d", statistics.remaps);
logf(LOG_LOG, "block_jumps %d", statistics.block_jumps);
logf(LOG_LOG, "tab_deletes %d", statistics.tab_deletes);
}
logf (LOG_DEBUG, "Deleting record.");
is_m_delete_record(&tab);
- statistics.delete++;
+ statistics.deletes++;
}
}
}