/// <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; }
public void ExportMarker ( XmlWriter writer, IrbisRecord record ) { writer.WriteRaw ( "<mrk>" + "<m_0_4 len=\"5\">#####</m_0_4>" + "<m_5_5 len=\"1\">n</m_5_5>" + "<m_6_6 len=\"1\">a</m_6_6>" + "<m_7_7 len=\"1\">m</m_7_7>" + "<m_8_8 len=\"1\">#</m_8_8>" + "<m_9_9 len=\"1\">#</m_9_9>" + "<m_10_10 len=\"1\">2</m_10_10>" + "<m_11_11 len=\"1\">2</m_11_11>" + "<m_12_16 len=\"5\">#####</m_12_16>" + "<m_17_17 len=\"1\">#</m_17_17>" + "<m_18_18 len=\"1\">#</m_18_18>" + "<m_19_19 len=\"1\">#</m_19_19>" + "<m_20_23 len=\"4\">450 </m_20_23>" + "</mrk>" ); }
/// <summary> /// Метод предназначен для возврата значения из ИРБИС-плагинов. /// </summary> /// <param name="record"></param> /// <returns></returns> public static string EncodeIrbisText ( IrbisRecord record ) { StringBuilder result = new StringBuilder(); result.AppendLine("0"); result.AppendLine(record.Mfn + "#0"); result.AppendLine("0#" + record.Version); foreach (RecordField field in record.Fields) { result.AppendFormat("{0}#", field.Tag); if (!string.IsNullOrEmpty(field.Text)) { result.Append(field.Text); } foreach (SubField subField in field.SubFields) { result.AppendFormat("^{0}{1}", subField.Code, subField.Text); } result.AppendLine(); } return(result.ToString()); }
/// <summary> /// Разбор записи в клиентском представлении. /// </summary> public static IrbisRecord Parse ( string text, int skipLines ) { string[] lines = text.Split('\x1F'); IrbisRecord result = Parse(lines, skipLines); if (result.Fields.Count == 0) { byte[] bytes = Encoding.UTF8.GetBytes(text); string dump = Utilities.DumpBytes(bytes); string message = string.Format ( "Empty record in IrbisRecord.Parse:{0}{1}", Environment.NewLine, dump ); throw new ApplicationException(message); } 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); }
/// <summary> /// Кодирование записи в клиентское представление. /// </summary> /// <param name="record">Запись для кодирования.</param> /// <param name="mfn">MFN записи (м. б. несуществующий).</param> /// <param name="status">The status.</param> /// <param name="version">Версия записи (чаще всего 1).</param> /// <returns> /// Закодированная запись. /// </returns> public static string EncodeRecord ( IrbisRecord record, int mfn, int status, int version ) { StringBuilder result = new StringBuilder(); Append3031 ( result, "{0}#{1}", mfn, status ); Append3031 ( result, "0#{0}", version ); foreach (RecordField field in record.Fields) { RecordField._EncodeField ( result, field ); } return(result.ToString()); }
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 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; } MstRecord mstRecord = Mst.ReadRecord2(offset); IrbisRecord previousVersion = mstRecord.DecodeRecord(); if (previousVersion != null) { result.Add(previousVersion); lastVersion = previousVersion; } } } return(result.ToArray()); }
public string[] Format ( IrbisRecord record ) { return(Format(record.Fields)); }
/// <summary> /// Write the record. /// </summary> public static void WriteRecordRetry ( this ManagedClient64 client, IrbisRecord record ) { Action <IrbisRecord, bool, bool> action = client.WriteRecord; Try(action, record, false, true); }
/// <summary> /// Format the record. /// </summary> public static string FormatRecordRetry ( this ManagedClient64 client, string format, IrbisRecord record ) { Func <string, IrbisRecord, string> func = client.FormatRecord; return(Try(func, format, record)); }
public string FormatSingle ( IrbisRecord record ) { return(string.Join ( string.Empty, Format(record) )); }
/// <summary> /// Clones this instance. /// </summary> /// <returns></returns> public IrbisRecord Clone() { IrbisRecord result = new IrbisRecord(); result.Fields.AddRange ( from field in Fields select field.Clone() ); return(result); }
/// <summary> /// Разбор текстового представления записи. /// </summary> /// <param name="text"></param> /// <param name="skipLines"></param> /// <returns></returns> public static IrbisRecord Parse ( string[] text, int skipLines ) { IrbisRecord result = new IrbisRecord(); return(result.MergeParse ( text, skipLines )); }
/// <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 string SelectOptFile(IrbisRecord record, out int index) { String selector = record.FM(Id.ToString()); index = 0; foreach (FormatItems formatItem in OptFormatInfo.formatItems) { if (IsEqual(selector, formatItem.docType, OptFormatInfo.docTypeMaxLen)) { return(formatItem.pftFilename); } index++; } index = 0; return(String.Empty); }
public static int Compare ( IrbisRecord record1, IrbisRecord record2, bool verbose ) { IEnumerator <RecordField> enum1 = record1.Fields.GetEnumerator(); IEnumerator <RecordField> enum2 = record2.Fields.GetEnumerator(); while (true) { bool next1 = enum1.MoveNext(); bool next2 = enum2.MoveNext(); if ((!next1) && (!next2)) { break; } if (!next1) { return(-1); } if (!next2) { return(1); } RecordField field1 = enum1.Current; RecordField field2 = enum2.Current; int result = RecordField.Compare ( field1, field2, verbose ); if (result != 0) { return(result); } } return(0); }
public IrbisRecord DecodeRecord() { IrbisRecord result = new IrbisRecord { Mfn = Leader.Mfn, Status = (RecordStatus)Leader.Status, PreviousOffset = Leader.Previous, Version = Leader.Version }; foreach (MstDictionaryEntry entry in Dictionary) { RecordField field = DecodeField(entry); result.Fields.Add(field); } return(result); }
/// <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); }
public ConfigDatabase ( ManagedClient64 client ) { _lines = new List <ConfigLine>(); using (new IrbisContextSaver(client)) { client.Database = "CONFIG"; IrbisRecord record = client .SearchReadOneRecord("RL=OBRAB"); if (record != null) { RecordField[] fields = record.Fields .GetField("100"); _lines.AddRange(fields.Select(_ParseField)); } } }
/// <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> /// Метод предназачен для парсинга текста, передаваемого АРМ ИРБИС плагинам. /// </summary> /// <param name="text"></param> /// <returns></returns> public static IrbisRecord ParseIrbisText ( string text ) { string[] lines = text .Split('\n') .Select(line => line.Trim()) .ToArray(); string[] header = lines.Take(3).ToArray(); StringReader reader = new StringReader(header[1]); int mfn = int.Parse(_ReadTo(reader, '#')); reader = new StringReader(header[2]); _ReadTo(reader, '#'); // ReSharper disable once AssignNullToNotNullAttribute int version = int.Parse(reader.ReadToEnd()); string[] body = lines.Skip(3).ToArray(); IrbisRecord result = new IrbisRecord { Mfn = mfn, Version = version }; result.Fields .AddRange ( body // ReSharper disable ConvertClosureToMethodGroup .Select(line => _ParseLine(line)) // ReSharper restore ConvertClosureToMethodGroup .Where(item => item != null) ); return(result); }
public void ExportRecord ( XmlWriter writer, IrbisRecord record ) { writer.WriteStartElement("record"); ExportMarker ( writer, record ); foreach (RecordField field in record.Fields) { ExportField ( writer, field ); } writer.WriteEndElement(); }
public static string GatherSubfields ( this IrbisRecord record, string tag, string separator, params char[] codes ) { RecordField field = record .Fields .GetField(tag) .FirstOrDefault(); if (ReferenceEquals(field, null)) { return(null); } List <string> list = new List <string>(); foreach (char code in codes) { string[] text = field .GetSubField(code) .GetSubFieldText(); list.AddRange(text); } if (list.Count == 0) { return(null); } return(string.Join ( separator, list.ToArray() )); }
/// <summary> /// Appends the specified record. /// </summary> /// <param name="record">The record.</param> /// <exception cref="System.ArgumentNullException">record</exception> public void Append ( IrbisRecord record ) { if (record == null) { throw new ArgumentNullException("record"); } lock (_syncRoot) { if (_records.Count >= Capacity) { Flush(); } _records.Add(record); if (_records.Count >= Capacity) { Flush(); } } }
/// <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; }
public string SelectOptFile(IrbisRecord record) { int index; return(SelectOptFile(record, out index)); }
public static IrbisRecord ReadIso ( Stream strm, Encoding enc ) { IrbisRecord result = new IrbisRecord(); byte[] marker = new byte[5]; // Считываем длину записи if (strm.Read(marker, 0, 5) != 5) { return(null); } int reclen = _ToInt(marker, 0, 5); byte[] record = new byte[reclen]; int need = reclen - 5; // А затем и ее остаток if (strm.Read(record, 5, need) != need) { return(null); } // простая проверка, что мы имеем дело с нормальной ISO-записью if (record[reclen - 1] != RecordDelimiter) { return(null); } // Превращаем в Unicode char[] chars = enc.GetChars(record, 0, reclen); int baseAddress = _ToInt(record, 12, 5) - 1; int start = baseAddress; // Пошли по полям (при помощи словаря) for (int dic = MarkerLength; ; dic += 12) { // находим следующее поле // Если нарвались на разделитель, заканчиваем if ((record[dic] == FieldDelimiter) || (start > (reclen - 4))) { break; } string tag = new string(chars, dic, 3); RecordField fld = new RecordField(tag); bool isFixed = tag.StartsWith("00"); result.Fields.Add(fld); start++; int end; if (isFixed) { for (end = start; ; end++) { if (record[end] == FieldDelimiter) { break; } } fld.Text = new string(chars, start, end - start); start = end; } else { start += 2; while (true) { // находим подполя if (record[start] == FieldDelimiter) { break; } if (record[start] != SubfieldDelimiter) { // Нарвались на поле без подполей for (end = start; ; end++) { if ((record[end] == FieldDelimiter) || (record[end] == SubfieldDelimiter)) { break; } } fld.Text = new string (chars, start, end - start); } else { // Декодируем подполя SubField sub = new SubField (chars[++start]); fld.SubFields.Add(sub); start++; for (end = start; ; end++) { if ((record[end] == FieldDelimiter) || (record[end] == SubfieldDelimiter)) { break; } } sub.Text = new string (chars, start, end - start); } start = end; } } } return(result); }