- /* perform match if sysno not known and if match criteria is specified */
-
- matchStr = NULL;
- if (!sysno)
- {
- sysnotmp = 0;
- sysno = &sysnotmp;
- if (rGroup->recordId && *rGroup->recordId)
- {
- char *rinfo;
-
- matchStr = fileMatchStr (zh, &zh->reg->keys, rGroup, fname,
- rGroup->recordId);
- 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, rGroup->recordType,
- fname, recordOffset);
- logf (LOG_WARN, "cannot delete record above (seems new)");
- return 1;
- }
- if (zh->records_processed < rGroup->fileVerboseLimit)
- logf (LOG_LOG, "add %s %s " PRINTF_OFF_T, rGroup->recordType,
- 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 (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,
- rGroup->recordType, 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,
- rGroup->recordType, fname, recordOffset);
- logf (LOG_WARN, "cannot delete file above, storeKeys false");
- }
- else
- {
- if (zh->records_processed < rGroup->fileVerboseLimit)
- logf (LOG_LOG, "delete %s %s " PRINTF_OFF_T,
- rGroup->recordType, 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,
- rGroup->recordType, fname, recordOffset);
- logf (LOG_WARN, "cannot update file above, storeKeys false");
- }
- else
- {
- if (zh->records_processed < rGroup->fileVerboseLimit)
- logf (LOG_LOG, "update %s %s " PRINTF_OFF_T,
- rGroup->recordType, 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 (rGroup->recordType, &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 && rGroup->flagStoreKeys == 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;
- }
-
- /* update sort keys */
- xfree (rec->info[recInfo_sortKeys]);
-
- rec->size[recInfo_sortKeys] = zh->reg->sortKeys.buf_used;
- rec->info[recInfo_sortKeys] = zh->reg->sortKeys.buf;
- zh->reg->sortKeys.buf = NULL;
- zh->reg->sortKeys.buf_max = 0;
-
- /* save file size of original record */
- zebraExplain_recordBytesIncrement (zh->reg->zei,
- - recordAttr->recordSize);
- recordAttr->recordSize = fi->file_moffset - recordOffset;
- if (!recordAttr->recordSize)
- recordAttr->recordSize = fi->file_max - recordOffset;
- zebraExplain_recordBytesIncrement (zh->reg->zei,
- recordAttr->recordSize);
-
- /* set run-number for this record */
- recordAttr->runNumber = zebraExplain_runNumberIncrement (zh->reg->zei,
- 0);
-
- /* update store data */
- xfree (rec->info[recInfo_storeData]);
- if (rGroup->flagStoreData == 1)
- {
- rec->size[recInfo_storeData] = recordAttr->recordSize;
- rec->info[recInfo_storeData] = (char *)
- xmalloc (recordAttr->recordSize);
- if (lseek (fi->fd, recordOffset, SEEK_SET) < 0)
- {
- logf (LOG_ERRNO|LOG_FATAL, "seek to " PRINTF_OFF_T " in %s",
- recordOffset, fname);
- exit (1);
- }
- if (read (fi->fd, rec->info[recInfo_storeData], recordAttr->recordSize)
- < recordAttr->recordSize)
- {
- logf (LOG_ERRNO|LOG_FATAL, "read %d bytes of %s",
- recordAttr->recordSize, fname);
- exit (1);
- }
- }
- else
- {
- rec->info[recInfo_storeData] = NULL;
- rec->size[recInfo_storeData] = 0;
- }
- /* update database name */
- xfree (rec->info[recInfo_databaseName]);
- rec->info[recInfo_databaseName] =
- rec_strdup (rGroup->databaseName, &rec->size[recInfo_databaseName]);
-
- /* update offset */
- recordAttr->recordOffset = recordOffset;