Beispiel #1
0
        public void WriteNewLink(int pageId, out int expiredPage)
        {
            lock (_lock)
            {
                expiredPage = -1;

                if (_linkA.PageId < 0)
                {
                    // A has never been set
                    _linkA = new PageLink
                    {
                        PageId  = pageId,
                        Version = new MonotonicByte(0)
                    };
                    return;
                }

                if (_linkB.PageId < 0)
                {
                    // B has never been set
                    _linkB = new PageLink
                    {
                        PageId  = pageId,
                        Version = _linkA.Version.GetNext()
                    };
                    return;
                }

                if (_linkA.Version == _linkB.Version)
                {
                    throw new Exception("VersionedLink.WriteNewLink: option table versions invalid");
                }

                if (_linkA.Version > _linkB.Version)
                {
                    // B is older. Replace it.
                    expiredPage = _linkB.PageId;
                    _linkB      = new PageLink
                    {
                        PageId  = pageId,
                        Version = _linkA.Version.GetNext()
                    };
                    return;
                }

                // A is older. Replace it.
                expiredPage = _linkA.PageId;
                _linkA      = new PageLink
                {
                    PageId  = pageId,
                    Version = _linkB.Version.GetNext()
                };
            }
        }
Beispiel #2
0
 private void WriteLink([NotNull] BinaryWriter w, PageLink link)
 {
     if (link != null)
     {
         w.Write((byte)link.Version.Value);
         w.Write(link.PageId);
     }
     else
     {
         w.Write((byte)0);
         w.Write(-1);
     }
 }
Beispiel #3
0
 /// <inheritdoc />
 public void Defrost(Stream source)
 {
     lock (_lock)
     {
         if (source == null || source.Length < ByteSize)
         {
             throw new Exception("VersionedLink.FromBytes: data was too short.");
         }
         var r = new BinaryReader(source);
         _linkA = new PageLink
         {
             Version = new MonotonicByte(r.ReadByte()),
             PageId  = r.ReadInt32()
         };
         _linkB = new PageLink
         {
             Version = new MonotonicByte(r.ReadByte()),
             PageId  = r.ReadInt32()
         };
     }
 }
Beispiel #4
0
 public VersionedLink()
 {
     _linkA = PageLink.InvalidLink();
     _linkB = PageLink.InvalidLink();
 }