-/* $Id: kinput.c,v 1.85 2007-10-29 16:57:52 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.
+ 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
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <fcntl.h>
#ifdef WIN32
#include <io.h>
#define KEY_SIZE (1+sizeof(struct it_key))
#define INP_NAME_MAX 768
-#define INP_BUF_START 60000
-#define INP_BUF_ADD 400000
struct key_file {
int no; /* file no */
Res res;
};
-#if 0
+
+#define PR_KEY_LOW 0
+#define PR_KEY_TOP 0
+
+#if PR_KEY_LOW || PR_KEY_TOP
+
static void pkey(const char *b, int mode)
{
key_logdump_txt(YLOG_LOG, b, mode ? "i" : "d");
void getFnameTmp(Res res, char *fname, int no)
{
const char *pre;
-
+
pre = res_get_def(res, "keyTmpDir", ".");
sprintf(fname, "%s/key%d.tmp", pre, no);
}
void extract_get_fname_tmp(ZebraHandle zh, char *fname, int no)
{
const char *pre;
-
+
pre = res_get_def(zh->res, "keyTmpDir", ".");
sprintf(fname, "%s/key%d.tmp", pre, no);
}
{
i = 0;
key[i++] = c;
- while ((key[i++] = key_file_getc(f)))
- ;
+ while ((c = key_file_getc(f)))
+ {
+ if (i < INP_NAME_MAX-2)
+ key[i++] = c;
+ }
+ key[i++] = '\0';
strcpy(f->prev_name, key);
iscz1_reset(f->decode_handle);
}
int (*cmp)(const void *p1, const void *p2);
struct zebra_register *reg;
ZebraHandle zh;
- int raw_reading; /* 1=raw /mem read. 0=file reading */
zint no_diffs;
zint no_updates;
zint no_deletions;
hi->info.buf = 0;
hi->heapnum = 0;
hi->ptr = 0;
- hi->raw_reading = 0;
hi->no_diffs = 0;
hi->no_diffs = 0;
hi->no_updates = 0;
return hi;
}
-struct heap_info *key_heap_init_raw(ZebraHandle zh,
- int (*cmp)(const void *p1, const void *p2))
-{
- struct heap_info *hi=key_heap_malloc();
- hi->cmp = cmp;
- hi->zh = zh;
- hi->raw_reading = 1;
- return hi;
-}
-
void key_heap_destroy(struct heap_info *hi, int nkeys)
{
int i;
- if (!hi->raw_reading)
- for (i = 0; i<=nkeys; i++)
- xfree(hi->info.buf[i]);
-
+ for (i = 0; i<=nkeys; i++)
+ xfree(hi->info.buf[i]);
xfree(hi->info.buf);
xfree(hi->ptr);
xfree(hi->info.file);
child++;
if ((*hi->cmp)(&hi->info.buf[hi->ptr[cur]],
&hi->info.buf[hi->ptr[child]]) > 0)
- {
+ {
key_heap_swap(hi, cur, child);
cur = child;
child = 2*cur;
{
int cur, parent;
+ assert(nbytes < INP_NAME_MAX);
+
cur = ++(hi->heapnum);
memcpy(hi->info.buf[hi->ptr[cur]], buf, nbytes);
hi->info.file[hi->ptr[cur]] = kf;
return 1;
}
-#define PR_KEY_LOW 0
-#define PR_KEY_TOP 0
/* for debugging only */
void zebra_log_dict_entry(ZebraHandle zh, const char *s)
{
- char dst[IT_MAX_WORD+1];
+ char dst[INP_NAME_MAX+1];
int ord;
int len = key_SU_decode(&ord, (const unsigned char *) s);
const char *index_type;
zebraExplain_lookup_ord(zh->reg->zei,
ord, &index_type, &db, &string_index);
- zebra_term_untrans(zh, *index_type, dst, s + len);
+ zebra_term_untrans(zh, index_type, dst, s + len);
yaz_log(YLOG_LOG, "ord=%d index_type=%s index=%s term=%s",
ord, index_type, string_index, dst);
p->look_level++;
}
memcpy(*dst, p->key_1, p->sz_1);
-#if 0
+#if PR_KEY_TOP
yaz_log(YLOG_LOG, "DUP level=%d", p->look_level);
pkey(*dst, *insertMode);
#endif
}
p->look_level = level;
memcpy(*dst, p->key_1, p->sz_1);
-#if 0
+#if PR_KEY_TOP
+ yaz_log(YLOG_LOG, "TOP");
pkey(*dst, *insertMode);
#endif
(*dst) += p->sz_1;
return 1;
}
-
+
int heap_cread_item(void *vp, char **dst, int *insertMode)
{
struct heap_cread_info *p = (struct heap_cread_info *) vp;
if (!dict_delete(hi->reg->dict, this_name))
abort();
}
- else
+ else
{
hi->no_updates++;
if (isamc_p2 != isamc_p)
dict_insert(hi->reg->dict, this_name,
sizeof(ISAM_P), &isamc_p2);
}
- }
+ }
else
{
isamc_p = 0;
}
xfree(isamc_i);
return 0;
-}
-
-int heap_inp0(struct heap_cread_info *hci, struct heap_info *hi)
-{
- while (hci->more)
- {
- char this_name[INP_NAME_MAX];
- char mybuf[1024];
- char *dst = mybuf;
- int mode;
-
- strcpy(this_name, hci->cur_name);
- assert(hci->cur_name[0]);
- hi->no_diffs++;
-
- while (heap_cread_item2(hci, &dst, &mode))
- ;
- }
- return 0;
-}
-
+}
int heap_inpb(struct heap_cread_info *hci, struct heap_info *hi)
{
if (!dict_delete(hi->reg->dict, this_name))
abort();
}
- else
+ else
{
hi->no_updates++;
if (isamc_p2 != isamc_p)
dict_insert(hi->reg->dict, this_name,
sizeof(ISAM_P), &isamc_p2);
}
- }
+ }
else
{
isamc_p = 0;
}
xfree(isamc_i);
return 0;
-}
+}
int heap_inps(struct heap_cread_info *hci, struct heap_info *hi)
{
}
xfree(isams_i);
return 0;
-}
+}
struct progressInfo {
time_t startTime;
if (nkeys == 0)
return;
-
+
if (nkeys < 0)
{
char fname[1024];
}
hi = key_heap_init_file(zh, nkeys, key_qsort_compare);
hi->reg = zh->reg;
-
+
for (i = 1; i<=nkeys; i++)
if ((r = key_file_read(kf[i], rbuf)))
key_heap_insert(hi, rbuf, r, kf[i]);
if (1)
{
struct heap_cread_info hci;
-
+
hci.key = (char *) xmalloc(KEY_SIZE);
hci.key_1 = (char *) xmalloc(KEY_SIZE);
hci.key_2 = (char *) xmalloc(KEY_SIZE);
hci.first_in_list = 1;
hci.hi = hi;
hci.look_level = 0;
- hci.more = heap_read_one(hi, hci.cur_name, hci.key);
-
+ hci.more = heap_read_one(hi, hci.cur_name, hci.key);
+
if (zh->reg->isams)
heap_inps(&hci, hi);
if (zh->reg->isamc)
heap_inpc(&hci, hi);
if (zh->reg->isamb)
heap_inpb(&hci, hi);
-
+
xfree(hci.key);
xfree(hci.key_1);
xfree(hci.key_2);
}
-
+
for (i = 1; i<=nkeys; i++)
{
extract_get_fname_tmp (zh, rbuf, i);
xfree(kf);
if (hi->no_iterations)
{ /* do not log if nothing happened */
- yaz_log(YLOG_LOG, "Iterations: isam/dict "
+ yaz_log(YLOG_LOG, "Iterations: isam/dict "
ZINT_FORMAT "/" ZINT_FORMAT,
hi->no_iterations, hi->no_diffs);
yaz_log(YLOG_LOG, "Dict: inserts/updates/deletions: "
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab