X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=a980bcf26b0fede3d9ba9f7da960bb4100fd773c;hb=9ceac3e96fe083b93b6fd4a676003dd10482e465;hp=0432e60c4f9190db5827d76e46d88e52d66dc854;hpb=1369748dd7899789c97d94801048bf942e0cc6e6;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 0432e60..a980bcf 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,4 +1,4 @@ -/* $Id: extract.c,v 1.216 2006-05-19 23:20:24 adam Exp $ +/* $Id: extract.c,v 1.218 2006-05-30 13:44:44 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -48,6 +48,25 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif +#define ENCODE_BUFLEN 768 +struct encode_info { +#if 0 + int sysno; /* previously written values for delta-compress */ + int seqno; + int cmd; + int prevsys; /* buffer for skipping insert/delete pairs */ + int prevseq; + int prevcmd; + int keylen; /* tells if we have an unwritten key in buf, and how long*/ +#endif + void *encode_handle; + void *decode_handle; + char buf[ENCODE_BUFLEN]; +}; + +static void encode_key_init (struct encode_info *i); +static void encode_key_write (char *k, struct encode_info *i, FILE *outf); +static void encode_key_flush (struct encode_info *i, FILE *outf); #define USE_SHELLSORT 0 @@ -1881,24 +1900,10 @@ void extract_flushSortKeys (ZebraHandle zh, SYSNO sysno, void encode_key_init (struct encode_info *i) { - i->sysno = 0; - i->seqno = 0; - i->cmd = -1; - i->prevsys=0; - i->prevseq=0; - i->prevcmd=-1; - i->keylen=0; i->encode_handle = iscz1_start(); i->decode_handle = iscz1_start(); } -#define OLDENCODE 1 - -#ifdef OLDENCODE -/* this is the old encode_key_write - * may be deleted once we are confident that the new works - * HL 15-oct-2002 - */ void encode_key_write (char *k, struct encode_info *i, FILE *outf) { struct it_key key; @@ -1949,107 +1954,6 @@ void encode_key_flush (struct encode_info *i, FILE *outf) iscz1_stop(i->decode_handle); } -#else - -/* new encode_key_write - * The idea is to buffer one more key, and compare them - * If we are going to delete and insert the same key, - * we may as well not bother. Should make a difference in - * updates with small modifications (appending to a mbox) - */ -void encode_key_write (char *k, struct encode_info *i, FILE *outf) -{ - struct it_key key; - char *bp; - - if (*k) /* first time for new key */ - { - bp = i->buf; - while ((*bp++ = *k++)) - ; - i->keylen= bp - i->buf -1; - assert(i->keylen+1+sizeof(struct it_key) < ENCODE_BUFLEN); - } - else - { - bp=i->buf + i->keylen; - *bp++=0; - k++; - } - - memcpy (&key, k+1, sizeof(struct it_key)); - if (0==i->prevsys) /* no previous filter, fill up */ - { - i->prevsys=key.sysno; - i->prevseq=key.seqno; - i->prevcmd=*k; - } - else if ( (i->prevsys==key.sysno) && - (i->prevseq==key.seqno) && - (i->prevcmd!=*k) ) - { /* same numbers, diff cmd, they cancel out */ - i->prevsys=0; - } - else - { /* different stuff, write previous, move buf */ - bp = encode_key_int ( (i->prevsys - i->sysno) * 2 + i->prevcmd, bp); - if (i->sysno != i->prevsys) - { - i->sysno = i->prevsys; - i->seqno = 0; - } - else if (!i->seqno && !i->prevseq && i->cmd == i->prevcmd) - { - return; /* ??? Filters some sort of duplicates away */ - /* ??? Can this ever happen -H 15oct02 */ - } - bp = encode_key_int (i->prevseq - i->seqno, bp); - i->seqno = i->prevseq; - i->cmd = i->prevcmd; - if (fwrite (i->buf, bp - i->buf, 1, outf) != 1) - { - yaz_log (YLOG_FATAL|YLOG_ERRNO, "fwrite"); - exit (1); - } - i->keylen=0; /* ok, it's written, forget it */ - i->prevsys=key.sysno; - i->prevseq=key.seqno; - i->prevcmd=*k; - } -} - -void encode_key_flush (struct encode_info *i, FILE *outf) -{ /* flush the last key from i */ - char *bp =i->buf + i->keylen; - if (0==i->prevsys) - { - return; /* nothing to flush */ - } - *bp++=0; - bp = encode_key_int ( (i->prevsys - i->sysno) * 2 + i->prevcmd, bp); - if (i->sysno != i->prevsys) - { - i->sysno = i->prevsys; - i->seqno = 0; - } - else if (!i->seqno && !i->prevseq && i->cmd == i->prevcmd) - { - return; /* ??? Filters some sort of duplicates away */ - /* ??? Can this ever happen -H 15oct02 */ - } - bp = encode_key_int (i->prevseq - i->seqno, bp); - i->seqno = i->prevseq; - i->cmd = i->prevcmd; - if (fwrite (i->buf, bp - i->buf, 1, outf) != 1) - { - yaz_log (YLOG_FATAL|YLOG_ERRNO, "fwrite"); - exit (1); - } - i->keylen=0; /* ok, it's written, forget it */ - i->prevsys=0; /* forget the values too */ - i->prevseq=0; -} -#endif /* * Local variables: * c-basic-offset: 4