Exemple #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);
 }
Exemple #2
0
        /// <summary>
        /// ibatrak блокировка / разблокировка записи с проверкой
        /// </summary>
        public void LockRecord(int mfn, bool flag)
        {
            var status = RecordStatus.LogicallyDeleted | RecordStatus.PhysicallyDeleted | RecordStatus.Absent;

            //статус блокировки ошибкой считать только при попытке заблокировать
            if (flag)
            {
                status |= RecordStatus.Locked;
            }

            XrfRecord xrfRecord = GetXrfRecordError(mfn, status);

            if (_codeArgs.Code == 0 && flag != xrfRecord.Locked)
            {
                //ibatrak установка флага
                xrfRecord.Locked = flag;
                Xrf.WriteRecord(xrfRecord, false);
            }
        }
Exemple #3
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;
        }
Exemple #4
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;
        }