X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=013784c6ba8c0d4ee57e1ce96148e3a0ec45bbb2;hb=801ef4b322574c793abdc1ba81dea2da62ca60bc;hp=ae8a6c44d2d555d4f4f1b19962f92daa0012fb46;hpb=247f1ebfc107315f1c0b2b59bb59fe4774f3b0d4;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index ae8a6c4..013784c 100644 --- a/index/extract.c +++ b/index/extract.c @@ -4,7 +4,14 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: extract.c,v $ - * Revision 1.79 1998-02-17 10:32:52 adam + * Revision 1.81 1998-03-11 11:19:04 adam + * Changed the way sequence numbers are generated. + * + * Revision 1.80 1998/03/05 08:45:11 adam + * New result set model and modular ranking system. Moved towards + * descent server API. System information stored as "SGML" records. + * + * Revision 1.79 1998/02/17 10:32:52 adam * Fixed bug: binary files weren't opened with flag b on NT. * * Revision 1.78 1998/02/10 12:03:05 adam @@ -318,7 +325,7 @@ static int records_updated = 0; static int records_deleted = 0; static int records_processed = 0; -static ZebTargetInfo *zti = NULL; +static ZebraExplainInfo zti = NULL; static void logRecord (int showFlag) { @@ -332,7 +339,7 @@ static void logRecord (int showFlag) } } -int key_open (BFiles bfs, int mem, int rw) +int key_open (BFiles bfs, int mem, int rw, data1_handle dh) { if (!mem) mem = atoi(res_get_def (common_resource, "memMax", "4"))*1024*1024; @@ -357,7 +364,7 @@ int key_open (BFiles bfs, int mem, int rw) dict_close (matchDict); return -1; } - zti = zebTargetInfo_open (records, rw); + zti = zebraExplain_open (records, dh, rw); if (!zti) { rec_close (&records); @@ -536,13 +543,13 @@ void key_flush (void) key_buf_used = 0; } -int key_close () +int key_close (int rw) { key_flush (); xfree (key_buf); -#if 1 - zebTargetInfo_close (zti, 1); -#endif + if (rw) + zebraExplain_runNumberIncrement (zti, 1); + zebraExplain_close (zti, rw); rec_close (&records); dict_close (matchDict); sortIdx_close (sortIdx); @@ -554,6 +561,7 @@ int key_close () static void wordInit (struct recExtractCtrl *p, RecWord *w) { w->zebra_maps = p->zebra_maps; + w->seqnos = p->seqno; w->attrSet = 1; w->attrUse = 1016; w->reg_type = 'w'; @@ -583,6 +591,7 @@ static void addIndexString (RecWord *p, const char *string, int length) short attrUse; int lead = 0; int diff = 0; + int *pseqno = &p->seqnos[p->reg_type]; if (reckeys.buf_used+1024 > reckeys.buf_max) { @@ -607,14 +616,14 @@ static void addIndexString (RecWord *p, const char *string, int length) else reckeys.prevAttrUse = attrUse; #if 1 - diff = 1 + p->seqno - reckeys.prevSeqNo; + diff = 1 + *pseqno - reckeys.prevSeqNo; if (diff >= 1 && diff <= 15) lead |= (diff << 2); else diff = 0; #endif - reckeys.prevSeqNo = p->seqno; - + reckeys.prevSeqNo = *pseqno; + *dst++ = lead; if (!(lead & 1)) @@ -634,11 +643,11 @@ static void addIndexString (RecWord *p, const char *string, int length) if (!diff) { - memcpy (dst, &p->seqno, sizeof(p->seqno)); - dst += sizeof(p->seqno); + memcpy (dst, pseqno, sizeof(*pseqno)); + dst += sizeof(*pseqno); } reckeys.buf_used = dst - reckeys.buf; - (p->seqno)++; + (*pseqno)++; } static void addSortString (RecWord *p, const char *string, int length) @@ -792,11 +801,12 @@ static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys, int seqno = 0; int off = 0; - if (zebTargetInfo_curDatabase (zti, databaseName)) + if (zebraExplain_curDatabase (zti, databaseName)) { - if (zebTargetInfo_newDatabase (zti, databaseName)) + if (zebraExplain_newDatabase (zti, databaseName)) abort (); } + zebraExplain_recordCountIncrement (zti, cmd ? 1 : -1); while (off < reckeys->buf_used) { const char *src = reckeys->buf + off; @@ -820,9 +830,9 @@ static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys, ++ptr_i; key_buf[ptr_top-ptr_i] = (char*)key_buf + key_buf_used; - ch = zebTargetInfo_lookupSU (zti, attrSet, attrUse); + ch = zebraExplain_lookupSU (zti, attrSet, attrUse); if (ch < 0) - ch = zebTargetInfo_addSU (zti, attrSet, attrUse); + ch = zebraExplain_addSU (zti, attrSet, attrUse); assert (ch > 0); ((char*) key_buf) [key_buf_used++] = ch; while (*src) @@ -848,7 +858,7 @@ static void flushRecordKeys (SYSNO sysno, int cmd, struct recKeys *reckeys, } static const char **searchRecordKey (struct recKeys *reckeys, - int attrSetS, int attrUseS) + int attrSetS, int attrUseS) { static const char *ws[32]; int off = 0; @@ -1147,6 +1157,7 @@ static int recordExtract (SYSNO *sysno, const char *fname, char *subType) { struct recExtractCtrl extractCtrl; + RecordAttr *recordAttr; int r; char *matchStr; SYSNO sysnotmp; @@ -1156,6 +1167,7 @@ static int recordExtract (SYSNO *sysno, const char *fname, if (fi->fd != -1) { + int i; /* we are going to read from a file, so prepare the extraction */ extractCtrl.fh = fi; extractCtrl.subType = subType; @@ -1168,6 +1180,8 @@ static int recordExtract (SYSNO *sysno, const char *fname, reckeys.prevAttrSet = -1; reckeys.prevSeqNo = 0; + for (i = 0; i<256; i++) + extractCtrl.seqno[i] = 0; recordOffset = fi->file_moffset; extractCtrl.offset = recordOffset; extractCtrl.readf = file_read; @@ -1252,8 +1266,11 @@ static int recordExtract (SYSNO *sysno, const char *fname, logf (LOG_LOG, "add %s %s %ld", rGroup->recordType, fname, (long) recordOffset); rec = rec_new (records); + *sysno = rec->sysno; + recordAttr = rec_init_attr (zti, rec); + if (matchStr) { dict_insert (matchDict, matchStr, sizeof(*sysno), sysno); @@ -1270,6 +1287,17 @@ static int recordExtract (SYSNO *sysno, const char *fname, rec = rec_get (records, *sysno); assert (rec); + + recordAttr = rec_init_attr (zti, rec); + + if (recordAttr->runNumber == zebraExplain_runNumberIncrement (zti, 0)) + { + logf (LOG_LOG, "skipped %s %s %ld", rGroup->recordType, + fname, (long) recordOffset); + rec_rm (&rec); + logRecord (0); + return 1; + } delkeys.buf_used = rec->size[recInfo_delKeys]; delkeys.buf = rec->info[recInfo_delKeys]; flushSortKeys (*sysno, 0); @@ -1293,6 +1321,7 @@ static int recordExtract (SYSNO *sysno, const char *fname, dict_delete (matchDict, matchStr); rec_del (records, &rec); } + rec_rm (&rec); logRecord (0); return 1; } @@ -1347,25 +1376,33 @@ static int recordExtract (SYSNO *sysno, const char *fname, rec->size[recInfo_delKeys] = 0; } + /* save file size of original record */ + zebraExplain_recordBytesIncrement (zti, - recordAttr->recordSize); + recordAttr->recordSize = fi->file_moffset - recordOffset; + if (!recordAttr->recordSize) + recordAttr->recordSize = fi->file_max - recordOffset; + zebraExplain_recordBytesIncrement (zti, recordAttr->recordSize); + + /* set run-number for this record */ + recordAttr->runNumber = zebraExplain_runNumberIncrement (zti, 0); + /* update store data */ xfree (rec->info[recInfo_storeData]); if (rGroup->flagStoreData == 1) { - int size = fi->file_moffset - recordOffset; - if (!size) - size = fi->file_max - recordOffset; - rec->size[recInfo_storeData] = size; - rec->info[recInfo_storeData] = xmalloc (size); + rec->size[recInfo_storeData] = recordAttr->recordSize; + rec->info[recInfo_storeData] = xmalloc (recordAttr->recordSize); if (lseek (fi->fd, recordOffset, SEEK_SET) < 0) { logf (LOG_ERRNO|LOG_FATAL, "seek to %ld in %s", fname, (long) recordOffset); exit (1); } - if (read (fi->fd, rec->info[recInfo_storeData], size) < size) + if (read (fi->fd, rec->info[recInfo_storeData], recordAttr->recordSize) + < recordAttr->recordSize) { logf (LOG_ERRNO|LOG_FATAL, "read %d bytes of %s", - fi->file_max, fname); + recordAttr->recordSize, fname); exit (1); } } @@ -1380,11 +1417,7 @@ static int recordExtract (SYSNO *sysno, const char *fname, rec_strdup (rGroup->databaseName, &rec->size[recInfo_databaseName]); /* update offset */ - xfree (rec->info[recInfo_offset]); - - rec->size[recInfo_offset] = sizeof(recordOffset); - rec->info[recInfo_offset] = xmalloc (sizeof(recordOffset)); - memcpy (rec->info[recInfo_offset], &recordOffset, sizeof(recordOffset)); + recordAttr->recordOffset = recordOffset; /* commit this record */ rec_put (records, &rec);