Ejemplo n.º 1
0
        public void Deserialize(Stream input, VersionTag version)
        {
            var unk14 = input.ReadValueU32();

            var unk15 = input.ReadValueF32();
            var unk16 = input.ReadValueF32();
            var unk17 = input.ReadValueF32();
            var unk18 = input.ReadValueF32();
            var unk19 = input.ReadValueF32();
            var unk20 = input.ReadValueF32();

            var unk21 = input.ReadValueF32();
            var unk22 = input.ReadValueU32();

            var unk23 = input.ReadValueU16();
            var unk24 = input.ReadValueU16();
            var unk25 = input.ReadValueU16();

            var unk26 = input.ReadValueU16();
            var unk27 = input.ReadValueU16();

            var unk28 = input.ReadValueU16();
            var unk29 = input.ReadValueU16();
            var unk30 = input.ReadValueU16();

            var unk31 = input.ReadValueU32();
        }
        private void ValidateVersion(ManifestData manifestData, Action <SemVersion, VersionTag> lifecycleVersionValidator)
        {
            // Check package version, make sure it's a valid SemVer string.
            SemVersion packageVersionNumber;

            if (!SemVersion.TryParse(manifestData.version, out packageVersionNumber))
            {
                AddError("In package.json, \"version\" needs to be a valid \"Semver\". {0}", ErrorDocumentation.GetLinkMessage(k_DocsFilePath, "version-needs-to-be-a-valid-semver"));
                return;
            }

            VersionTag versionTag;

            try
            {
                versionTag = VersionTag.Parse(packageVersionNumber.Prerelease);
            }
            catch (ArgumentException e)
            {
                AddError("In package.json, \"version\" doesn't follow our lifecycle rules. {0}. {1}", e.Message, ErrorDocumentation.GetLinkMessage(k_DocsFilePath, "version-is-invalid-tag-must-follow-lifecycle-rules"));
                return;
            }

            lifecycleVersionValidator(packageVersionNumber, versionTag);
            ValidateVersionAbilityToPromote(packageVersionNumber, versionTag, manifestData);
        }
Ejemplo n.º 3
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (VersionTag.Length != 0)
            {
                hash ^= VersionTag.GetHashCode();
            }
            if (Ips.Length != 0)
            {
                hash ^= Ips.GetHashCode();
            }
            if (Ports.Length != 0)
            {
                hash ^= Ports.GetHashCode();
            }
            if (ResourceUrl.Length != 0)
            {
                hash ^= ResourceUrl.GetHashCode();
            }
            if (VersionUrl.Length != 0)
            {
                hash ^= VersionUrl.GetHashCode();
            }
            if (ShowState != false)
            {
                hash ^= ShowState.GetHashCode();
            }
            if (SelectServer != false)
            {
                hash ^= SelectServer.GetHashCode();
            }
            return(hash);
        }
        /**
         * Use this to know with package phase the version infers
         * However, if you need to know if this package is a release candidate, then use GetLifecyclePhaseOrRelation instead
         */
        internal static LifecyclePhase GetLifecyclePhase(string version)
        {
            SemVersion semVer = SemVersion.Parse(version);

            try
            {
                VersionTag pre = VersionTag.Parse(semVer.Prerelease);

                if (IsPreviewVersion(semVer, pre))
                {
                    return(LifecyclePhase.Preview);
                }
                if (IsReleasedVersion(semVer, pre))
                {
                    return(LifecyclePhase.Release);
                }
                if (IsExperimentalVersion(semVer, pre))
                {
                    return(LifecyclePhase.Experimental);
                }
                if (IsPreReleaseVersion(semVer, pre))
                {
                    return(LifecyclePhase.PreRelease);
                }
                return(LifecyclePhase.InvalidVersionTag);
            }
            catch (ArgumentException e)
            {
                if (e.Message.Contains("invalid version tag"))
                {
                    return(LifecyclePhase.InvalidVersionTag);
                }
                throw e;
            }
        }
 internal static bool IsPreviewVersion(SemVersion version, VersionTag tag)
 {
     #if UNITY_2021_1_OR_NEWER
     return(version.Prerelease.Contains("preview"));
     #else
     return(version.Prerelease.Contains("preview") || version.Major == 0);
     #endif
 }
        public static void ChangeAIRPathByInstalls(object sender, EventArgs e)
        {
            MenuItem   item = sender as MenuItem;
            VersionTag tag  = (item.Tag as VersionTag);

            Management.ProgramPaths.Sonic3AIRPath = tag.Path;
            Management.MainDataModel.Settings.Save();
            Management.MainDataModel.UpdateAIRSettings(ref tag.Instance);
        }
