/* This file is part of the Zebra server.
- Copyright (C) 1995-2008 Index Data
+ Copyright (C) 1994-2011 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
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, 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 = strlen(a1.term);
- *src += slen + 1;
+ slen = 1 + strlen(a1.term);
+ *src += slen;
a1.length = slen;
memcpy(*dst, &a1, sizeof(a1));
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;
}
+static void zebra_sortf_rewind(struct sortFile *sf)
+{
+ if (sf->isam_pp)
+ isamb_pp_close(sf->isam_pp);
+ sf->isam_pp = 0;
+ sf->no_inserted = 0;
+ sf->no_deleted = 0;
+}
+
void zebra_sort_sysno(zebra_sort_index_t si, zint sysno)
{
- struct sortFile *sf = si->current_file;
zint new_sysno = rec_sysno_to_int(sysno);
+ struct sortFile *sf;
for (sf = si->files; sf; sf = sf->next)
{
if (sf->no_inserted || sf->no_deleted)
- {
- isamb_pp_close(sf->isam_pp);
- sf->isam_pp = 0;
- }
- else if (sf->isam_pp && new_sysno < si->sysno && sf->isam_pp)
- {
- isamb_pp_close(sf->isam_pp);
- sf->isam_pp = 0;
- }
- sf->no_inserted = 0;
- sf->no_deleted = 0;
+ zebra_sortf_rewind(sf);
+ else if (sf->isam_pp && new_sysno <= si->sysno)
+ zebra_sortf_rewind(sf);
}
si->sysno = new_sysno;
}
-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;
switch(si->type)
{
case ZEBRA_SORT_TYPE_FLAT:
- zebra_sort_add(si, "", 0);
+ memset(si->entry_buf, 0, SORT_IDX_ENTRYSIZE);
+ bf_write(sf->u.bf, si->sysno+1, 0, 0, si->entry_buf);
break;
case ZEBRA_SORT_TYPE_ISAMB:
case ZEBRA_SORT_TYPE_MULTI:
ISAMC_I isamc_i;
s.st.sysno = si->sysno;
+ s.st.section_id = section_id;
s.st.length = 0;
s.st.term[0] = '\0';
}
}
-void zebra_sort_add_ent(zebra_sort_index_t si, struct zebra_sort_ent *ent)
+void zebra_sort_add(zebra_sort_index_t si, zint section_id, WRBUF wrbuf)
{
struct sortFile *sf = si->current_file;
int len;
{
case ZEBRA_SORT_TYPE_FLAT:
/* take first entry from wrbuf - itself is 0-terminated */
- len = strlen(wrbuf_buf(ent->wrbuf));
+ len = strlen(wrbuf_buf(wrbuf));
if (len > SORT_IDX_ENTRYSIZE)
len = SORT_IDX_ENTRYSIZE;
- memcpy(si->entry_buf, wrbuf_buf(ent->wrbuf), len);
+ memcpy(si->entry_buf, wrbuf_buf(wrbuf), len);
if (len < SORT_IDX_ENTRYSIZE-len)
memset(si->entry_buf+len, 0, SORT_IDX_ENTRYSIZE-len);
bf_write(sf->u.bf, si->sysno+1, 0, 0, si->entry_buf);
case ZEBRA_SORT_TYPE_ISAMB:
assert(sf->u.isamb);
- assert(sf->no_inserted == 0);
if (sf->no_inserted == 0)
{
struct sort_term_stream s;
ISAMC_I isamc_i;
/* take first entry from wrbuf - itself is 0-terminated */
- len = strlen(wrbuf_buf(ent->wrbuf));
- s.st.sysno = si->sysno;
- if (len >= SORT_MAX_TERM)
- len = SORT_MAX_TERM-1;
- memcpy(s.st.term, wrbuf_buf(ent->wrbuf), len);
- s.st.term[len] = '\0';
- s.st.length = len;
- 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++;
- }
- break;
- case ZEBRA_SORT_TYPE_MULTI:
- assert(sf->u.isamb);
- if (sf->no_inserted == 0)
- {
- struct sort_term_stream s;
- ISAMC_I isamc_i;
- len = wrbuf_len(ent->wrbuf);
-
- s.st.sysno = si->sysno;
- if (len >= SORT_MAX_MULTI)
- len = SORT_MAX_MULTI-1;
- memcpy(s.st.term, wrbuf_buf(ent->wrbuf), len);
+ len = wrbuf_len(wrbuf);
+ if (len > SORT_MAX_TERM)
+ {
+ len = SORT_MAX_TERM;
+ wrbuf_buf(wrbuf)[len-1] = '\0';
+ }
+ memcpy(s.st.term, wrbuf_buf(wrbuf), len);
s.st.length = len;
- 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++;
- }
- break;
- }
-}
-
-void zebra_sort_add(zebra_sort_index_t si, const char *buf, int len)
-{
- struct sortFile *sf = si->current_file;
-
- if (!sf || !sf->u.bf)
- return;
- switch(si->type)
- {
- case ZEBRA_SORT_TYPE_FLAT:
- if (len > SORT_IDX_ENTRYSIZE)
- {
- len = SORT_IDX_ENTRYSIZE;
- memcpy(si->entry_buf, buf, len);
- }
- else
- {
- memcpy(si->entry_buf, buf, len);
- memset(si->entry_buf+len, 0, SORT_IDX_ENTRYSIZE-len);
- }
- bf_write(sf->u.bf, si->sysno+1, 0, 0, si->entry_buf);
- break;
- case ZEBRA_SORT_TYPE_ISAMB:
- assert(sf->u.isamb);
- if (sf->no_inserted == 0)
- {
- struct sort_term_stream s;
- ISAMC_I isamc_i;
-
s.st.sysno = si->sysno;
- if (len >= SORT_MAX_TERM)
- len = SORT_MAX_TERM-1;
- memcpy(s.st.term, buf, len);
- s.st.term[len] = '\0';
- s.st.length = len;
+ s.st.section_id = 0;
s.no = 1;
s.insert_flag = 1;
isamc_i.clientData = &s;
{
struct sort_term_stream s;
ISAMC_I isamc_i;
-
- s.st.sysno = si->sysno;
- if (len >= SORT_MAX_MULTI)
- len = SORT_MAX_MULTI-1;
- memcpy(s.st.term, buf, len);
+ len = wrbuf_len(wrbuf);
+ if (len > SORT_MAX_MULTI)
+ {
+ len = SORT_MAX_MULTI;
+ wrbuf_buf(wrbuf)[len-1] = '\0';
+ }
+ 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;
}
}
-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;
case ZEBRA_SORT_TYPE_FLAT:
r = bf_read(sf->u.bf, si->sysno+1, 0, 0, tbuf);
if (r && *tbuf)
+ {
wrbuf_puts(w, tbuf);
- else
- return 0;
+ wrbuf_putc(w, '\0');
+ return 1;
+ }
break;
case ZEBRA_SORT_TYPE_ISAMB:
case ZEBRA_SORT_TYPE_MULTI:
- if (!sf->isam_p)
- return 0;
- else
+ if (sf->isam_p)
{
- struct sort_term st, st_untilbuf;
if (!sf->isam_pp)
sf->isam_pp = isamb_pp_open(sf->u.isamb, sf->isam_p, 1);
- if (!sf->isam_pp)
- return 0;
-
- st_untilbuf.sysno = si->sysno;
- st_untilbuf.length = 0;
- st_untilbuf.term[0] = '\0';
- r = isamb_pp_forward(sf->isam_pp, &st, &st_untilbuf);
- if (!r)
- return 0;
- if (r)
+ if (sf->isam_pp)
{
- if (st.sysno != si->sysno)
+ 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)
{
- yaz_log(YLOG_LOG, "Received sysno=" ZINT_FORMAT " looking for "
- ZINT_FORMAT, st.sysno, si->sysno);
- return 0;
+ wrbuf_write(w, st.term, st.length);
+ if (section_id)
+ *section_id = st.section_id;
+ return 1;
}
- wrbuf_write(w, st.term, st.length);
}
}
break;
}
- return 1;
+ return 0;
}
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab