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
Fixed bad memory reference that could occur if empty key block was to
[idzebra-moved-to-github.git]
/
isamc
/
merge.c
diff --git
a/isamc/merge.c
b/isamc/merge.c
index
e8d9247
..
b237dcf
100644
(file)
--- a/
isamc/merge.c
+++ b/
isamc/merge.c
@@
-1,6
+1,6
@@
-/* $Id: merge.c,v 1.27 2004-11-19 10:27:09 heikki Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
- Index Data Aps
+/* $Id: merge.c,v 1.33 2007-01-15 15:10:18 adam Exp $
+ Copyright (C) 1995-2007
+ Index Data ApS
This file is part of the Zebra server.
This file is part of the Zebra server.
@@
-15,26
+15,26
@@
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 <assert.h>
#include <string.h>
#include <stdio.h>
*/
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
-#include <yaz/ylog.h>
+#include <yaz/log.h>
#include "isamc-p.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;
}
@@
-131,11
+131,11
@@
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
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)
- 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;
@@
-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 */
{
@@
-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;
@@
-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,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)
- 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
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+