Ejemplo n.º 7
0
        public void AddExplanation(TlsRptRecord record)
        {
            VersionTag version = record.Tags.OfType <VersionTag>().FirstOrDefault();

            if (version != null)
            {
                version.Explanation = TlsRptExplainerResource.VersionTlsRptExplanation;
            }
        }
 public void DownloadUpdate(VersionTag tag)
 {
     // Already downloading?
     if (_downloadingUpdate)
     {
         return;
     }
     DownloadUpdateAsync(tag);
 }
Ejemplo n.º 9
0
 private void DownloadClicked(VersionTag tag)
 {
     toolTip.SetToolTip(pictureBoxUpdate, "Downloading");
     pictureBoxUpdate.Image   = Properties.Resources.Ring;
     pictureBoxUpdate.Visible = true;
     buttonUpdate.Visible     = false;
     // download the update.
     _context.UpdateController.DownloadUpdate(tag);
 }
Ejemplo n.º 10
0
        public override bool Handshake(IWebSocketSession session, WebSocketReceiveFilterBase previousFilter, out IReceiveFilter <IWebSocketFragment> dataFrameReader)
        {
            if (!VersionTag.Equals(session.SecWebSocketVersion) && NextProcessor != null)
            {
                return(NextProcessor.Handshake(session, previousFilter, out dataFrameReader));
            }

            dataFrameReader = null;

            session.ProtocolProcessor = this;

            if (!session.AppServer.ValidateHandshake(session, session.Items.GetValue <string>(OriginKey, string.Empty)))
            {
                return(false);
            }

            var secWebSocketKey = session.Items.GetValue <string>(WebSocketConstant.SecWebSocketKey, string.Empty);

            if (string.IsNullOrEmpty(secWebSocketKey))
            {
                return(false);
            }

            var responseBuilder = new StringBuilder();

            string secKeyAccept = string.Empty;

            try
            {
                secKeyAccept = Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(secWebSocketKey + m_Magic)));
            }
            catch (Exception)
            {
                return(false);
            }

            responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseHeadLine10);
            responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseUpgradeLine);
            responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseConnectionLine);
            responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseAcceptLine, secKeyAccept);

            var subProtocol = session.GetAvailableSubProtocol(session.Items.GetValue <string>(WebSocketConstant.SecWebSocketProtocol, string.Empty));

            if (!string.IsNullOrEmpty(subProtocol))
            {
                responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseProtocolLine, subProtocol);
            }

            responseBuilder.AppendWithCrCf();
            byte[] data = Encoding.UTF8.GetBytes(responseBuilder.ToString());
            session.SendRawData(data, 0, data.Length);

            dataFrameReader = new WebSocketDataFrameReceiveFilter();

            return(true);
        }
Ejemplo n.º 11
0
        public void null_version_tags(String tagName)
        {
            // arrange
            var tag = new Tag(tagName, "");

            // act
            var versionTag = VersionTag.TryCreate(tag);

            // assert
            Assert.Null(versionTag);
        }
Ejemplo n.º 12
0
 public FlightDetails(
     FlightId id,
     VersionTag versionTag,
     ushort capacity,
     IEnumerable <Booking> bookings)
 {
     Id         = id;
     VersionTag = versionTag;
     Capacity   = capacity;
     Bookings   = bookings;
 }
