X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=8b15b89a09a82246783861efbf29525dd6879ed4;hb=f7ad7a7efdffe5f1ff2cf36ad64cb6c10ebfed4f;hp=f32e57536b0b19ceea6a471e5a05c2decbb86217;hpb=0f3b8bcc6fe2e3beeec7c834d9a64dca48a4f1b7;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index f32e575..8b15b89 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,4 +1,4 @@ -/* $Id: extract.c,v 1.179 2005-04-28 08:20:39 adam Exp $ +/* $Id: extract.c,v 1.182 2005-04-29 10:33:53 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -148,8 +148,6 @@ struct file_read_info { off_t file_moffset; /* offset of rec/rec boundary */ int file_more; int fd; - char *sdrbuf; - int sdrmax; }; static struct file_read_info *file_read_start (int fd) @@ -160,8 +158,8 @@ static struct file_read_info *file_read_start (int fd) fi->fd = fd; fi->file_max = 0; fi->file_moffset = 0; - fi->sdrbuf = 0; - fi->sdrmax = 0; + fi->file_offset = 0; + fi->file_more = 0; return fi; } @@ -174,8 +172,6 @@ static off_t file_seek (void *handle, off_t offset) { struct file_read_info *p = (struct file_read_info *) handle; p->file_offset = offset; - if (p->sdrbuf) - return offset; return lseek (p->fd, offset, SEEK_SET); } @@ -190,16 +186,7 @@ static int file_read (void *handle, char *buf, size_t count) struct file_read_info *p = (struct file_read_info *) handle; int fd = p->fd; int r; - if (p->sdrbuf) - { - r = count; - if (r > p->sdrmax - p->file_offset) - r = p->sdrmax - p->file_offset; - if (r) - memcpy (buf, p->sdrbuf + p->file_offset, r); - } - else - r = read (fd, buf, count); + r = read (fd, buf, count); if (r > 0) { p->file_offset += r; @@ -209,23 +196,15 @@ static int file_read (void *handle, char *buf, size_t count) return r; } -static void file_begin (void *handle) -{ - struct file_read_info *p = (struct file_read_info *) handle; - - p->file_offset = p->file_moffset; - if (!p->sdrbuf && p->file_moffset) - lseek (p->fd, p->file_moffset, SEEK_SET); - p->file_more = 0; -} - static void file_end (void *handle, off_t offset) { struct file_read_info *p = (struct file_read_info *) handle; - assert (p->file_more == 0); - p->file_more = 1; - p->file_moffset = offset; + if (offset != p->file_moffset) + { + p->file_moffset = offset; + p->file_more = 1; + } } static char *fileMatchStr (ZebraHandle zh, @@ -390,7 +369,21 @@ void create_rec_keys_codec(struct recKeys *keys) keys->buf_used = 0; iscz1_reset(keys->codec_handle); } - + +static void init_extractCtrl(ZebraHandle zh, struct recExtractCtrl *ctrl) +{ + int i; + for (i = 0; i<256; i++) + { + if (zebra_maps_is_positioned(zh->reg->zebra_maps, i)) + ctrl->seqno[i] = 1; + else + ctrl->seqno[i] = 0; + } + ctrl->zebra_maps = zh->reg->zebra_maps; + ctrl->flagShowRecords = !zh->m_flag_rw; +} + static int file_extract_record(ZebraHandle zh, SYSNO *sysno, const char *fname, int deleteFlag, @@ -419,12 +412,9 @@ static int file_extract_record(ZebraHandle zh, struct recExtractCtrl extractCtrl; /* we are going to read from a file, so prepare the extraction */ - int i; - create_rec_keys_codec(&zh->reg->keys); zh->reg->sortKeys.buf_used = 0; - recordOffset = fi->file_moffset; extractCtrl.handle = zh; @@ -443,15 +433,7 @@ static int file_extract_record(ZebraHandle zh, extract_set_store_data_prepare(&extractCtrl); - for (i = 0; i<256; i++) - { - if (zebra_maps_is_positioned(zh->reg->zebra_maps, i)) - extractCtrl.seqno[i] = 1; - else - extractCtrl.seqno[i] = 0; - } - extractCtrl.zebra_maps = zh->reg->zebra_maps; - extractCtrl.flagShowRecords = !zh->m_flag_rw; + init_extractCtrl(zh, &extractCtrl); if (!zh->m_flag_rw) printf ("File: %s " PRINTF_OFF_T "\n", fname, recordOffset); @@ -689,7 +671,6 @@ static int file_extract_record(ZebraHandle zh, rec->size[recInfo_storeData] = zh->store_data_size; rec->info[recInfo_storeData] = zh->store_data_buf; zh->store_data_buf = 0; - file_end(fi, fi->file_offset); } else if (zh->m_store_data) { @@ -819,10 +800,17 @@ int fileExtract (ZebraHandle zh, SYSNO *sysno, const char *fname, fi = file_read_start (fd); do { - file_begin (fi); + fi->file_moffset = fi->file_offset; + fi->file_more = 0; /* file_end not called (yet) */ r = file_extract_record (zh, sysno, fname, deleteFlag, fi, 1, recType, recTypeClientData); - } while (r && !sysno && fi->file_more); + if (fi->file_more) + { /* file_end has been called so reset offset .. */ + fi->file_offset = fi->file_moffset; + lseek(fi->fd, fi->file_moffset, SEEK_SET); + } + } + while (r && !sysno); file_read_stop (fi); if (fd != -1) close (fd); @@ -849,7 +837,7 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh, { RecordAttr *recordAttr; struct recExtractCtrl extractCtrl; - int i, r; + int r; const char *matchStr = 0; RecType recType = NULL; void *clientData; @@ -918,16 +906,10 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh, extractCtrl.schemaAdd = extract_schema_add; extractCtrl.dh = zh->reg->dh; extractCtrl.handle = zh; - extractCtrl.zebra_maps = zh->reg->zebra_maps; - extractCtrl.flagShowRecords = 0; extractCtrl.match_criteria[0] = '\0'; - for (i = 0; i<256; i++) - { - if (zebra_maps_is_positioned(zh->reg->zebra_maps, i)) - extractCtrl.seqno[i] = 1; - else - extractCtrl.seqno[i] = 0; - } + + init_extractCtrl(zh, &extractCtrl); + extract_set_store_data_prepare(&extractCtrl); r = (*recType->extract)(clientData, &extractCtrl); @@ -1158,7 +1140,15 @@ ZEBRA_RES buffer_extract_record (ZebraHandle zh, /* update store data */ xfree (rec->info[recInfo_storeData]); - if (zh->m_store_data) + + /* update store data */ + if (zh->store_data_buf) + { + rec->size[recInfo_storeData] = zh->store_data_size; + rec->info[recInfo_storeData] = zh->store_data_buf; + zh->store_data_buf = 0; + } + else if (zh->m_store_data) { rec->size[recInfo_storeData] = recordAttr->recordSize; rec->info[recInfo_storeData] = (char *) @@ -1188,7 +1178,6 @@ int explain_extract (void *handle, Record rec, data1_node *n) { ZebraHandle zh = (ZebraHandle) handle; struct recExtractCtrl extractCtrl; - int i; if (zebraExplain_curDatabase (zh->reg->zei, rec->info[recInfo_databaseName])) @@ -1207,9 +1196,9 @@ int explain_extract (void *handle, Record rec, data1_node *n) extractCtrl.tokenAdd = extract_token_add; extractCtrl.schemaAdd = extract_schema_add; extractCtrl.dh = zh->reg->dh; - for (i = 0; i<256; i++) - extractCtrl.seqno[i] = 0; - extractCtrl.zebra_maps = zh->reg->zebra_maps; + + init_extractCtrl(zh, &extractCtrl); + extractCtrl.flagShowRecords = 0; extractCtrl.match_criteria[0] = '\0'; extractCtrl.handle = handle;