/*********************************************** !!!! DO NOT EDIT THIS FILE !!!! This file was auto-generated by Build.PL from lib/KinoSearch/Index/TermInfosWriter.pm See KinoSearch::Docs::DevGuide for details. ***********************************************/ #line 195 "lib/KinoSearch/Index/TermInfosWriter.pm" #include "KinoSearchIndexTermInfosWriter.h" TermInfosWriter* Kino_TInfosWriter_new(SV *outstream_sv, I32 is_index, I32 index_interval, I32 skip_interval) { TermInfosWriter *obj; /* allocate */ Kino_New(0, obj, 1, TermInfosWriter); /* assign */ obj->is_index = is_index; obj->index_interval = index_interval; obj->skip_interval = skip_interval; obj->fh_sv = newSVsv(outstream_sv); Kino_extract_struct(obj->fh_sv, obj->fh, OutStream*, "KinoSearch::Store::OutStream"); /* NOTE: this value forces the first field_num in the .tii file to -1. * Do not change it. */ obj->last_termstring = Kino_BB_new_string("\xff\xff", 2); obj->last_tinfo = Kino_TInfo_new(); obj->last_fieldnum = -1; obj->last_tis_ptr = 0, obj->size = 0; obj->other = NULL; obj->other_sv = &PL_sv_undef; /* write file header */ obj->fh->write_int(obj->fh, KINO_TINFOS_FORMAT); obj->fh->write_long(obj->fh, 0.0); /* return to fill in later */ obj->fh->write_int(obj->fh, index_interval); obj->fh->write_int(obj->fh, skip_interval); return obj; } /* Write out a term/terminfo combo. */ void Kino_TInfosWriter_add(TermInfosWriter* obj, ByteBuf* termstring_bb, TermInfo* tinfo) { char *termstring, *last_tstring; STRLEN termstring_len, last_tstring_len; I32 field_num; I32 overlap; char *diff_start_str; STRLEN diff_len; OutStream* fh; /* make local copy */ fh = obj->fh; /* write a subset of the entries to the .tii index */ if ( (obj->size % obj->index_interval == 0) && (!obj->is_index) ) { Kino_TInfosWriter_add(obj->other, obj->last_termstring, obj->last_tinfo); } /* extract string pointers and string lengths */ termstring = termstring_bb->ptr; last_tstring = obj->last_termstring->ptr; termstring_len = termstring_bb->size; last_tstring_len = obj->last_termstring->size; /* to obtain field number, decode packed 'n' at top of termstring */ field_num = (I16)Kino_decode_bigend_U16(termstring); /* move past field_num */ termstring += KINO_FIELD_NUM_LEN; last_tstring += KINO_FIELD_NUM_LEN; termstring_len -= KINO_FIELD_NUM_LEN; last_tstring_len -= KINO_FIELD_NUM_LEN; /* count how many bytes the strings share at the top */ overlap = Kino_StrHelp_string_diff(last_tstring, termstring, last_tstring_len, termstring_len); diff_start_str = termstring + overlap; diff_len = termstring_len - overlap; /* write number of common bytes */ fh->write_vint(fh, overlap); /* write common bytes */ fh->write_string(fh, diff_start_str, diff_len); /* write field number and doc_freq */ fh->write_vint(fh, field_num); fh->write_vint(fh, tinfo->doc_freq); /* delta encode filepointers */ fh->write_vlong(fh, (tinfo->frq_fileptr - obj->last_tinfo->frq_fileptr) ); fh->write_vlong(fh, (tinfo->prx_fileptr - obj->last_tinfo->prx_fileptr) ); /* write skipdata */ if (tinfo->doc_freq >= obj->skip_interval) fh->write_vint(fh, tinfo->skip_offset); /* the .tii index file gets a pointer to the location of the primary */ if (obj->is_index) { double tis_ptr; tis_ptr = obj->other->fh->tell(obj->other->fh); obj->fh->write_vlong(obj->fh, (tis_ptr - obj->last_tis_ptr)); obj->last_tis_ptr = tis_ptr; } /* track number of terms */ obj->size++; /* remember for delta encoding */ Kino_BB_assign_string(obj->last_termstring, termstring_bb->ptr, termstring_bb->size); StructCopy(tinfo, obj->last_tinfo, TermInfo); } void Kino_TInfosWriter_destroy(TermInfosWriter *obj) { SvREFCNT_dec(obj->fh_sv); SvREFCNT_dec(obj->other_sv); Kino_BB_destroy(obj->last_termstring); Kino_TInfo_destroy(obj->last_tinfo); Kino_Safefree(obj); }