Ejemplo n.º 13
0
        public void valid_version_from_version_tag_and_commit_count(String tagName, Int32 commitCount, String expectedVersion)
        {
            // arrange
            var tag = new Tag(tagName, "");

            // act
            var versionTag    = VersionTag.TryCreate(tag);
            var actualVersion = Version.CreateVersion(versionTag, commitCount);

            // assert
            Assert.Equal(actualVersion.ToString(), expectedVersion);
        }
Ejemplo n.º 14
0
 private void DownloadUpdateAsync(VersionTag tag)
 {
     _downloadingUpdate = true;
     try
     {
         downloadRequest = (HttpWebRequest)WebRequest.Create(tag.Url);
         downloadRequest.BeginGetResponse(new AsyncCallback(FinishDownloadUpdateRequest), null);
     }
     catch (Exception)
     {
         OnRaiseUpdateFailure(new UpdateFailureEventArgs());
     }
 }
Ejemplo n.º 15
0
        public void valid_version_tags(String tagName, Int32 majorVersion, Int32 minorVersion, String suffix)
        {
            // arrange
            var tag = new Tag(tagName, "");

            // act
            var versionTag = VersionTag.TryCreate(tag);

            // assert
            Assert.Equal(majorVersion, versionTag.MajorVersion);
            Assert.Equal(minorVersion, versionTag.MinorVersion);
            Assert.Equal(suffix, versionTag.Suffix);
        }
Ejemplo n.º 16
0
        public static byte[] ToBytes(VersionTag versionTag)
        {
            var hex           = versionTag.ToString();
            var numberOfChars = hex.Length;
            var bytes         = new byte[numberOfChars / 2];

            for (var i = 0; i < numberOfChars; i += 2)
            {
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            }

            return(bytes);
        }
        public EvaluationResult <Tag> Parse(List <Tag> tags, string record, string token, string tagKey, string tagValue)
        {
            VersionTag   versionTag = new VersionTag(token, tagValue);
            List <Error> errors     = new List <Error>();

            int tagInstanceCount = tags.Count(_ => _.GetType() == typeof(VersionTag));

            if (!record.Trim().StartsWith(ValidValue) && tagInstanceCount == 0)
            {
                errors.Add(new InvalidVersionTagError());
            }

            return(new EvaluationResult <Tag>(versionTag, errors));
        }
        public void ValidTagGeneratesResultWithNoErrors()
        {
            string value  = "TLSRPTv1";
            string key    = "v";
            string token  = $"{key}={value}";
            string record = $"{token};rua=mailto:[email protected]";

            EvaluationResult <Tag> evaluationResult =
                _versionParser.Parse(new List <Tag>(), record, token, key, value);

            VersionTag versionTag = evaluationResult.Item as VersionTag;

            Assert.That(versionTag, Is.Not.Null);
            Assert.That(versionTag.RawValue, Is.EqualTo(token));
            Assert.That(versionTag.Value, Is.EqualTo(value));
            Assert.That(evaluationResult.Errors, Is.Empty);
        }
        public void RecordDoesNotStartWithVersionGeneratesInvalidVersionError()
        {
            string value  = "TLSRPTv1";
            string key    = "p";
            string token  = $"{key}={value}";
            string record = $"{token};rua=mailto:[email protected]";

            EvaluationResult <Tag> evaluationResult =
                _versionParser.Parse(new List <Tag>(), record, token, key, value);

            VersionTag versionTag = evaluationResult.Item as VersionTag;

            Assert.That(versionTag, Is.Not.Null);
            Assert.That(versionTag.RawValue, Is.EqualTo(token));
            Assert.That(versionTag.Value, Is.EqualTo(value));
            Assert.That(evaluationResult.Errors.Count, Is.EqualTo(1));
            Assert.That(evaluationResult.Errors.First(), Is.TypeOf <InvalidVersionTagError>());
        }
