projects
/
idzebra-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
More optimizations of the melm matching.
[idzebra-moved-to-github.git]
/
isamc
/
merge.c
diff --git
a/isamc/merge.c
b/isamc/merge.c
index
c816766
..
4fa46d4
100644
(file)
--- a/
isamc/merge.c
+++ b/
isamc/merge.c
@@
-1,6
+1,6
@@
-/* $Id: merge.c,v 1.26 2004-08-06 12:55:02 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
- Index Data Aps
+/* $Id: merge.c,v 1.32 2006-08-14 10:40:19 adam Exp $
+ Copyright (C) 1995-2006
+ Index Data ApS
This file is part of the Zebra server.
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
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>
*/
#include <stdlib.h>
@@
-27,14
+27,14
@@
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include <yaz/log.h>
#include "isamc-p.h"
#include <yaz/log.h>
#include "isamc-p.h"
-struct isc_merge_block {
- int offset; /* offset in r_buf */
- zint block; /* block number of file (0 if none) */
- int dirty; /* block is different from that on file */
+struct isamc_merge_block {
+ int offset; /* offset in r_buf */
+ zint block; /* block number of file (0 if none) */
+ int dirty; /* block is different from that on file */
};
#if 0
};
#if 0
-static void opt_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
+static void opt_blocks (ISAMC is, struct isamc_merge_block *mb, int ptr,
int last)
{
int i, no_dirty = 0;
int last)
{
int i, no_dirty = 0;
@@
-63,7
+63,7
@@
static void opt_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
}
#endif
}
#endif
-static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
+static void flush_blocks (ISAMC is, struct isamc_merge_block *mb, int ptr,
char *r_buf, zint *firstpos, int cat, int last,
zint *numkeys)
{
char *r_buf, zint *firstpos, int cat, int last,
zint *numkeys)
{
@@
-74,7
+74,7
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
/* consider this block number */
if (!mb[i].block)
{
/* consider this block number */
if (!mb[i].block)
{
- mb[i].block = isc_alloc_block (is, cat);
+ mb[i].block = isamc_alloc_block (is, cat);
mb[i].dirty = 1;
}
mb[i].dirty = 1;
}
@@
-83,7
+83,7
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
mb[i+1].block = 0;
else if (!mb[i+1].block)
{
mb[i+1].block = 0;
else if (!mb[i+1].block)
{
- mb[i+1].block = isc_alloc_block (is, cat);
+ mb[i+1].block = isamc_alloc_block (is, cat);
mb[i+1].dirty = 1;
mb[i].dirty = 1;
}
mb[i+1].dirty = 1;
mb[i].dirty = 1;
}
@@
-103,7
+103,7
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
if (!*firstpos)
*firstpos = mb[i].block;
if (is->method->debug > 2)
if (!*firstpos)
*firstpos = mb[i].block;
if (is->method->debug > 2)
- logf (LOG_LOG, "isc: skip ptr=%d size=%d %d " ZINT_FORMAT,
+ yaz_log (YLOG_LOG, "isc: skip ptr=%d size=%d %d " ZINT_FORMAT,
i, ssize, cat, mb[i].block);
++(is->files[cat].no_skip_writes);
continue;
i, ssize, cat, mb[i].block);
++(is->files[cat].no_skip_writes);
continue;
@@
-118,7
+118,7
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
memcpy (src+sizeof(zint)+sizeof(ssize), numkeys, sizeof(*numkeys));
if (is->method->debug > 2)
memcpy (src+sizeof(zint)+sizeof(ssize), numkeys, sizeof(*numkeys));
if (is->method->debug > 2)
- logf (LOG_LOG, "isc: flush ptr=%d numk=" ZINT_FORMAT " size=%d nextpos="
+ yaz_log (YLOG_LOG, "isc: flush ptr=%d numk=" ZINT_FORMAT " size=%d nextpos="
ZINT_FORMAT, i, *numkeys, (int) ssize, mb[i+1].block);
}
else
ZINT_FORMAT, i, *numkeys, (int) ssize, mb[i+1].block);
}
else
@@
-126,16
+126,16
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
src = r_buf + mb[i].offset - ISAMC_BLOCK_OFFSET_N;
ssize += ISAMC_BLOCK_OFFSET_N;
if (is->method->debug > 2)
src = r_buf + mb[i].offset - ISAMC_BLOCK_OFFSET_N;
ssize += ISAMC_BLOCK_OFFSET_N;
if (is->method->debug > 2)
- logf (LOG_LOG, "isc: flush ptr=%d size=%d nextpos=" ZINT_FORMAT,
+ yaz_log (YLOG_LOG, "isc: flush ptr=%d size=%d nextpos=" ZINT_FORMAT,
i, (int) ssize, mb[i+1].block);
}
memcpy (src, &mb[i+1].block, sizeof(zint));
memcpy (src+sizeof(zint), &ssize, sizeof(ssize));
i, (int) ssize, mb[i+1].block);
}
memcpy (src, &mb[i+1].block, sizeof(zint));
memcpy (src+sizeof(zint), &ssize, sizeof(ssize));
- isc_write_block (is, cat, mb[i].block, src);
+ isamc_write_block (is, cat, mb[i].block, src);
}
}
}
}
-static int get_border (ISAMC is, struct isc_merge_block *mb, zint ptr,
+static int get_border (ISAMC is, struct isamc_merge_block *mb, zint ptr,
int cat, zint firstpos)
{
/* Border set to initial fill or block size depending on
int cat, zint firstpos)
{
/* Border set to initial fill or block size depending on
@@
-151,7
+151,7
@@
static int get_border (ISAMC is, struct isc_merge_block *mb, zint ptr,
return mb[ptr].offset + fill - off;
}
return mb[ptr].offset + fill - off;
}
-ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
+void isamc_merge (ISAMC is, ISAM_P *ipos, ISAMC_I *data)
{
char i_item[128], *i_item_ptr;
{
char i_item[128], *i_item_ptr;
@@
-163,7
+163,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
int last_dirty = 0;
int debug = is->method->debug;
int last_dirty = 0;
int debug = is->method->debug;
- struct isc_merge_block mb[200];
+ struct isamc_merge_block mb[200];
zint firstpos = 0;
int cat = 0;
zint firstpos = 0;
int cat = 0;
@@
-178,16
+178,16
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
r_clientData = (*is->method->codec.start)();
r_buf = is->merge_buf + 128;
r_clientData = (*is->method->codec.start)();
r_buf = is->merge_buf + 128;
- pp = isc_pp_open (is, ipos);
+ pp = isamc_pp_open (is, *ipos);
/* read first item from file. make sure f_more indicates no boundary */
f_item_ptr = f_item;
/* read first item from file. make sure f_more indicates no boundary */
f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
+ f_more = isamc_read_item (pp, &f_item_ptr);
if (f_more > 0)
f_more = 1;
cat = pp->cat;
if (debug > 1)
if (f_more > 0)
f_more = 1;
cat = pp->cat;
if (debug > 1)
- logf (LOG_LOG, "isc: isc_merge begin %d " ZINT_FORMAT, cat, pp->pos);
+ yaz_log (YLOG_LOG, "isc: isamc_merge begin %d " ZINT_FORMAT, cat, pp->pos);
/* read first item from i */
i_item_ptr = i_item;
/* read first item from i */
i_item_ptr = i_item;
@@
-218,9
+218,9
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
the original (if any)
*/
if (debug > 3)
the original (if any)
*/
if (debug > 3)
- logf (LOG_LOG, "isc: release A");
+ yaz_log (YLOG_LOG, "isc: release A");
if (mb[ptr].block)
if (mb[ptr].block)
- isc_release_block (is, pp->cat, mb[ptr].block);
+ isamc_release_block (is, pp->cat, mb[ptr].block);
mb[ptr].block = pp->pos;
if (!mb[ptr].dirty)
mb[ptr].dirty = 1;
mb[ptr].block = pp->pos;
if (!mb[ptr].dirty)
mb[ptr].dirty = 1;
@@
-234,7
+234,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
mb[ptr].dirty = last_dirty;
mb[ptr].offset = r_offset;
if (debug > 3)
mb[ptr].dirty = last_dirty;
mb[ptr].offset = r_offset;
if (debug > 3)
- logf (LOG_LOG, "isc: bound ptr=%d,offset=%d",
+ yaz_log (YLOG_LOG, "isc: bound ptr=%d,offset=%d",
ptr, r_offset);
if (cat==is->max_cat && ptr >= is->method->max_blocks_mem)
{
ptr, r_offset);
if (cat==is->max_cat && ptr >= is->method->max_blocks_mem)
{
@@
-242,7
+242,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
except 1 will be flushed.
*/
if (debug > 2)
except 1 will be flushed.
*/
if (debug > 2)
- logf (LOG_LOG, "isc: flush A %d sections", ptr);
+ yaz_log (YLOG_LOG, "isc: flush A %d sections", ptr);
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
@@
-306,20
+306,20
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
}
/* move f */
f_item_ptr = f_item;
}
/* move f */
f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
+ f_more = isamc_read_item (pp, &f_item_ptr);
}
else if (cmp > 0) /* insert f */
{
memcpy (r_item, f_item, f_item_ptr - f_item);
/* move f */
f_item_ptr = f_item;
}
else if (cmp > 0) /* insert f */
{
memcpy (r_item, f_item, f_item_ptr - f_item);
/* move f */
f_item_ptr = f_item;
- f_more = isc_read_item (pp, &f_item_ptr);
+ f_more = isamc_read_item (pp, &f_item_ptr);
}
else /* insert i */
{
if (!i_mode) /* delete item which isn't there? */
{
}
else /* insert i */
{
if (!i_mode) /* delete item which isn't there? */
{
- logf (LOG_FATAL, "Inconsistent register at offset %d",
+ yaz_log (YLOG_FATAL, "Inconsistent register at offset %d",
r_offset);
abort ();
}
r_offset);
abort ();
}
@@
-345,7
+345,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
if (border < new_offset && border >= r_offset)
{
if (debug > 2)
if (border < new_offset && border >= r_offset)
{
if (debug > 2)
- logf (LOG_LOG, "isc: border %d " ZINT_FORMAT,
+ yaz_log (YLOG_LOG, "isc: border %d " ZINT_FORMAT,
ptr, border);
/* Max size of current block category reached ...
make new virtual block entry */
ptr, border);
/* Max size of current block category reached ...
make new virtual block entry */
@@
-359,7
+359,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
surely not the last one(s).
*/
if (debug > 2)
surely not the last one(s).
*/
if (debug > 2)
- logf (LOG_LOG, "isc: flush B %d sections", ptr-1);
+ yaz_log (YLOG_LOG, "isc: flush B %d sections", ptr-1);
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,
0, &pp->numKeys);
mb[0].block = mb[ptr-1].block;
@@
-391,7
+391,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
/* delete all original block(s) read so far */
for (i = 0; i < ptr; i++)
if (mb[i].block)
/* delete all original block(s) read so far */
for (i = 0; i < ptr; i++)
if (mb[i].block)
- isc_release_block (is, pp->cat, mb[i].block);
+ isamc_release_block (is, pp->cat, mb[i].block);
/* also delete all block to be read in the future */
pp->deleteFlag = 1;
/* also delete all block to be read in the future */
pp->deleteFlag = 1;
@@
-406,23
+406,23
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
int border = is->method->filecat[cat].ifill -
ISAMC_BLOCK_OFFSET_1 + mb[j].offset;
if (debug > 3)
int border = is->method->filecat[cat].ifill -
ISAMC_BLOCK_OFFSET_1 + mb[j].offset;
if (debug > 3)
- logf (LOG_LOG, "isc: remap %d border=%d", i, border);
+ yaz_log (YLOG_LOG, "isc: remap %d border=%d", i, border);
if (mb[i+1].offset > border && mb[i].offset <= border)
{
if (debug > 3)
if (mb[i+1].offset > border && mb[i].offset <= border)
{
if (debug > 3)
- logf (LOG_LOG, "isc: to %d %d", j, mb[i].offset);
+ yaz_log (YLOG_LOG, "isc: to %d %d", j, mb[i].offset);
mb[++j].dirty = 1;
mb[j].block = 0;
mb[j].offset = mb[i].offset;
}
}
if (debug > 2)
mb[++j].dirty = 1;
mb[j].block = 0;
mb[j].offset = mb[i].offset;
}
}
if (debug > 2)
- logf (LOG_LOG, "isc: remap from %d to %d sections to cat %d",
+ yaz_log (YLOG_LOG, "isc: remap from %d to %d sections to cat %d",
ptr, j, cat);
ptr = j;
border = get_border (is, mb, ptr, cat, firstpos);
if (debug > 3)
ptr, j, cat);
ptr = j;
border = get_border (is, mb, ptr, cat, firstpos);
if (debug > 3)
- logf (LOG_LOG, "isc: border=" ZINT_FORMAT " r_offset=%d",
+ yaz_log (YLOG_LOG, "isc: border=" ZINT_FORMAT " r_offset=%d",
border, r_offset);
}
}
border, r_offset);
}
}
@@
-437,8
+437,8
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
if (cat == pp->cat && mb[ptr].block)
{
if (debug > 3)
if (cat == pp->cat && mb[ptr].block)
{
if (debug > 3)
- logf (LOG_LOG, "isc: release C");
- isc_release_block (is, pp->cat, mb[ptr].block);
+ yaz_log (YLOG_LOG, "isc: release C");
+ isamc_release_block (is, pp->cat, mb[ptr].block);
mb[ptr].block = 0;
if (ptr > 0)
mb[ptr-1].dirty = 1;
mb[ptr].block = 0;
if (ptr > 0)
mb[ptr-1].dirty = 1;
@@
-446,16
+446,16
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
}
if (debug > 2)
}
if (debug > 2)
- logf (LOG_LOG, "isc: flush C, %d sections", ptr);
+ yaz_log (YLOG_LOG, "isc: flush C, %d sections", ptr);
if (firstpos)
{
/* we have to patch initial block with num keys if that
has changed */
if (firstpos)
{
/* we have to patch initial block with num keys if that
has changed */
- if (numKeys != isc_pp_num (pp))
+ if (numKeys != isamc_pp_num (pp))
{
if (debug > 2)
{
if (debug > 2)
- logf (LOG_LOG, "isc: patch num keys firstpos=" ZINT_FORMAT " num=" ZINT_FORMAT,
+ yaz_log (YLOG_LOG, "isc: patch num keys firstpos=" ZINT_FORMAT " num=" ZINT_FORMAT,
firstpos, numKeys);
bf_write (is->files[cat].bf, firstpos, ISAMC_BLOCK_OFFSET_N,
sizeof(numKeys), &numKeys);
firstpos, numKeys);
bf_write (is->files[cat].bf, firstpos, ISAMC_BLOCK_OFFSET_N,
sizeof(numKeys), &numKeys);
@@
-464,7
+464,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
else if (ptr > 0)
{ /* we haven't flushed initial block yet and there surely are some
blocks to flush. Make first block dirty if numKeys differ */
else if (ptr > 0)
{ /* we haven't flushed initial block yet and there surely are some
blocks to flush. Make first block dirty if numKeys differ */
- if (numKeys != isc_pp_num (pp))
+ if (numKeys != isamc_pp_num (pp))
mb[0].dirty = 1;
}
/* flush rest of block(s) in r_buf */
mb[0].dirty = 1;
}
/* flush rest of block(s) in r_buf */
@@
-474,8
+474,16
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
if (!firstpos)
cat = 0;
if (debug > 1)
if (!firstpos)
cat = 0;
if (debug > 1)
- logf (LOG_LOG, "isc: isc_merge return %d " ZINT_FORMAT, cat, firstpos);
- isc_pp_close (pp);
- return cat + firstpos * 8;
+ yaz_log (YLOG_LOG, "isc: isamc_merge return %d " ZINT_FORMAT, cat, firstpos);
+ isamc_pp_close (pp);
+ *ipos = cat + firstpos * 8;
}
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+