-
-static int file_extract_record(ZebraHandle zh,
- SYSNO *sysno, const char *fname,
- int deleteFlag,
- struct file_read_info *fi,
- int force_update)
-{
- RecordAttr *recordAttr;
- int r;
- const char *matchStr = 0;
- SYSNO sysnotmp;
- Record rec;
- off_t recordOffset = 0;
- RecType recType;
- void *clientData;
-
- if (!(recType =
- recType_byName (zh->reg->recTypes, zh->res, zh->m_record_type,
- &clientData)))
- {
- yaz_log (YLOG_WARN, "No such record type: %s", zh->m_record_type);
- return 0;
- }
-
- /* 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 0;
- }
-
- if (fi->fd != -1)
- {
- 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.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.handle = zh;
- 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;
-
- 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)(clientData, &extractCtrl);
-
- yaz_log_init_prefix2 (0);
- if (r == RECCTRL_EXTRACT_EOF)
- return 0;
- 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 0;
- }
- 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 0;
- }
- 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 0;
- }
- }
- if (matchStr)
- {
- char *rinfo = dict_lookup (zh->reg->matchDict, matchStr);
- if (rinfo)
- {
- assert(*rinfo == sizeof(*sysno));
- memcpy (sysno, rinfo+1, sizeof(*sysno));
- }
- }
- }
- if (! *sysno && zh->reg->keys.buf_used == 0)
- {
- /* the extraction process returned no information - the record
- is probably empty - unless flagShowRecords is in use */
- if (!zh->m_flag_rw)
- return 1;
-
- 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 1;
- }
-
- 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 1;
- }
- if (zh->records_processed < zh->m_file_verbose_limit)
- yaz_log (YLOG_LOG, "add %s %s " PRINTF_OFF_T, zh->m_record_type,
- fname, recordOffset);
- rec = rec_new (zh->reg->records);
-
- *sysno = rec->sysno;
-
- recordAttr = rec_init_attr (zh->reg->zei, rec);
-
- if (matchStr)
- {
- dict_insert (zh->reg->matchDict, matchStr, sizeof(*sysno), sysno);
- }
- extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
- extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
-
- zh->records_inserted++;
- }
- else
- {
- /* record already exists */
- struct recKeys delkeys;
- struct sortKeys sortKeys;