X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=8358ade76267aafb7d93100dae38f678c74f3174;hb=b88909df16157ed1e7859bc3fad6b01520d4865e;hp=0432e60c4f9190db5827d76e46d88e52d66dc854;hpb=1369748dd7899789c97d94801048bf942e0cc6e6;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 0432e60..8358ade 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.220 2006-06-13 12:02:06 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -48,6 +48,36 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif +#define ENCODE_BUFLEN 768 +struct encode_info { + void *encode_handle; + void *decode_handle; + char buf[ENCODE_BUFLEN]; +}; + +static int log_level = 0; +static int log_level_initialized = 1; + +static void zebra_init_log_level() +{ + if (!log_level_initialized) + { + log_level = yaz_log_module_level("extract"); + log_level_initialized = 1; + } +} + +static void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno, + int cmd, zebra_rec_keys_t reckeys, + zint staticrank); +static void extract_flushSortKeys (ZebraHandle zh, SYSNO sysno, + int cmd, zebra_rec_keys_t skp); +static void extract_schema_add (struct recExtractCtrl *p, Odr_oid *oid); +static void extract_token_add (RecWord *p); + +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 @@ -81,10 +111,10 @@ static void logRecord (ZebraHandle zh) ++zh->records_processed; if (!(zh->records_processed % 1000)) { - yaz_log (YLOG_LOG, "Records: "ZINT_FORMAT" i/u/d " - ZINT_FORMAT"/"ZINT_FORMAT"/"ZINT_FORMAT, - zh->records_processed, zh->records_inserted, zh->records_updated, - zh->records_deleted); + yaz_log(YLOG_LOG, "Records: "ZINT_FORMAT" i/u/d " + ZINT_FORMAT"/"ZINT_FORMAT"/"ZINT_FORMAT, + zh->records_processed, zh->records_inserted, + zh->records_updated, zh->records_deleted); } } @@ -126,7 +156,7 @@ static void searchRecordKey(ZebraHandle zh, if (zebra_rec_keys_rewind(reckeys)) { - int startSeq = -1; + zint startSeq = -1; const char *str; size_t slen; struct it_key key; @@ -139,7 +169,7 @@ static void searchRecordKey(ZebraHandle zh, if (key.mem[0] == ch) { - int woff; + zint woff; if (startSeq == -1) startSeq = seqno; @@ -749,12 +779,14 @@ ZEBRA_RES zebra_extract_file(ZebraHandle zh, SYSNO *sysno, const char *fname, RecType recType; void *recTypeClientData; + zebra_init_log_level(); + if (!zh->m_group || !*zh->m_group) *gprefix = '\0'; else sprintf (gprefix, "%s.", zh->m_group); - yaz_log (YLOG_DEBUG, "fileExtract %s", fname); + yaz_log(log_level, "zebra_extract_file %s", fname); /* determine file extension */ *ext = '\0'; @@ -857,16 +889,16 @@ ZEBRA_RES zebra_extract_file(ZebraHandle zh, SYSNO *sysno, const char *fname, If not, and a record is provided, then sysno is got from there */ -ZEBRA_RES buffer_extract_record(ZebraHandle zh, - const char *buf, size_t buf_size, - int delete_flag, - int test_mode, - const char *recordType, - SYSNO *sysno, - const char *match_criteria, - const char *fname, - int force_update, - int allow_update) +ZEBRA_RES zebra_buffer_extract_record(ZebraHandle zh, + const char *buf, size_t buf_size, + int delete_flag, + int test_mode, + const char *recordType, + SYSNO *sysno, + const char *match_criteria, + const char *fname, + int force_update, + int allow_update) { SYSNO sysno0 = 0; RecordAttr *recordAttr; @@ -881,6 +913,8 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, const char *pr_fname = fname; /* filename to print .. */ int show_progress = zh->records_processed < zh->m_file_verbose_limit ? 1:0; + zebra_init_log_level(); + if (!pr_fname) pr_fname = ""; /* make it printable if file is omitted */ @@ -911,7 +945,7 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, if (recordType && *recordType) { - yaz_log (YLOG_DEBUG, "Record type explicitly specified: %s", recordType); + yaz_log(log_level, "Record type explicitly specified: %s", recordType); recType = recType_byName (zh->reg->recTypes, zh->res, recordType, &clientData); } @@ -922,7 +956,8 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, yaz_log (YLOG_WARN, "No such record type defined"); return ZEBRA_FAIL; } - yaz_log (YLOG_DEBUG, "Get record type from rgroup: %s",zh->m_record_type); + yaz_log(log_level, "Get record type from rgroup: %s", + zh->m_record_type); recType = recType_byName (zh->reg->recTypes, zh->res, zh->m_record_type, &clientData); recordType = zh->m_record_type; @@ -1073,16 +1108,16 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, /* record going to be deleted */ if (zebra_rec_keys_empty(delkeys)) { - yaz_log (YLOG_LOG, "delete %s %s %ld", recordType, - pr_fname, (long) recordOffset); - yaz_log (YLOG_WARN, "cannot delete file above, " - "storeKeys false (3)"); + yaz_log(YLOG_LOG, "delete %s %s %ld", recordType, + pr_fname, (long) recordOffset); + yaz_log(YLOG_WARN, "cannot delete file above, " + "storeKeys false (3)"); } else { if (show_progress) - yaz_log (YLOG_LOG, "delete %s %s %ld", recordType, - pr_fname, (long) recordOffset); + yaz_log(YLOG_LOG, "delete %s %s %ld", recordType, + pr_fname, (long) recordOffset); zh->records_deleted++; if (matchStr) { @@ -1098,8 +1133,8 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, else { if (show_progress) - yaz_log (YLOG_LOG, "update %s %s %ld", recordType, - pr_fname, (long) recordOffset); + yaz_log(YLOG_LOG, "update %s %s %ld", recordType, + pr_fname, (long) recordOffset); recordAttr->staticrank = extractCtrl.staticrank; extract_flushSortKeys (zh, *sysno, 1, zh->reg->sortKeys); extract_flushRecordKeys (zh, *sysno, 1, zh->reg->keys, @@ -1192,7 +1227,7 @@ ZEBRA_RES buffer_extract_record(ZebraHandle zh, return ZEBRA_OK; } -int explain_extract (void *handle, Record rec, data1_node *n) +ZEBRA_RES zebra_extract_explain(void *handle, Record rec, data1_node *n) { ZebraHandle zh = (ZebraHandle) handle; struct recExtractCtrl extractCtrl; @@ -1258,8 +1293,7 @@ int explain_extract (void *handle, Record rec, data1_node *n) zebra_rec_keys_get_buf(zh->reg->sortKeys, &rec->info[recInfo_sortKeys], &rec->size[recInfo_sortKeys]); - - return 0; + return ZEBRA_OK; } void extract_rec_keys_adjust(ZebraHandle zh, int is_insert, @@ -1281,7 +1315,7 @@ void extract_rec_keys_adjust(ZebraHandle zh, int is_insert, struct it_key key_in; while(zebra_rec_keys_read(reckeys, &str, &slen, &key_in)) { - int ord = key_in.mem[0]; + int ord = CAST_ZINT_TO_INT(key_in.mem[0]); for (p = ord_list; p ; p = p->next) if (p->ord == ord) @@ -1365,7 +1399,7 @@ void extract_flushRecordKeys (ZebraHandle zh, SYSNO sysno, (char*)zh->reg->key_buf + zh->reg->key_buf_used; /* encode the ordinal value (field/use/attribute) .. */ - ch = (int) key_in.mem[0]; + ch = CAST_ZINT_TO_INT(key_in.mem[0]); zh->reg->key_buf_used += key_SU_encode(ch, (char*)zh->reg->key_buf + zh->reg->key_buf_used); @@ -1422,19 +1456,19 @@ void extract_flushWriteKeys (ZebraHandle zh, int final) #endif if (!zh->reg->key_buf || ptr_i <= 0) { - yaz_log (YLOG_DEBUG, " nothing to flush section=%d buf=%p i=%d", + yaz_log(log_level, " nothing to flush section=%d buf=%p i=%d", zh->reg->key_file_no, zh->reg->key_buf, ptr_i); - yaz_log (YLOG_DEBUG, " buf=%p ", + yaz_log(log_level, " buf=%p ", zh->reg->key_buf); - yaz_log (YLOG_DEBUG, " ptr=%d ",zh->reg->ptr_i); - yaz_log (YLOG_DEBUG, " reg=%p ",zh->reg); + yaz_log(log_level, " ptr=%d ",zh->reg->ptr_i); + yaz_log(log_level, " reg=%p ",zh->reg); return; } (zh->reg->key_file_no)++; yaz_log (YLOG_LOG, "sorting section %d", (zh->reg->key_file_no)); - yaz_log (YLOG_DEBUG, " sort_buff at %p n=%d", + yaz_log(log_level, " sort_buff at %p n=%d", zh->reg->key_buf + zh->reg->ptr_top - ptr_i,ptr_i); #if !SORT_EXTRA qsort (zh->reg->key_buf + zh->reg->ptr_top - ptr_i, ptr_i, @@ -1554,11 +1588,13 @@ ZEBRA_RES zebra_snippets_rec_keys(ZebraHandle zh, { char dst_buf[IT_MAX_WORD]; char *dst_term = dst_buf; - int ord, seqno; + int ord; + zint seqno; int index_type; + assert(key.len <= 4 && key.len > 2); - seqno = (int) key.mem[key.len-1]; - ord = key.mem[0]; + seqno = key.mem[key.len-1]; + ord = CAST_ZINT_TO_INT(key.mem[0]); zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, 0/* db */, 0 /* string_index */); @@ -1584,25 +1620,25 @@ void print_rec_keys(ZebraHandle zh, zebra_rec_keys_t reckeys) while (zebra_rec_keys_read(reckeys, &str, &slen, &key)) { char dst_buf[IT_MAX_WORD]; - int seqno; + zint seqno; int index_type; + int ord = CAST_ZINT_TO_INT(key.mem[0]); const char *db = 0; assert(key.len <= 4 && key.len > 2); - zebraExplain_lookup_ord(zh->reg->zei, - key.mem[0], &index_type, &db, 0); + zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db, 0); - seqno = (int) key.mem[key.len-1]; + seqno = key.mem[key.len-1]; zebra_term_untrans(zh, index_type, dst_buf, str); - yaz_log(YLOG_LOG, "ord=" ZINT_FORMAT " seqno=%d term=%s", - key.mem[0], seqno, dst_buf); + yaz_log(YLOG_LOG, "ord=%d seqno=" ZINT_FORMAT + " term=%s", ord, seqno, dst_buf); } } } -void extract_add_index_string(RecWord *p, const char *str, int length) +static void extract_add_index_string(RecWord *p, const char *str, int length) { struct it_key key; @@ -1682,7 +1718,7 @@ static void extract_add_sort_string(RecWord *p, const char *str, int length) zebra_rec_keys_write(zh->reg->sortKeys, str, length, &key); } -void extract_add_string (RecWord *p, const char *string, int length) +static void extract_add_string (RecWord *p, const char *string, int length) { assert (length > 0); if (zebra_maps_is_sort (p->zebra_maps, p->index_type)) @@ -1697,8 +1733,6 @@ static void extract_add_incomplete_field (RecWord *p) int remain = p->term_len; const char **map = 0; - yaz_log(YLOG_DEBUG, "Incomplete field, w='%.*s'", p->term_len, p->term_buf); - if (remain > 0) map = zebra_maps_input(p->zebra_maps, p->index_type, &b, remain, 0); @@ -1746,9 +1780,6 @@ static void extract_add_complete_field (RecWord *p) const char **map = 0; int i = 0, remain = p->term_len; - yaz_log(YLOG_DEBUG, "Complete field, w='%.*s'", - p->term_len, p->term_buf); - if (remain > 0) map = zebra_maps_input (p->zebra_maps, p->index_type, &b, remain, 1); @@ -1783,7 +1814,6 @@ static void extract_add_complete_field (RecWord *p) { if (i >= IT_MAX_WORD) break; - yaz_log(YLOG_DEBUG, "Adding string to index '%d'", **map); while (i < IT_MAX_WORD && *cp) buf[i++] = *(cp++); } @@ -1802,15 +1832,14 @@ static void extract_add_complete_field (RecWord *p) extract_add_string (p, buf, i); } -void extract_token_add (RecWord *p) +static void extract_token_add(RecWord *p) { WRBUF wrbuf; -#if 0 - yaz_log (YLOG_LOG, "token_add " - "reg_type=%c attrSet=%d attrUse=%d seqno=%d s=%.*s", - p->reg_type, p->attrSet, p->attrUse, p->seqno, p->length, - p->string); -#endif + if (log_level) + yaz_log(log_level, "extract_token_add " + "type=%c index=%s seqno=" ZINT_FORMAT " s=%.*s", + p->index_type, p->index_name, + p->seqno, p->term_len, p->term_buf); if ((wrbuf = zebra_replace(p->zebra_maps, p->index_type, 0, p->term_buf, p->term_len))) { @@ -1848,7 +1877,7 @@ static void extract_set_store_data_prepare(struct recExtractCtrl *p) p->setStoreData = extract_set_store_data_cb; } -void extract_schema_add (struct recExtractCtrl *p, Odr_oid *oid) +static void extract_schema_add (struct recExtractCtrl *p, Odr_oid *oid) { ZebraHandle zh = (ZebraHandle) p->handle; zebraExplain_addSchema (zh->reg->zei, oid); @@ -1868,7 +1897,7 @@ void extract_flushSortKeys (ZebraHandle zh, SYSNO sysno, while (zebra_rec_keys_read(reckeys, &str, &slen, &key_in)) { - int ord = (int) key_in.mem[0]; + int ord = CAST_ZINT_TO_INT(key_in.mem[0]); sortIdx_type(sortIdx, ord); if (cmd == 1) @@ -1879,27 +1908,13 @@ void extract_flushSortKeys (ZebraHandle zh, SYSNO sysno, } } -void encode_key_init (struct encode_info *i) +static 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) +static void encode_key_write (char *k, struct encode_info *i, FILE *outf) { struct it_key key; char *bp = i->buf, *bp0; @@ -1943,113 +1958,12 @@ void encode_key_write (char *k, struct encode_info *i, FILE *outf) #endif } -void encode_key_flush (struct encode_info *i, FILE *outf) +static void encode_key_flush (struct encode_info *i, FILE *outf) { iscz1_stop(i->encode_handle); 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