Beispiel #1
0
        /// <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;
        }
Beispiel #2
0
 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>"
     );
 }
Beispiel #3
0
        /// <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);
        }
Beispiel #5
0
 /// <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);
 }
Beispiel #6
0
        /// <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());
        }
Beispiel #7
0
        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());
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
 public string[] Format
 (
     IrbisRecord record
 )
 {
     return(Format(record.Fields));
 }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
        /// <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));
        }
Beispiel #12
0
 public string FormatSingle
 (
     IrbisRecord record
 )
 {
     return(string.Join
            (
                string.Empty,
                Format(record)
            ));
 }
Beispiel #13
0
        /// <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);
        }
Beispiel #14
0
        /// <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
                   ));
        }
Beispiel #15
0
        /// <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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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);
        }
Beispiel #19
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);
        }
Beispiel #20
0
        /// <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);
        }
Beispiel #21
0
        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));
                }
            }
        }
Beispiel #22
0
        /// <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);
        }
Beispiel #24
0
 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();
                }
            }
        }
Beispiel #27
0
        /// <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;
        }
Beispiel #28
0
        public string SelectOptFile(IrbisRecord record)
        {
            int index;

            return(SelectOptFile(record, out index));
        }
Beispiel #29
0
        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);
        }