/* This file is part of the Zebra server.
- Copyright (C) 1995-2008 Index Data
+ Copyright (C) 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
*/
-#include <assert.h>
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <assert.h>
#include <string.h>
#include <yaz/log.h>
struct sort_term {
zint sysno;
+ zint section_id;
zint length;
char term[SORT_MAX_MULTI];
};
memcpy(&a1, b, sizeof(a1));
- yaz_log(level, "%s " ZINT_FORMAT " %.*s", txt, a1.sysno,
- (int) a1.length-1, a1.term);
+ yaz_log(level, "%s " ZINT_FORMAT " " ZINT_FORMAT " %.*s", txt, a1.sysno,
+ a1.section_id, (int) a1.length-1, a1.term);
}
static int sort_term_compare(const void *a, const void *b)
return 1;
else if (a1.sysno < b1.sysno)
return -1;
+ if (a1.section_id > b1.section_id)
+ return 1;
+ else if (a1.section_id < b1.section_id)
+ return -1;
+
return 0;
}
memcpy(&a1, *src, sizeof(a1));
*src += sizeof(a1);
- zebra_zint_encode(dst, a1.sysno); /* encode record id */
+ zebra_zint_encode(dst, a1.sysno);
+ zebra_zint_encode(dst, a1.section_id);
zebra_zint_encode(dst, a1.length); /* encode length */
memcpy(*dst, a1.term, a1.length);
*dst += a1.length;
size_t slen;
zebra_zint_decode(src, &a1.sysno);
+ a1.section_id = 0;
strcpy(a1.term, *src);
slen = 1 + strlen(a1.term);
struct sort_term a1;
zebra_zint_decode(src, &a1.sysno);
+ zebra_zint_decode(src, &a1.section_id);
zebra_zint_decode(src, &a1.length);
memcpy(a1.term, *src, a1.length);
return 0;
(s->no)--;
-
+
*insertMode = s->insert_flag;
memcpy(*dst, &s->st, sizeof(s->st));
*dst += sizeof(s->st);
case ZEBRA_SORT_TYPE_ISAMB:
method.codec.encode = sort_term_encode1;
method.codec.decode = sort_term_decode1;
-
+
sprintf(fname, "sortb%d", id);
sf->u.isamb = isamb_open2(si->bfs, fname, si->write_flag, &method,
/* cache */ 0,
isam_block_size = 32768;
method.codec.encode = sort_term_encode2;
method.codec.decode = sort_term_decode2;
-
+
sprintf(fname, "sortm%d", id);
sf->u.isamb = isamb_open2(si->bfs, fname, si->write_flag, &method,
/* cache */ 0,
}
-void zebra_sort_delete(zebra_sort_index_t si)
+void zebra_sort_delete(zebra_sort_index_t si, zint section_id)
{
struct sortFile *sf = si->current_file;
ISAMC_I isamc_i;
s.st.sysno = si->sysno;
+ s.st.section_id = section_id;
s.st.length = 0;
s.st.term[0] = '\0';
-
+
s.no = 1;
s.insert_flag = 0;
isamc_i.clientData = &s;
isamc_i.read_item = sort_term_code_read;
-
+
isamb_merge(sf->u.isamb, &sf->isam_p, &isamc_i);
sf->no_deleted++;
}
}
}
-void zebra_sort_add(zebra_sort_index_t si, WRBUF wrbuf)
+void zebra_sort_add(zebra_sort_index_t si, zint section_id, WRBUF wrbuf)
{
struct sortFile *sf = si->current_file;
int len;
len = strlen(wrbuf_buf(wrbuf));
if (len > SORT_IDX_ENTRYSIZE)
len = SORT_IDX_ENTRYSIZE;
-
+
memcpy(si->entry_buf, wrbuf_buf(wrbuf), len);
if (len < SORT_IDX_ENTRYSIZE-len)
memset(si->entry_buf+len, 0, SORT_IDX_ENTRYSIZE-len);
memcpy(s.st.term, wrbuf_buf(wrbuf), len);
s.st.length = len;
s.st.sysno = si->sysno;
+ s.st.section_id = 0;
s.no = 1;
s.insert_flag = 1;
isamc_i.clientData = &s;
isamc_i.read_item = sort_term_code_read;
-
+
isamb_merge(sf->u.isamb, &sf->isam_p, &isamc_i);
sf->no_inserted++;
}
memcpy(s.st.term, wrbuf_buf(wrbuf), len);
s.st.length = len;
s.st.sysno = si->sysno;
+ s.st.section_id = section_id;
s.no = 1;
s.insert_flag = 1;
isamc_i.clientData = &s;
isamc_i.read_item = sort_term_code_read;
-
+
isamb_merge(sf->u.isamb, &sf->isam_p, &isamc_i);
sf->no_inserted++;
}
}
-int zebra_sort_read(zebra_sort_index_t si, WRBUF w)
+int zebra_sort_read(zebra_sort_index_t si, zint *section_id, WRBUF w)
{
int r;
struct sortFile *sf = si->current_file;
struct sort_term st, st_untilbuf;
st_untilbuf.sysno = si->sysno;
+ st_untilbuf.section_id = 0;
st_untilbuf.length = 0;
st_untilbuf.term[0] = '\0';
r = isamb_pp_forward(sf->isam_pp, &st, &st_untilbuf);
if (r && st.sysno == si->sysno)
{
wrbuf_write(w, st.term, st.length);
+ if (section_id)
+ *section_id = st.section_id;
return 1;
}
}
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab