- while (*s && *s != stopMarker)
- {
- if (i+1 < sizeof(tmpString))
- tmpString[i++] = *s++;
- }
- if (*s)
- s++;
- tmpString[i] = '\0';
- strcpy (dst, tmpString);
- dst += strlen (tmpString);
- }
- else
- {
- yaz_log (YLOG_WARN, "Syntax error in match criteria %s in group %s",
- spec, zh->m_group ? zh->m_group : "none");
- return NULL;
- }
- *dst++ = 1;
- }
- if (dst == dstBuf)
- {
- yaz_log (YLOG_WARN, "No match criteria for record %s in group %s",
- fname, zh->m_group ? zh->m_group : "none");
- return NULL;
- }
- *dst = '\0';
- return dstBuf;
-}
-
-struct recordLogInfo {
- const char *fname;
- int recordOffset;
- struct recordGroup *rGroup;
-};
-
-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 ZEBRA_RES file_extract_record(ZebraHandle zh,
- SYSNO *sysno, const char *fname,
- int deleteFlag,
- struct file_read_info *fi,
- int force_update,
- RecType recType,
- void *recTypeClientData)
-{
- RecordAttr *recordAttr;
- int r;
- const char *matchStr = 0;
- SYSNO sysnotmp;
- Record rec;
- off_t recordOffset = 0;
- struct recExtractCtrl extractCtrl;
-
- /* announce database */
- if (zebraExplain_curDatabase (zh->reg->zei, zh->basenames[0]))
- {
- if (zebraExplain_newDatabase (zh->reg->zei, zh->basenames[0],
- zh->m_explain_database))
- return ZEBRA_FAIL;
- }
-
- if (fi->fd != -1)
- {
- /* we are going to read from a file, so prepare the extraction */
- zebra_rec_keys_reset(zh->reg->keys);
-
-#if NATTR
- zebra_rec_keys_reset(zh->reg->sortKeys);
-#else
- zh->reg->sortKeys.buf_used = 0;
-#endif
- recordOffset = fi->file_moffset;
- extractCtrl.handle = zh;
- extractCtrl.offset = fi->file_moffset;
- extractCtrl.readf = file_read;
- extractCtrl.seekf = file_seek;
- extractCtrl.tellf = file_tell;
- extractCtrl.endf = file_end;
- extractCtrl.fh = fi;
- extractCtrl.init = extract_init;
- extractCtrl.tokenAdd = extract_token_add;
- extractCtrl.schemaAdd = extract_schema_add;
- extractCtrl.dh = zh->reg->dh;
- extractCtrl.match_criteria[0] = '\0';
- extractCtrl.staticrank = 0;
-
- extractCtrl.first_record = fi->file_offset ? 0 : 1;
-
- extract_set_store_data_prepare(&extractCtrl);
-
- init_extractCtrl(zh, &extractCtrl);
-
- if (!zh->m_flag_rw)
- printf ("File: %s " PRINTF_OFF_T "\n", fname, recordOffset);
- if (zh->m_flag_rw)
- {
- char msg[512];
- sprintf (msg, "%s:" PRINTF_OFF_T , fname, recordOffset);
- yaz_log_init_prefix2 (msg);
- }
-
- r = (*recType->extract)(recTypeClientData, &extractCtrl);
-
- yaz_log_init_prefix2 (0);
- if (r == RECCTRL_EXTRACT_EOF)
- return ZEBRA_FAIL;
- else if (r == RECCTRL_EXTRACT_ERROR_GENERIC)
- {
- /* error occured during extraction ... */
- 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);
- }
- return ZEBRA_FAIL;
- }
- else if (r == RECCTRL_EXTRACT_ERROR_NO_SUCH_FILTER)
- {
- /* error occured during extraction ... */
- if (zh->m_flag_rw &&
- 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);
- }
- return ZEBRA_FAIL;
- }
- if (extractCtrl.match_criteria[0])
- matchStr = extractCtrl.match_criteria;
- }
-
- /* perform match if sysno not known and if match criteria is specified */
- if (!sysno)
- {
- sysnotmp = 0;
- sysno = &sysnotmp;
-
- if (matchStr == 0 && zh->m_record_id && *zh->m_record_id)
- {
- matchStr = fileMatchStr (zh, zh->reg->keys, fname,
- zh->m_record_id);
- if (!matchStr)
- {
- yaz_log(YLOG_WARN, "Bad match criteria");
- return ZEBRA_FAIL;
- }
- }
- if (matchStr)
- {
- int db_ord = zebraExplain_get_database_ord(zh->reg->zei);
- char *rinfo = dict_lookup_ord(zh->reg->matchDict, db_ord,
- matchStr);
- if (rinfo)
- {
- assert(*rinfo == sizeof(*sysno));
- memcpy (sysno, rinfo+1, sizeof(*sysno));
- }
- }
- }
- if (! *sysno && zebra_rec_keys_empty(zh->reg->keys) )
- {
- /* the extraction process returned no information - the record
- is probably empty - unless flagShowRecords is in use */
- if (!zh->m_flag_rw)
- 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);
- return ZEBRA_OK;
- }
-
- if (! *sysno)
- {
- /* 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)");
- return ZEBRA_OK;
- }
-
- rec = rec_new (zh->reg->records);
-
- *sysno = rec->sysno;
-
- if (zh->records_processed < zh->m_file_verbose_limit)
- {
- if (matchStr)
- yaz_log(YLOG_LOG, "add %s %s " PRINTF_OFF_T
- " " ZINT_FORMAT " %s" ,
- zh->m_record_type,
- fname, recordOffset, *sysno, matchStr);
- else
- yaz_log(YLOG_LOG, "add %s %s " PRINTF_OFF_T
- " " ZINT_FORMAT ,
- zh->m_record_type,
- fname, recordOffset, *sysno);
- }
- recordAttr = rec_init_attr (zh->reg->zei, rec);
- recordAttr->staticrank = extractCtrl.staticrank;
-
- if (matchStr)
- {
- int db_ord = zebraExplain_get_database_ord(zh->reg->zei);
- dict_insert_ord(zh->reg->matchDict, db_ord, matchStr,
- sizeof(*sysno), sysno);
- }
-
-
-#if NATTR
- extract_flushSortKeys (zh, *sysno, 1, zh->reg->sortKeys);
-#else
- extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
-#endif
- extract_flushRecordKeys (zh, *sysno, 1, zh->reg->keys,
- recordAttr->staticrank);
- zh->records_inserted++;
- }
- else
- {
- /* record already exists */
- zebra_rec_keys_t delkeys = zebra_rec_keys_open();
-
-#if NATTR
- zebra_rec_keys_t sortKeys = zebra_rec_keys_open();
-#else
- struct sortKeys sortKeys;
-#endif
-
- rec = rec_get (zh->reg->records, *sysno);
- assert (rec);
-
- recordAttr = rec_init_attr (zh->reg->zei, rec);
-
- zebra_rec_keys_set_buf(delkeys,
- rec->info[recInfo_delKeys],
- rec->size[recInfo_delKeys],
- 0);
-
-#if NATTR
- zebra_rec_keys_set_buf(sortKeys,
- rec->info[recInfo_sortKeys],
- rec->size[recInfo_sortKeys],
- 0);
- extract_flushSortKeys (zh, *sysno, 0, sortKeys);
-#else
- sortKeys.buf_used = rec->size[recInfo_sortKeys];
- sortKeys.buf = rec->info[recInfo_sortKeys];
- extract_flushSortKeys (zh, *sysno, 0, &sortKeys);
-#endif
-
- extract_flushRecordKeys (zh, *sysno, 0, delkeys,
- recordAttr->staticrank); /* old values */
- if (deleteFlag)
- {
- /* 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)");
- }
- else