- 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)
- {
- logf (LOG_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)
- {
- logf (LOG_WARN, "no filter for %s %s "
- PRINTF_OFF_T, zh->m_record_type,
- fname, recordOffset);
- }
- return 0;
- }
- if (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;
-
- logf (LOG_WARN, "empty %s %s " PRINTF_OFF_T, zh->m_record_type,
- fname, recordOffset);
- return 1;
- }
- }
-
- /* perform match if sysno not known and if match criteria is specified */
-
- matchStr = NULL;
- if (!sysno)
- {
- sysnotmp = 0;
- sysno = &sysnotmp;
- if (zh->m_record_id && *zh->m_record_id)
- {
- char *rinfo;
-
- matchStr = fileMatchStr (zh, &zh->reg->keys, fname,
- zh->m_record_id);
- if (matchStr)
- {
- rinfo = dict_lookup (zh->reg->matchDict, matchStr);
- if (rinfo)
- memcpy (sysno, rinfo+1, sizeof(*sysno));
- }
- else
- {
- logf (LOG_WARN, "Bad match criteria");
- return 0;
- }
- }
- }
-
- if (! *sysno)
- {
- /* new record */
- if (deleteFlag)
- {
- logf (LOG_LOG, "delete %s %s " PRINTF_OFF_T, zh->m_record_type,
- fname, recordOffset);
- logf (LOG_WARN, "cannot delete record above (seems new)");
- return 1;
- }
- if (zh->records_processed < zh->m_file_verbose_limit)
- logf (LOG_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;
-
- rec = rec_get (zh->reg->records, *sysno);
- assert (rec);
-
- recordAttr = rec_init_attr (zh->reg->zei, rec);
-
- if (!force_update && recordAttr->runNumber ==
- zebraExplain_runNumberIncrement (zh->reg->zei, 0))
- {
- yaz_log (LOG_LOG, "run number = %d", recordAttr->runNumber);
- yaz_log (LOG_LOG, "skipped %s %s " PRINTF_OFF_T,
- zh->m_record_type, fname, recordOffset);
- extract_flushSortKeys (zh, *sysno, -1, &zh->reg->sortKeys);
- rec_rm (&rec);
- logRecord (zh);
- return 1;
- }
- delkeys.buf_used = rec->size[recInfo_delKeys];
- delkeys.buf = rec->info[recInfo_delKeys];
-
- sortKeys.buf_used = rec->size[recInfo_sortKeys];
- sortKeys.buf = rec->info[recInfo_sortKeys];
-
- extract_flushSortKeys (zh, *sysno, 0, &sortKeys);
- extract_flushRecordKeys (zh, *sysno, 0, &delkeys);
- if (deleteFlag)
- {
- /* record going to be deleted */
- if (!delkeys.buf_used)
- {
- logf (LOG_LOG, "delete %s %s " PRINTF_OFF_T,
- zh->m_record_type, fname, recordOffset);
- logf (LOG_WARN, "cannot delete file above, storeKeys false");
- }
- else
- {
- if (zh->records_processed < zh->m_file_verbose_limit)
- logf (LOG_LOG, "delete %s %s " PRINTF_OFF_T,
- zh->m_record_type, fname, recordOffset);
- zh->records_deleted++;
- if (matchStr)
- dict_delete (zh->reg->matchDict, matchStr);
- rec_del (zh->reg->records, &rec);
- }
- rec_rm (&rec);
- logRecord (zh);
- return 1;
- }
- else
- {
- /* record going to be updated */
- if (!delkeys.buf_used)
- {
- logf (LOG_LOG, "update %s %s " PRINTF_OFF_T,
- zh->m_record_type, fname, recordOffset);
- logf (LOG_WARN, "cannot update file above, storeKeys false");
- }
- else
- {
- if (zh->records_processed < zh->m_file_verbose_limit)
- logf (LOG_LOG, "update %s %s " PRINTF_OFF_T,
- zh->m_record_type, fname, recordOffset);
- extract_flushSortKeys (zh, *sysno, 1, &zh->reg->sortKeys);
- extract_flushRecordKeys (zh, *sysno, 1, &zh->reg->keys);
- zh->records_updated++;
- }
- }
- }
- /* update file type */
- xfree (rec->info[recInfo_fileType]);
- rec->info[recInfo_fileType] =
- rec_strdup (zh->m_record_type, &rec->size[recInfo_fileType]);
-
- /* update filename */
- xfree (rec->info[recInfo_filename]);
- rec->info[recInfo_filename] =
- rec_strdup (fname, &rec->size[recInfo_filename]);
-
- /* update delete keys */
- xfree (rec->info[recInfo_delKeys]);
- if (zh->reg->keys.buf_used > 0 && zh->m_store_keys == 1)
- {
- rec->size[recInfo_delKeys] = zh->reg->keys.buf_used;
- rec->info[recInfo_delKeys] = zh->reg->keys.buf;
- zh->reg->keys.buf = NULL;
- zh->reg->keys.buf_max = 0;
- }
- else
- {
- rec->info[recInfo_delKeys] = NULL;
- rec->size[recInfo_delKeys] = 0;
- }