/// <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[] ReadAllRecordVersions ( int mfn ) { List <IrbisRecord> result = new List <IrbisRecord>(); IrbisRecord lastVersion = ReadRecord(mfn); if (lastVersion != null) { result.Add(lastVersion); while (true) { long offset = lastVersion.PreviousOffset; if (offset == 0) { break; } MstRecord32 mstRecord = Mst.ReadRecord2(offset); IrbisRecord previousVersion = mstRecord.DecodeRecord(); if (previousVersion != null) { result.Add(previousVersion); lastVersion = previousVersion; } } } return(result.ToArray()); }
/// <summary> /// ibatrak чтение записи с проверкой /// </summary> public IrbisRecord ReadRecord(int mfn) { var xrfRecord = GetXrfRecordError(mfn, RecordStatus.PhysicallyDeleted | RecordStatus.LogicallyDeleted | RecordStatus.Absent); if (_codeArgs.Code != 0) { return(null); } IrbisRecord result = Mst.ReadRecord(xrfRecord.Offset); result.Database = Database; //в записи MST пишутся одни флаги, в XRF - другие //в результирующей записи нужно иметь комбинированный статус result.Status |= xrfRecord.Status; return(result); //XrfRecord xrfRecord = Xrf.ReadRecord(mfn); ////ibatrak если запись удалена физически, не читать //if (Convert.ToBoolean(xrfRecord.Status & RecordStatus.PhysicallyDeleted)) // return null; //MstRecord mstRecord = Mst.ReadRecord2(xrfRecord.Offset); //IrbisRecord result = mstRecord.DecodeRecord(); //result.Database = Database; //return result; }
/// <summary> /// Search and read found records. /// </summary> public IrbisRecord[] SearchReadSimple ( string key ) { int[] mfns = InvertedFile.SearchSimple(key); List <IrbisRecord> result = new List <IrbisRecord>(); foreach (int mfn in mfns) { try { XrfRecord32 xrfRecord = Xrf.ReadRecord(mfn); if (!xrfRecord.Deleted) { MstRecord32 mstRecord = Mst.ReadRecord2(xrfRecord.AbsoluteOffset); if (!mstRecord.Deleted) { IrbisRecord irbisRecord = mstRecord.DecodeRecord(); irbisRecord.Database = Database; result.Add(irbisRecord); } } } catch (Exception ex) { Debug.WriteLine(ex); } } return(result.ToArray()); }
/// <summary> /// ibatrak прочитать версию записи /// </summary> public int ReadVersion(int mfn) { var xrfRecord = GetXrfRecordError(mfn, RecordStatus.PhysicallyDeleted | RecordStatus.Absent); if (_codeArgs.Code != 0) { return(0); } var result = Mst.ReadVersion(xrfRecord.Offset); return(result); }
public void OpenDb(string db, bool write) { var masterFile = Irbis64Config.LookupDbMst(db); Database = db; Database = Path.GetFileNameWithoutExtension(masterFile); if (Mst != null) { Mst.Dispose(); } if (Xrf != null) { Xrf.Dispose(); } if (InvertedFile != null) { InvertedFile.Dispose(); } Mst = new MstFile ( Path.ChangeExtension ( masterFile, ".mst" ), write ); Xrf = new XrfFile ( Path.ChangeExtension ( masterFile, ".xrf" ), write ); InvertedFile = new InvertedFile ( Path.ChangeExtension ( masterFile, ".ifp" ), write ); }
/// <summary> /// ibatrak чтение записи с проверкой только на физическое удаление /// </summary> public IrbisRecord ReadExistingRecord(int mfn) { var xrfRecord = GetXrfRecordError(mfn, RecordStatus.PhysicallyDeleted | RecordStatus.Absent); if (_codeArgs.Code != 0) { return(null); } IrbisRecord result = Mst.ReadRecord(xrfRecord.Offset); result.Database = Database; //в записи MST пишутся одни флаги, в XRF - другие //в результирующей записи нужно иметь комбинированный статус result.Status |= xrfRecord.Status; return(result); }
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); }
public void Dispose() { if (Mst != null) { Mst.Dispose(); Mst = null; } if (Xrf != null) { Xrf.Dispose(); Xrf = null; } if (InvertedFile != null) { InvertedFile.Dispose(); InvertedFile = null; } }
/// <summary> /// ibatrak чтение записи N шагов назад /// </summary> public IrbisRecord ReadRecord(int mfn, int stepsBack) { var version = ReadVersion(mfn); if (_codeArgs.Code != 0) { return(null); } if (stepsBack <= 0 || version <= stepsBack) { OnIrbis64Code(-201 /*ERR_OLDREC_ABSENT*/); return(null); } //здесь можно читать логически удаленные записи var xrfRecord = GetXrfRecordError(mfn, RecordStatus.PhysicallyDeleted | /*RecordStatus.LogicallyDeleted |*/ RecordStatus.Absent); if (_codeArgs.Code != 0) { return(null); } IrbisRecord rec = null; var leader = Mst.ReadRecordLeader(xrfRecord.Offset); for (int i = 0; i < stepsBack; i++) { if (i < stepsBack - 1) { leader = Mst.ReadRecordLeader(leader.Previous); } else { var result = Mst.ReadRecord(leader.Previous); result.Database = Database; rec = result; } } rec.Database = Database; //в записи MST пишутся одни флаги, в XRF - другие //в результирующей записи нужно иметь комбинированный статус rec.Status |= xrfRecord.Status; return(rec); }
/// <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; }
public IrbisRecord ReadRecord ( int mfn ) { XrfRecord32 xrfRecord = Xrf.ReadRecord(mfn); if ((xrfRecord.Status & RecordStatus.PhysicallyDeleted) != 0) { return(null); } MstRecord32 mstRecord = Mst.ReadRecord2 ( xrfRecord.AbsoluteOffset ); IrbisRecord result = mstRecord.DecodeRecord(); result.Database = Database; return(result); }
/// <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; }
/// <inheritdoc cref="IDisposable.Dispose"/> public void Dispose() { Mst.Dispose(); Xrf.Dispose(); InvertedFile.Dispose(); }
public bool IsDbLocked() { return(Mst.ReadDatabaseLockedFlag()); }
public int GetMaxMfn() { Mst.ReadControlRecord(); return(Mst.ControlRecord.NextMfn - 1); }
/// <summary> /// ibatrak инициализация базы данных /// </summary> public void InitDatabase() { Mst.Create(); Xrf.Create(); InvertedFile.Create(); }