public XrfRecord ReadRecord ( int mfn ) { if (mfn <= 0) { throw new ArgumentOutOfRangeException("mfn"); } long offset = _GetOffset(mfn); if (offset >= _stream.Length) { throw new ArgumentOutOfRangeException("mfn"); } if (_stream.Seek(offset, SeekOrigin.Begin) != offset) { throw new IOException(); } long ofs = _stream.ReadInt64Network(); int flags = _stream.ReadInt32Network(); XrfRecord result = new XrfRecord { Mfn = mfn, Offset = ofs, Status = (RecordStatus)flags }; return(result); }
/// <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); }
public IrbisRecord[] SearchReadSimple(string key) { int[] mfns = InvertedFile.SearchSimple(key); List <IrbisRecord> result = new List <IrbisRecord>(); foreach (int mfn in mfns) { try { XrfRecord xrfRecord = Xrf.ReadRecord(mfn); if (!xrfRecord.Deleted) { MstRecord mstRecord = Mst.ReadRecord2(xrfRecord.Offset); if (!mstRecord.Deleted) { IrbisRecord irbisRecord = mstRecord.DecodeRecord(); irbisRecord.Database = Database; result.Add(irbisRecord); } } } catch (Exception ex) { Debug.WriteLine(ex); } } return(result.ToArray()); }
public void WriteRecord ( XrfRecord record ) { if (record == null) { throw new ArgumentNullException("record"); } }
public void LockRecord ( int mfn, bool flag ) { XrfRecord record = ReadRecord(mfn); if (flag != record.Locked) { WriteRecord(record); } }
public IrbisRecord ReadRecord ( int mfn ) { XrfRecord xrfRecord = Xrf.ReadRecord(mfn); if (xrfRecord.Offset == 0) { return(null); } MstRecord mstRecord = Mst.ReadRecord2(xrfRecord.Offset); IrbisRecord result = mstRecord.DecodeRecord(); result.Database = Database; return(result); }
/// <summary> /// ibatrak блокировка / разблокировка записи с проверкой /// </summary> public void LockRecord(int mfn, bool flag) { var status = RecordStatus.LogicallyDeleted | RecordStatus.PhysicallyDeleted | RecordStatus.Absent; //статус блокировки ошибкой считать только при попытке заблокировать if (flag) { status |= RecordStatus.Locked; } XrfRecord xrfRecord = GetXrfRecordError(mfn, status); if (_codeArgs.Code == 0 && flag != xrfRecord.Locked) { //ibatrak установка флага xrfRecord.Locked = flag; Xrf.WriteRecord(xrfRecord, false); } }
/// <summary> /// ibatrak обновление статуса записи на актуализированный /// </summary> public void SetRecordActualized(IrbisRecord record, bool keepLock, bool ifUpdate, bool padding) { if (record == null || record.Mfn <= 0) { return; } var deleted = record.Deleted; record.Status = RecordStatus.Last; if (deleted) { record.Status |= RecordStatus.LogicallyDeleted; } if (!ifUpdate) { record.Status |= RecordStatus.NonActualized; } XrfRecord xrfRecord = Xrf.ReadRecord(record.Mfn); Mst.UpdateRecordStatus(record.Status, xrfRecord.Offset); xrfRecord.Status = RecordStatus.AllZero; if (deleted) { xrfRecord.Status |= RecordStatus.LogicallyDeleted; } //оставить блокировку if (keepLock) { xrfRecord.Status |= RecordStatus.Locked; } //не было актуализации if (!ifUpdate) { xrfRecord.Status |= RecordStatus.NonActualized; } Xrf.WriteRecord(xrfRecord, padding); //в записи MST пишутся одни флаги, в XRF - другие //в результирующей записи нужно иметь комбинированный статус record.Status |= xrfRecord.Status; }
/// <summary> /// ibatrak проверка записи /// </summary> private XrfRecord GetXrfRecordError(int mfn, RecordStatus status) { //при вызове GetMaxMfn перечитывается контрольная запись if (mfn <= 0 || mfn > GetMaxMfn()) { OnIrbis64Code(-140 /*READ_WRONG_MFN*/); return(null); } XrfRecord xrfRecord = null; try { xrfRecord = Xrf.ReadRecord(mfn); } catch (ArgumentOutOfRangeException) { OnIrbis64Code(-140 /*READ_WRONG_MFN*/); return(null); } if ((xrfRecord.Status & RecordStatus.LogicallyDeleted & status) != 0) { OnIrbis64Code(-600 /*REC_DELETE*/); return(xrfRecord); } if ((xrfRecord.Status & (RecordStatus.PhysicallyDeleted | RecordStatus.Absent) & status) != 0) { OnIrbis64Code(-601 /*REC_PHYS_DELETE*/); return(xrfRecord); } if ((xrfRecord.Status & RecordStatus.Locked & status) != 0) { OnIrbis64Code(-602 /*ERR_RECLOCKED*/); return(xrfRecord); } OnIrbis64Code(0); return(xrfRecord); }
/// <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; }