/// <summary> /// ibatrak добавление / обновление записи /// </summary> public void WriteRecord(IrbisRecord record, bool padding) { //Mst.LockDatabase(true); if (record.Mfn <= 0) { record.Version = 1; record.PreviousOffset = 0; var offset = Mst.AddRecord(record, padding); Xrf.WriteRecord(new XrfRecord { Mfn = record.Mfn, Offset = offset, Status = RecordStatus.NonActualized }, padding); OnIrbis64Code(0); } else { //XrfRecord xrfRecord = Xrf.ReadRecord(record.Mfn); XrfRecord xrfRecord = GetXrfRecordError(record.Mfn, RecordStatus.Locked | RecordStatus.LogicallyDeleted | RecordStatus.PhysicallyDeleted | RecordStatus.Absent); if (_codeArgs.Code == 0) { long offset = xrfRecord.Offset; int version = Mst.ReadVersion(xrfRecord.Offset); record.Version = version + 1; record.PreviousOffset = xrfRecord.Offset; //предыдущую версию записи пометить как неактуализированную Mst.UpdateRecordStatus(RecordStatus.NonActualized, offset); offset = Mst.UpdateRecord(record, RecordStatus.Last | RecordStatus.NonActualized, padding); xrfRecord.Offset = offset; xrfRecord.Status = RecordStatus.NonActualized; Xrf.WriteRecord(xrfRecord, padding); } } //Mst.LockDatabase(false); }
/// <summary> /// ibatrak удаление записи /// </summary> public void DeleteRecord(IrbisRecord record, bool padding) { if (record.Mfn <= 0) { OnIrbis64Code(0); return; } //Mst.LockDatabase(true); XrfRecord xrfRecord = GetXrfRecordError(record.Mfn, RecordStatus.Locked | RecordStatus.Absent); if (_codeArgs.Code == 0 && !xrfRecord.Deleted) { long offset = xrfRecord.Offset; //предыдущие версии записи пометить как удаленные int version = Mst.ReadVersion(xrfRecord.Offset); record.Version = version + 1; record.PreviousOffset = xrfRecord.Offset; for (int i = 0; i < version; i++) { Mst.UpdateRecordStatus(RecordStatus.LogicallyDeleted | RecordStatus.NonActualized, offset); if (i < version - 1) { var leader = Mst.ReadRecordLeader(offset); offset = leader.Previous; } } offset = Mst.UpdateRecord(record, RecordStatus.Last | RecordStatus.LogicallyDeleted | RecordStatus.NonActualized, padding); xrfRecord.Offset = offset; xrfRecord.Status = RecordStatus.LogicallyDeleted | RecordStatus.NonActualized; Xrf.WriteRecord(xrfRecord, padding); } //Mst.LockDatabase(false); //в записи MST пишутся одни флаги, в XRF - другие //в результирующей записи нужно иметь комбинированный статус record.Status |= xrfRecord.Status; }