X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=9a609a991a57063b62e8d247b89f48055f92f47c;hb=d089fa72c83a673c788d828687dbec88fe9d1c4a;hp=8d4cd9ca7035e4895b06ba089d811efbf89b3ea4;hpb=0af00389d43835ef54928dc22f7d34ae30f3c723;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 8d4cd9c..9a609a9 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,4 +1,4 @@ -/* $Id: extract.c,v 1.219 2006-06-07 10:14:40 adam Exp $ +/* $Id: extract.c,v 1.224 2006-06-23 11:21:38 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -36,34 +36,33 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#ifdef WIN32 -#define PRINTF_OFF_T "%I64d" -#else -/* !WIN32 */ -#if SIZEOF_OFF_T == SIZEOF_LONG_LONG -#define PRINTF_OFF_T "%lld" -#else -#define PRINTF_OFF_T "%ld" -#endif - -#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 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); @@ -100,14 +99,16 @@ 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); } } -static void extract_add_index_string (RecWord *p, const char *str, int length); +static void extract_add_index_string (RecWord *p, + zinfo_index_category_t cat, + const char *str, int length); static void extract_set_store_data_prepare(struct recExtractCtrl *p); @@ -129,16 +130,17 @@ static void searchRecordKey(ZebraHandle zh, { int i; int ch = -1; + zinfo_index_category_t cat = zinfo_index_category_index; for (i = 0; ireg->zei, '0', index_name); + ch = zebraExplain_lookup_attr_str(zh->reg->zei, cat, '0', index_name); if (ch < 0) - ch = zebraExplain_lookup_attr_str(zh->reg->zei, 'p', index_name); + ch = zebraExplain_lookup_attr_str(zh->reg->zei, cat, 'p', index_name); if (ch < 0) - ch = zebraExplain_lookup_attr_str(zh->reg->zei, 'w', index_name); + ch = zebraExplain_lookup_attr_str(zh->reg->zei, cat, 'w', index_name); if (ch < 0) return ; @@ -401,10 +403,11 @@ static void all_matches_add(struct recExtractCtrl *ctrl) { RecWord word; extract_init(ctrl, &word); - word.index_name = "allrecords"; + word.index_name = "_ALLRECORDS"; word.index_type = 'w'; word.seqno = 1; - extract_add_index_string (&word, "", 0); + extract_add_index_string (&word, zinfo_index_category_alwaysmatches, + "", 0); } static ZEBRA_RES file_extract_record(ZebraHandle zh, @@ -460,11 +463,11 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, init_extractCtrl(zh, &extractCtrl); if (!zh->m_flag_rw) - printf ("File: %s " PRINTF_OFF_T "\n", fname, recordOffset); + printf ("File: %s " ZINT_FORMAT "\n", fname, (zint)recordOffset); if (zh->m_flag_rw) { char msg[512]; - sprintf (msg, "%s:" PRINTF_OFF_T , fname, recordOffset); + sprintf (msg, "%s:" ZINT_FORMAT , fname, (zint)recordOffset); yaz_log_init_prefix2 (msg); } @@ -479,8 +482,9 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, if (zh->m_flag_rw && zh->records_processed < zh->m_file_verbose_limit) { - yaz_log (YLOG_WARN, "fail %s %s " PRINTF_OFF_T, zh->m_record_type, - fname, recordOffset); + yaz_log (YLOG_WARN, "fail %s %s " ZINT_FORMAT, + zh->m_record_type, + fname, (zint) recordOffset); } return ZEBRA_FAIL; } @@ -491,8 +495,8 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, zh->records_processed < zh->m_file_verbose_limit) { yaz_log (YLOG_WARN, "no filter for %s %s " - PRINTF_OFF_T, zh->m_record_type, - fname, recordOffset); + ZINT_FORMAT, zh->m_record_type, + fname, (zint) recordOffset); } return ZEBRA_FAIL; } @@ -548,8 +552,8 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, return ZEBRA_OK; if (zh->records_processed < zh->m_file_verbose_limit) - yaz_log (YLOG_WARN, "empty %s %s " PRINTF_OFF_T, zh->m_record_type, - fname, recordOffset); + yaz_log(YLOG_WARN, "empty %s %s " ZINT_FORMAT, zh->m_record_type, + fname, (zint)recordOffset); return ZEBRA_OK; } @@ -558,9 +562,9 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, /* new record */ if (deleteFlag) { - yaz_log (YLOG_LOG, "delete %s %s " PRINTF_OFF_T, zh->m_record_type, - fname, recordOffset); - yaz_log (YLOG_WARN, "cannot delete record above (seems new)"); + yaz_log(YLOG_LOG, "delete %s %s " ZINT_FORMAT, zh->m_record_type, + fname, (zint)recordOffset); + yaz_log(YLOG_WARN, "cannot delete record above (seems new)"); return ZEBRA_OK; } @@ -570,10 +574,10 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, if (zh->records_processed < zh->m_file_verbose_limit) { - yaz_log(YLOG_LOG, "add %s %s " PRINTF_OFF_T + yaz_log(YLOG_LOG, "add %s %s " ZINT_FORMAT " " ZINT_FORMAT " %s" , zh->m_record_type, - fname, recordOffset, *sysno, match_str_to_print); + fname, (zint) recordOffset, *sysno, match_str_to_print); } recordAttr = rec_init_attr (zh->reg->zei, rec); recordAttr->staticrank = extractCtrl.staticrank; @@ -620,19 +624,19 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, /* record going to be deleted */ if (zebra_rec_keys_empty(delkeys)) { - yaz_log (YLOG_LOG, "delete %s %s " PRINTF_OFF_T - " " ZINT_FORMAT, - zh->m_record_type, fname, recordOffset, *sysno); - yaz_log (YLOG_WARN, "cannot delete file above, storeKeys false (1)"); + yaz_log(YLOG_LOG, "delete %s %s " ZINT_FORMAT + " " ZINT_FORMAT, + zh->m_record_type, fname, (zint)recordOffset, *sysno); + yaz_log(YLOG_WARN, "cannot delete file above, storeKeys false (1)"); } else { if (zh->records_processed < zh->m_file_verbose_limit) { - yaz_log(YLOG_LOG, "delete %s %s " PRINTF_OFF_T + yaz_log(YLOG_LOG, "delete %s %s " ZINT_FORMAT " " ZINT_FORMAT " %s" , - zh->m_record_type, - fname, recordOffset, *sysno, match_str_to_print); + zh->m_record_type, fname, (zint) recordOffset, + *sysno, match_str_to_print); } zh->records_deleted++; if (matchStr) @@ -651,10 +655,10 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, /* flush new keys for sort&search etc */ if (zh->records_processed < zh->m_file_verbose_limit) { - yaz_log(YLOG_LOG, "update %s %s " PRINTF_OFF_T + yaz_log(YLOG_LOG, "update %s %s " ZINT_FORMAT " " ZINT_FORMAT " %s" , - zh->m_record_type, - fname, recordOffset, *sysno, match_str_to_print); + zh->m_record_type, fname, (zint) recordOffset, + *sysno, match_str_to_print); } recordAttr->staticrank = extractCtrl.staticrank; extract_flushSortKeys (zh, *sysno, 1, zh->reg->sortKeys); @@ -724,8 +728,8 @@ static ZEBRA_RES file_extract_record(ZebraHandle zh, xmalloc (recordAttr->recordSize); if (lseek (fi->fd, recordOffset, SEEK_SET) < 0) { - yaz_log (YLOG_ERRNO|YLOG_FATAL, "seek to " PRINTF_OFF_T " in %s", - recordOffset, fname); + yaz_log(YLOG_ERRNO|YLOG_FATAL, "seek to " ZINT_FORMAT " in %s", + (zint)recordOffset, fname); exit (1); } if (read (fi->fd, rec->info[recInfo_storeData], recordAttr->recordSize) @@ -768,12 +772,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'; @@ -876,16 +882,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; @@ -900,6 +906,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 */ @@ -930,7 +938,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); } @@ -941,7 +949,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; @@ -1092,16 +1101,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) { @@ -1117,8 +1126,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, @@ -1211,7 +1220,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; @@ -1277,8 +1286,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, @@ -1441,19 +1449,14 @@ 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 ", - zh->reg->key_buf); - yaz_log (YLOG_DEBUG, " ptr=%d ",zh->reg->ptr_i); - yaz_log (YLOG_DEBUG, " 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, @@ -1623,7 +1626,8 @@ void print_rec_keys(ZebraHandle zh, zebra_rec_keys_t reckeys) } } -void extract_add_index_string(RecWord *p, const char *str, int length) +static void extract_add_index_string(RecWord *p, zinfo_index_category_t cat, + const char *str, int length) { struct it_key key; @@ -1634,9 +1638,9 @@ void extract_add_index_string(RecWord *p, const char *str, int length) if (!p->index_name) return; - ch = zebraExplain_lookup_attr_str(zei, p->index_type, p->index_name); + ch = zebraExplain_lookup_attr_str(zei, cat, p->index_type, p->index_name); if (ch < 0) - ch = zebraExplain_add_attr_str(zei, p->index_type, p->index_name); + ch = zebraExplain_add_attr_str(zei, cat, p->index_type, p->index_name); key.len = 4; key.mem[0] = ch; @@ -1671,13 +1675,15 @@ static void extract_add_sort_string(RecWord *p, const char *str, int length) ZebraHandle zh = p->extractCtrl->handle; ZebraExplainInfo zei = zh->reg->zei; int ch; + zinfo_index_category_t cat = zinfo_index_category_sort; + if (!p->index_name) return; - ch = zebraExplain_lookup_attr_str(zei, p->index_type, p->index_name); + ch = zebraExplain_lookup_attr_str(zei, cat, p->index_type, p->index_name); if (ch < 0) - ch = zebraExplain_add_attr_str(zei, p->index_type, p->index_name); + ch = zebraExplain_add_attr_str(zei, cat, p->index_type, p->index_name); key.len = 4; key.mem[0] = ch; key.mem[1] = p->record_id; @@ -1703,13 +1709,25 @@ 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)) extract_add_sort_string (p, string, length); else - extract_add_index_string (p, string, length); + { + extract_add_index_string(p, zinfo_index_category_index, + string, length); + if (zebra_maps_is_alwaysmatches(p->zebra_maps, p->index_type)) + { + RecWord word; + memcpy(&word, p, sizeof(word)); + + word.seqno = 1; + extract_add_index_string( + &word, zinfo_index_category_alwaysmatches, "", 0); + } + } } static void extract_add_incomplete_field (RecWord *p) @@ -1718,8 +1736,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); @@ -1767,9 +1783,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); @@ -1804,7 +1817,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++); } @@ -1823,15 +1835,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))) { @@ -1869,7 +1880,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); @@ -1900,13 +1911,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->encode_handle = iscz1_start(); i->decode_handle = iscz1_start(); } -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; @@ -1950,7 +1961,7 @@ 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);