Ejemplo n.º 20
0
        public void Deserialize(Stream input, VersionTag version)
        {
            var flags = input.ReadValueU32();

            this.Unknown3 = (flags & 1) == 1;

            this.Unknown1 = input.ReadValueF32();
            this.Unknown2 = input.ReadValueF32();

            uint[] counts = new uint[flags >> 1];
            for (uint i = 0; i < counts.Length; i++)
            {
                counts[i] = input.ReadValueU32();
            }

            foreach (var count in counts)
            {
                for (uint i = 0; i < count; i++)
                {
                    var unk8          = input.ReadValueU32();
                    var instanceCount = input.ReadValueU32();
                    var unk10         = input.ReadValueF32();

                    if (version != VersionTag.Unknown)
                    {
                        var unk11 = input.ReadValueS32();
                        var unk12 = input.ReadValueS32();
                        var unk13 = input.ReadValueS32();

                        if (unk11 == 5 || unk12 == 5 || unk13 == 5)
                        {
                        }
                    }

                    var instances = new List <Instance>();
                    for (uint l = 0; l < instanceCount; l++)
                    {
                        var instance = new Instance();
                        instance.Deserialize(input, version);
                        instances.Add(instance);
                    }
                }
            }
        }
Ejemplo n.º 21
0
        public void InstallUpdate(VersionTag tag, BackgroundWorker worker)
        {
            var installLocation = PlaybackChanger_Installer.RegHelper.GetRegInstallPath();

            // Does the update dir still exist?
            string updateDir = Path.Combine(installLocation, "Update");

            if (!Directory.Exists(updateDir))
            {
                return;
            }

            var files = Directory.GetFiles(updateDir, $"{tag.Version.ToString()}.7z");

            // Someone must have deleted the file. Not gonna build build something to prevent sabotaging.
            if (files.Length <= 0)
            {
                return;
            }

            var options = new ExtractionOptions()
            {
                ExtractFullPath = true,
                Overwrite       = true
            };
            var archive = ArchiveFactory.Open(files[0]);

            worker.DoWork += delegate(object sender, DoWorkEventArgs e)
            {
                try
                {
                    foreach (var entry in archive.Entries)
                    {
                        entry.WriteToDirectory(installLocation, options);
                    }
                }
                catch (Exception)
                {
                    OnRaiseUpdateFailure(new UpdateFailureEventArgs());
                }
            };
            worker.RunWorkerAsync();
        }
        private void LifecycleV2VersionValidator(SemVersion packageVersionNumber, VersionTag versionTag)
        {
            if (versionTag.IsEmpty())
            {
                return;
            }

            if (versionTag.Tag == "preview")
            {
                AddError("In package.json, \"version\" cannot be tagged \"preview\" in lifecycle v2, please use \"exp\". " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }

            if (packageVersionNumber.Major < 1)
            {
                AddError("In package.json, \"version\" cannot be tagged \"" + packageVersionNumber.Prerelease + "\" while the major version less than 1. " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }

            if (versionTag.Tag != "exp" && versionTag.Tag != "pre")
            {
                AddError("In package.json, \"version\" must be a valid tag. \"" + versionTag.Tag + "\" is invalid, try either \"pre\" or \"exp\". " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }

            if (versionTag.Tag != "exp" && versionTag.Feature != "")
            {
                AddError("In package.json, \"version\" must be a valid tag. Custom tag \"" + versionTag.Feature + "\" only allowed with \"exp\". " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }

            if (versionTag.Tag == "exp" && versionTag.Feature.Length > 10)
            {
                AddError("In package.json, \"version\" must be a valid tag. Custom tag \"" + versionTag.Feature + "\" is too long, must be 10 characters long or less. " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }

            if (versionTag.Iteration < 1)
            {
                AddError("In package.json, \"version\" must be a valid tag. Iteration is required to be 1 or greater. " + ErrorDocumentation.GetLinkMessage(ErrorTypes.InvalidLifecycleV2));
                return;
            }
        }
        public void InvalidVersionErrorIsOnlyGeneratedOnce()
        {
            string value  = "TLSRPTv1";
            string key    = "p";
            string token  = $"{key}={value}";
            string record = $"{token};rua=mailto:[email protected]";

            EvaluationResult <Tag> evaluationResult =
                _versionParser.Parse(new List <Tag> {
                new VersionTag("", "")
            }, record, token, key, value);

            VersionTag versionTag = evaluationResult.Item as VersionTag;

            Assert.That(versionTag, Is.Not.Null);
            Assert.That(versionTag.RawValue, Is.EqualTo(token));
            Assert.That(versionTag.Value, Is.EqualTo(value));
            Assert.That(evaluationResult.Errors, Is.Empty);
        }
        private void LifecycleV1VersionValidator(SemVersion packageVersionNumber, VersionTag versionTag)
        {
            if (Context.IsCore && (!versionTag.IsEmpty() || packageVersionNumber.Major < 1))
            {
                AddError("Core packages cannot be preview. " + ErrorDocumentation.GetLinkMessage(k_DocsFilePath, "core-packages-cannot-be-preview"));
                return;
            }

            if (packageVersionNumber.Major < 1 && (versionTag.IsEmpty() || versionTag.Tag != "preview"))
            {
                AddError("In package.json, \"version\" < 1, please tag the package as " + packageVersionNumber.VersionOnly() + "-preview. " + ErrorDocumentation.GetLinkMessage(k_DocsFilePath, "version-1-please-tag-the-package-as-xxx-preview"));
                return;
            }

            // The only pre-release tag we support is -preview
            if (!versionTag.IsEmpty() && !(versionTag.Tag == "preview" && versionTag.Feature == "" &&
                                           versionTag.Iteration <= 999999))
            {
                AddError(
                    "In package.json, \"version\": the only pre-release filter supported is \"-preview.[num < 999999]\". " + ErrorDocumentation.GetLinkMessage(k_DocsFilePath, "version-the-only-pre-release-filter-supported-is--preview-num-999999"));
            }
        }
Ejemplo n.º 25
0
        private void InstallClicked(VersionTag tag)
        {
            toolTip.SetToolTip(pictureBoxUpdate, "Installing");
            pictureBoxUpdate.Image   = Properties.Resources.Ring;
            pictureBoxUpdate.Visible = true;
            buttonUpdate.Visible     = false;
            // install the update.
            worker = new BackgroundWorker();
            worker.RunWorkerCompleted += delegate
            {
                pictureBoxUpdate.Visible = false;

                var installLocation = PlaybackChanger_Installer.RegHelper.GetRegInstallPath();
                if (!Directory.Exists(installLocation))
                {
                    return;
                }
                string updater = Path.Combine(installLocation, "PlaybackChanger_Installer.exe");
                if (!File.Exists(updater))
                {
                    return;
                }

                System.Diagnostics.Process.Start(updater);
                MayClose = true;
                this.Close();
            };
            try
            {
                _context.UpdateController.InstallUpdate(tag, worker);
            }
            finally
            {
                worker.Dispose();
            }
        }
Ejemplo n.º 26
0
        public unsafe void Execute(uint stage, IService service)
        {
            // 1) We create the node common block.
            versionAddress = service.AllocationContext.AllocateBlock();
            commonAddress  = service.AllocationContext.AllocateBlock();
            BPlusTree versionTS = new BPlusTree(service.AllocationContext.CreateEmptyBTree());

            // Fill common block and write.
            Block commonBlock = new Block(service.BlockSize);

            fixed(byte *p = commonBlock.Data)
            {
                NodeCommonHeader *header = (NodeCommonHeader *)p;

                header->ChildrenBTree         = service.AllocationContext.CreateEmptyBTree();
                header->CurrentVersionAddress = versionAddress;
                header->CurrentVersionNumber  = 0;
                header->HeaderMagic           = NodeCommonHeader.Magic;
                header->ParentAddress         = parentAddress;
                header->VersionsBTree         = versionTS.RootAddress;
            }

            service.Write(BlockType.NodeHeaderBlock, commonAddress, commonBlock);

            // 2) We create the node default typed stream.
            Block tsblock = new Block(service.BlockSize);

            ulong tsBlock = service.AllocationContext.AllocateBlock();

            fixed(byte *p = tsblock.Data)
            {
                TypedStreamHeader *header = (TypedStreamHeader *)p;

                header->ObjectsAddress = (defaultTSOptions & StreamOptions.SingleObject) == 0 ?
                                         service.AllocationContext.CreateEmptyBTree() : 0;
                header->Options    = defaultTSOptions;
                header->ObjectSize = 0;

                int i;

                for (i = 0; i < defaultTSType.Length; i++)
                {
                    header->Type[i] = defaultTSType[i];
                }

                // Null terminate it.
                header->Type[i] = '\0';
            }

            service.Write(BlockType.TypedStreamHeader, tsBlock, tsblock);

            // 3) We create the node version block.
            // Fill version block and write.
            Block versionBlock = new Block(service.BlockSize);

            fixed(byte *pp = versionBlock.Data)
            {
                NodeVersionHeader *header = (NodeVersionHeader *)pp;

                header->CreationTime       = DateTime.Now;
                header->DefaultTypedStream = 0;
                header->HeaderMagic        = NodeVersionHeader.Magic;
                header->ModifiedTime       = DateTime.Now;
                header->NodeCommonAddress  = commonAddress;
                header->StreamCount        = 0; //< Is actually one but NodeHelper changes this.
                header->VersionNumber      = 0;
            }

            // We must add default typed stream to block.
            NodeVersionHelper.AddTypedStream(tsBlock, defaultTSType, versionBlock);
            service.Write(BlockType.NodeHeaderBlock, versionAddress, versionBlock);

            // 4) We add to children tree.
            ObjectInfo info = childrenTree.Find(service, (uint)childName.GetHashCode());

            if (info == null)
            {
                // We simply create a new object at address.
                ChildTag childTag = new ChildTag();
                childTag.HashCode = childName.GetHashCode();
                childTag.Add(childName, commonAddress);
                byte[] childData = Common.SerializeToArray(childTag);

                // We write it to block stream.
                BlockStream stream = service.AllocationContext.CreateBlockStream((ulong)childData.LongLength);
                stream.Write(childData);

                // We now add it to B+ tree.
                childrenTree.Add(service, new ObjectInfo((uint)childName.GetHashCode(), (ulong)childData.LongLength, stream.BaseAddress));
            }
            else
            {
                // The index at hash already exists, we must add it, first read it.
                BlockStream stream   = BlockStream.FromBase(info.Address, service);
                ChildTag    childTag = Common.DeserializeFromArray(stream.Read(info.Size)) as ChildTag;

                // Steam not used anymore.
                stream.Deallocate();

                // We modify child tag.
                childTag.Add(childName, commonAddress);
                byte[] childData = Common.SerializeToArray(childTag);

                // We must write it to new address.
                stream = service.AllocationContext.CreateBlockStream((ulong)childData.LongLength);
                stream.Write(childData);

                // Now we replace the data in tree.
                childrenTree.Replace(service,
                                     new ObjectInfo((uint)childName.GetHashCode(), (ulong)childData.LongLength, stream.BaseAddress));
            }

            // 5) Add version to typed stream.
            VersionTag versionTag = new VersionTag((0).GetHashCode());

            versionTag.Add(0, versionAddress);
            byte[] versionTagData = Common.SerializeToArray(versionTag);

            // Write to stream.
            BlockStream versionTagStream = service.AllocationContext.CreateBlockStream((ulong)versionTagData.LongLength);

            versionTagStream.Write(versionTagData);

            versionTS.Add(service, new ObjectInfo((uint)(0).GetHashCode(),
                                                  (ulong)versionTagData.LongLength, versionTagStream.BaseAddress));
        }
Ejemplo n.º 27
0
        /// <summary>
        /// Executes the operation.
        /// </summary>
        /// <param name="service">Service for operation.</param>
        unsafe void ExecuteInternal(IService service)
        {
            ulong childrenTS;
            ulong versionTS;

            // 1) We extract child TS and version TS
            Block block = service.Read(BlockType.NodeHeaderBlock, commonAddress);

            fixed(byte *p = block.Data)
            {
                NodeCommonHeader *header = (NodeCommonHeader *)p;

                childrenTS = header->ChildrenBTree;
                versionTS  = header->VersionsBTree;
            }

            // 2) Can get rid of node.
            service.DeAllocate(commonAddress);

            // 3) We delete children TS, it should be empty (since deletes were already called on nodes).
            service.DeAllocate(childrenTS);

            // 4) We go through versions.
            BPlusTree         versionsTree = new BPlusTree(versionTS);
            List <ObjectInfo> versions     = versionsTree.ListAll(service);

            // 5) We delete each version.
            foreach (ObjectInfo info in versions)
            {
                // a) Read version tag.
                BlockStream versionTagStream = BlockStream.FromBase(info.Address, service);
                VersionTag  versionTag       = Common.DeserializeFromArray(versionTagStream.Read(info.Size)) as VersionTag;
                versionTagStream.Deallocate();

                foreach (KeyValuePair <ulong, ulong> versionToNode in versionTag.VersionAddress)
                {
                    block = service.Read(BlockType.NodeHeaderBlock, versionToNode.Value);

                    List <ulong> typedStreams = NodeVersionHelper.ListAllTypedStreamsAsAddresses(block, service);

                    // b) Delete all typed streams.
                    for (int i = 0; i < typedStreams.Count; i++)
                    {
                        // 1) We delete the typed stream object.
                        block = service.Read(BlockType.TypedStreamHeader, typedStreams[i]);
                        fixed(byte *p = block.Data)
                        {
                            TypedStreamHeader *header = (TypedStreamHeader *)p;

                            // We delete single object.
                            if ((header->Options & StreamOptions.SingleObject) != 0)
                            {
                                if (header->ObjectsAddress != 0)
                                {
                                    BlockStream stream = BlockStream.FromBase(header->ObjectsAddress, service);
                                    stream.Deallocate();
                                }
                            }
                            else
                            {
                                // We delete all children.
                                BPlusTree tree = new BPlusTree(header->ObjectsAddress);
                                foreach (ObjectInfo info2 in tree.ListAll(service))
                                {
                                    BlockStream stream = BlockStream.FromBase(info2.Address, service);
                                    stream.Deallocate();
                                }
                            }
                        }

                        // 2) We also delete the header itself.
                        service.DeAllocate(typedStreams[i]);
                    }

                    // c) We deallocate version block.
                    service.DeAllocate(versionToNode.Value);
                }
            }

            // 6) We delete the tree.
            versionsTree.DeallocateTree(service);

            // 7) We must erase the node from root.
            ObjectInfo  childInfo      = parentChildTree.Find(service, (uint)childName.GetHashCode());
            BlockStream childTagStream = BlockStream.FromBase(childInfo.Address, service);

            byte[]   childTagData = childTagStream.Read(childInfo.Size);
            ChildTag childTag     = Common.DeserializeFromArray(childTagData) as ChildTag;

            childTagStream.Deallocate();

            if (childTag.Children.Count == 1)
            {
                // Simply delete it.
                parentChildTree.Remove(service, (uint)childName.GetHashCode(), 1, false);
            }
            else
            {
                // We have to replace it.
                childTag.Remove(childName);
                childTagData   = Common.SerializeToArray(childTag);
                childTagStream = service.AllocationContext.CreateBlockStream((ulong)childTagData.LongLength);
                childTagStream.Write(childTagData);

                parentChildTree.Replace(service, new ObjectInfo((uint)childName.GetHashCode(),
                                                                (ulong)childTagData.LongLength, childTagStream.BaseAddress));
            }
        }
Ejemplo n.º 28
0
 public void Deserialize(Stream input, VersionTag version)
 {
     this.Id       = input.ReadValueU32();
     this.Unknown1 = input.ReadValueF32();
     this.Unknown2 = input.ReadValueF32();
 }
Ejemplo n.º 29
0
        public unsafe void Execute(uint stage, IService service)
        {
            string defaultTSType = typeof(object).FullName;

            // 1) We create the node common block.
            ulong     versionAddress = service.AllocationContext.AllocateBlock();
            ulong     commonAddress  = service.AllocationContext.AllocateBlock();
            BPlusTree versionTS      = new BPlusTree(service.AllocationContext.CreateEmptyBTree());

            // Fill common block and write.
            Block commonBlock = new Block(service.BlockSize);

            fixed(byte *p = commonBlock.Data)
            {
                NodeCommonHeader *header = (NodeCommonHeader *)p;

                header->ChildrenBTree         = service.AllocationContext.CreateEmptyBTree();
                header->CurrentVersionAddress = versionAddress;
                header->CurrentVersionNumber  = 0;
                header->HeaderMagic           = NodeCommonHeader.Magic;
                header->ParentAddress         = 0;
                header->VersionsBTree         = versionTS.RootAddress;
            }

            service.Write(BlockType.NodeHeaderBlock, commonAddress, commonBlock);

            // 2) We create the node default typed stream.
            Block tsblock = new Block(service.BlockSize);

            fixed(byte *p = tsblock.Data)
            {
                TypedStreamHeader *header = (TypedStreamHeader *)p;

                header->ObjectsAddress = service.AllocationContext.AllocateBlock();
                header->Options        = StreamOptions.None;
                header->ObjectSize     = 0;

                int i;

                for (i = 0; i < defaultTSType.Length; i++)
                {
                    header->Type[i] = defaultTSType[i];
                }

                // Null terminate it.
                header->Type[i] = '\0';
            }

            ulong tsBlock = service.AllocationContext.AllocateBlock();

            service.Write(BlockType.TypedStreamHeader, tsBlock, tsblock);

            // 3) We create the node version block.
            // Fill version block and write.
            Block versionBlock = new Block(service.BlockSize);

            fixed(byte *pp = versionBlock.Data)
            {
                NodeVersionHeader *header = (NodeVersionHeader *)pp;

                header->CreationTime       = DateTime.Now;
                header->DefaultTypedStream = 0;
                header->HeaderMagic        = NodeVersionHeader.Magic;
                header->ModifiedTime       = DateTime.Now;
                header->NodeCommonAddress  = commonAddress;
                header->StreamCount        = 0; //< Is actually one but NodeHelper changes this.
                header->VersionNumber      = 0;
            }

            // We must add default typed stream to block.
            NodeVersionHelper.AddTypedStream(tsBlock, defaultTSType, versionBlock);
            service.Write(BlockType.NodeHeaderBlock, versionAddress, versionBlock);

            // 4) We must create versions
            VersionTag versionTag = new VersionTag((0).GetHashCode());

            versionTag.Add(0, versionAddress);
            byte[] versionTagData = Common.SerializeToArray(versionTag);

            // Write to stream.
            BlockStream versionTagStream = service.AllocationContext.CreateBlockStream((ulong)versionTagData.LongLength);

            versionTagStream.Write(versionTagData);

            versionTS.Add(service, new ObjectInfo((uint)(0).GetHashCode(),
                                                  (ulong)versionTagData.LongLength, versionTagStream.BaseAddress));

            // 5) We must write to database header.
            Block block = service.Read(BlockType.NoCache, 0);

            fixed(byte *ppp = block.Data)
            {
                DatabaseHeader *header = (DatabaseHeader *)ppp;

                header->RootObjectAddress = commonAddress;
            }

            // Write the header.
            service.Write(BlockType.NoCache, 0, block);
        }
Ejemplo n.º 30
0
 public void Serialize(Stream output, VersionTag version)
 {
     throw new NotImplementedException();
 }