X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fsortidx.c;h=6c79a060760fc2b2570e9f8f435eb574bf2ff3c6;hb=8c1d8b5e863e1375f9e25c4e11c8443f11c22496;hp=a5d5c7b0aa79526da76d06679bdd39361a59c351;hpb=af102b1fb451ba27bfa7343528c4240b3ab3a80b;p=idzebra-moved-to-github.git diff --git a/index/sortidx.c b/index/sortidx.c index a5d5c7b..6c79a06 100644 --- a/index/sortidx.c +++ b/index/sortidx.c @@ -1,5 +1,5 @@ /* 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 @@ -18,7 +18,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#if HAVE_CONFIG_H +#include +#endif +#include #include #include @@ -35,6 +38,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA struct sort_term { zint sysno; + zint section_id; zint length; char term[SORT_MAX_MULTI]; }; @@ -46,8 +50,8 @@ static void sort_term_log_item(int level, const void *b, const char *txt) 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) @@ -61,6 +65,11 @@ 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; } @@ -88,7 +97,8 @@ static void sort_term_encode2(void *p, char **dst, const char **src) 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; @@ -100,6 +110,7 @@ static void sort_term_decode1(void *p, char **dst, const char **src) size_t slen; zebra_zint_decode(src, &a1.sysno); + a1.section_id = 0; strcpy(a1.term, *src); slen = 1 + strlen(a1.term); @@ -115,6 +126,7 @@ static void sort_term_decode2(void *p, char **dst, const char **src) 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); @@ -146,7 +158,7 @@ static int sort_term_code_read(void *vp, char **dst, int *insertMode) return 0; (s->no)--; - + *insertMode = s->insert_flag; memcpy(*dst, &s->st, sizeof(s->st)); *dst += sizeof(s->st); @@ -270,7 +282,7 @@ int zebra_sort_type(zebra_sort_index_t si, int id) 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, @@ -290,7 +302,7 @@ int zebra_sort_type(zebra_sort_index_t si, int id) 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, @@ -315,31 +327,32 @@ int zebra_sort_type(zebra_sort_index_t si, int id) 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; @@ -360,14 +373,15 @@ void zebra_sort_delete(zebra_sort_index_t si) 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++; } @@ -375,7 +389,7 @@ void zebra_sort_delete(zebra_sort_index_t si) } } -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; @@ -389,7 +403,7 @@ void zebra_sort_add(zebra_sort_index_t si, WRBUF wrbuf) 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); @@ -413,11 +427,12 @@ void zebra_sort_add(zebra_sort_index_t si, WRBUF wrbuf) 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++; } @@ -437,11 +452,12 @@ void zebra_sort_add(zebra_sort_index_t si, WRBUF wrbuf) 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++; } @@ -450,7 +466,7 @@ void zebra_sort_add(zebra_sort_index_t si, WRBUF wrbuf) } -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; @@ -482,12 +498,15 @@ int zebra_sort_read(zebra_sort_index_t si, WRBUF w) 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; } } @@ -499,6 +518,7 @@ int zebra_sort_read(zebra_sort_index_t si, WRBUF w) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab