Example #1
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);
        }
Example #2
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;
        }