+ struct sortFile *sf = si->current_file;
+ int len;
+
+ if (!sf || !sf->u.bf)
+ return;
+ switch(si->type)
+ {
+ case ZEBRA_SORT_TYPE_FLAT:
+ /* take first entry from wrbuf - itself is 0-terminated */
+ 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);
+ 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;
+ /* take first entry from wrbuf - itself is 0-terminated */
+
+ 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.st.sysno = si->sysno;
+ 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(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.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;
+ }
+}
+
+
+int zebra_sort_read(zebra_sort_index_t si, WRBUF w)
+{
+ int r;
+ struct sortFile *sf = si->current_file;
+ char tbuf[SORT_IDX_ENTRYSIZE];
+
+ assert(sf);
+ assert(sf->u.bf);
+
+ switch(si->type)
+ {
+ case ZEBRA_SORT_TYPE_FLAT:
+ r = bf_read(sf->u.bf, si->sysno+1, 0, 0, tbuf);
+ if (r && *tbuf)
+ {
+ wrbuf_puts(w, tbuf);
+ wrbuf_putc(w, '\0');
+ return 1;
+ }
+ break;
+ case ZEBRA_SORT_TYPE_ISAMB:
+ case ZEBRA_SORT_TYPE_MULTI:
+ if (sf->isam_p)
+ {
+
+ if (!sf->isam_pp)
+ sf->isam_pp = isamb_pp_open(sf->u.isamb, sf->isam_p, 1);
+ if (sf->isam_pp)
+ {
+ struct sort_term st, st_untilbuf;
+
+ 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 && st.sysno == si->sysno)
+ {
+ wrbuf_write(w, st.term, st.length);
+ return 1;
+ }
+ }
+ }
+ break;
+ }
+ return 0;