Ejemplo n.º 1
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);
 }
        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());
        }
Ejemplo n.º 3
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;
        }
        /// <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());
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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
                           );
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
0
 public void Dispose()
 {
     if (Mst != null)
     {
         Mst.Dispose();
         Mst = null;
     }
     if (Xrf != null)
     {
         Xrf.Dispose();
         Xrf = null;
     }
     if (InvertedFile != null)
     {
         InvertedFile.Dispose();
         InvertedFile = null;
     }
 }
Ejemplo n.º 10
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);
        }
Ejemplo n.º 11
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;
        }
        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);
        }
Ejemplo n.º 13
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;
        }
 /// <inheritdoc cref="IDisposable.Dispose"/>
 public void Dispose()
 {
     Mst.Dispose();
     Xrf.Dispose();
     InvertedFile.Dispose();
 }
Ejemplo n.º 15
0
 public bool IsDbLocked()
 {
     return(Mst.ReadDatabaseLockedFlag());
 }
Ejemplo n.º 16
0
 public int GetMaxMfn()
 {
     Mst.ReadControlRecord();
     return(Mst.ControlRecord.NextMfn - 1);
 }
Ejemplo n.º 17
0
 /// <summary>
 /// ibatrak инициализация базы данных
 /// </summary>
 public void InitDatabase()
 {
     Mst.Create();
     Xrf.Create();
     InvertedFile.Create();
 }