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
Read-only sets uses common no write handler
[idzebra-moved-to-github.git]
/
isamc
/
merge.c
diff --git
a/isamc/merge.c
b/isamc/merge.c
index
09a3e06
..
7efc89b
100644
(file)
--- a/
isamc/merge.c
+++ b/
isamc/merge.c
@@
-1,8
+1,5
@@
-/* $Id: merge.c,v 1.28 2004-12-13 20:51:31 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
- Index Data Aps
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+ Copyright (C) 2004-2013 Index Data
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
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
@@
-15,11
+12,14
@@
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
+
*/
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <string.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)
{
@@
-72,18
+72,18
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
for (i = 0; i<ptr; i++)
{
/* consider this block number */
for (i = 0; i<ptr; i++)
{
/* consider this block number */
- if (!mb[i].block)
+ if (!mb[i].block)
{
{
- mb[i].block = isc_alloc_block (is, cat);
+ mb[i].block = isamc_alloc_block (is, cat);
mb[i].dirty = 1;
}
/* consider next block pointer */
if (last && i == ptr-1)
mb[i+1].block = 0;
mb[i].dirty = 1;
}
/* consider next block pointer */
if (last && i == ptr-1)
mb[i+1].block = 0;
- else if (!mb[i+1].block)
+ 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;
}
@@
-131,39
+131,39
@@
static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr,
}
memcpy (src, &mb[i+1].block, sizeof(zint));
memcpy (src+sizeof(zint), &ssize, sizeof(ssize));
}
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
whether we are creating a new one or updating and old one.
*/
int cat, zint firstpos)
{
/* Border set to initial fill or block size depending on
whether we are creating a new one or updating and old one.
*/
-
+
int fill = mb[ptr].block ? is->method->filecat[cat].bsize :
is->method->filecat[cat].ifill;
int off = (ptr||firstpos) ? ISAMC_BLOCK_OFFSET_N : ISAMC_BLOCK_OFFSET_1;
int fill = mb[ptr].block ? is->method->filecat[cat].bsize :
is->method->filecat[cat].ifill;
int off = (ptr||firstpos) ? ISAMC_BLOCK_OFFSET_N : ISAMC_BLOCK_OFFSET_1;
-
+
assert (ptr < 199);
return mb[ptr].offset + fill - off;
}
assert (ptr < 199);
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;
int i_more, i_mode, i;
{
char i_item[128], *i_item_ptr;
int i_more, i_mode, i;
- ISAMC_PP pp;
+ ISAMC_PP pp;
char f_item[128], *f_item_ptr;
int f_more;
int last_dirty = 0;
int debug = is->method->debug;
char f_item[128], *f_item_ptr;
int f_more;
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)
- yaz_log (YLOG_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;
@@
-207,10
+207,10
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
{
/* block to block boundary in the original file. */
f_more = 1;
{
/* block to block boundary in the original file. */
f_more = 1;
- if (cat == pp->cat)
+ if (cat == pp->cat)
{
/* the resulting output is of the same category as the
{
/* the resulting output is of the same category as the
- the original
+ the original
*/
if (r_offset <= mb[ptr].offset +is->method->filecat[cat].mfill)
{
*/
if (r_offset <= mb[ptr].offset +is->method->filecat[cat].mfill)
{
@@
-220,7
+220,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
if (debug > 3)
yaz_log (YLOG_LOG, "isc: release A");
if (mb[ptr].block)
if (debug > 3)
yaz_log (YLOG_LOG, "isc: release A");
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;
@@
-306,14
+306,14
@@
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 */
{
}
else /* insert i */
{
@@
-338,7
+338,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
int new_offset;
(*is->method->codec.encode)(r_clientData, &r_out_ptr, &src);
int new_offset;
(*is->method->codec.encode)(r_clientData, &r_out_ptr, &src);
- new_offset = r_out_ptr - r_buf;
+ new_offset = r_out_ptr - r_buf;
numKeys++;
numKeys++;
@@
-383,7
+383,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
if (cat < is->max_cat && ptr >= is->method->filecat[cat].mblocks)
{
/* Max number blocks in current category reached ->
if (cat < is->max_cat && ptr >= is->method->filecat[cat].mblocks)
{
/* Max number blocks in current category reached ->
- must switch to next category (with larger block size)
+ must switch to next category (with larger block size)
*/
int j = 0;
*/
int j = 0;
@@
-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;
@@
-428,8
+428,8
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
}
if (mb[ptr].offset < r_offset)
{ /* make the final boundary offset */
}
if (mb[ptr].offset < r_offset)
{ /* make the final boundary offset */
- mb[++ptr].dirty = 1;
- mb[ptr].block = 0;
+ mb[++ptr].dirty = 1;
+ mb[ptr].block = 0;
mb[ptr].offset = r_offset;
}
else
mb[ptr].offset = r_offset;
}
else
@@
-438,7
+438,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
{
if (debug > 3)
yaz_log (YLOG_LOG, "isc: release C");
{
if (debug > 3)
yaz_log (YLOG_LOG, "isc: release C");
- isc_release_block (is, pp->cat, mb[ptr].block);
+ 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;
@@
-452,7
+452,7
@@
ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data)
{
/* we have to patch initial block with num keys if that
has changed */
{
/* 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)
yaz_log (YLOG_LOG, "isc: patch num keys firstpos=" ZINT_FORMAT " num=" ZINT_FORMAT,
{
if (debug > 2)
yaz_log (YLOG_LOG, "isc: patch num keys firstpos=" ZINT_FORMAT " num=" ZINT_FORMAT,
@@
-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,17
@@
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)
- yaz_log (YLOG_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
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+