Esempio n. 1
0
        public void Load(BinaryReader reader, Action <int, long> values, int count)
        {
            long        factor    = (long)CountCompression.Deserialize(reader);
            List <long> rawValues = (List <long>)DeltaCompression.CoreDecompress(reader);

            for (int i = 0; i < count; i++)
            {
                values(i, factor * rawValues[i]);
            }
        }
Esempio n. 2
0
        public void Load(BinaryReader reader, Action <int, long> values, int count)
        {
            if (reader.ReadByte() != VERSION)
            {
                throw new Exception("Invalid Int64IndexerPersist version.");
            }

            long factor = (long)CountCompression.Deserialize(reader);

            DeltaCompression.Decompress(reader, (idx, val) => values(idx, factor * val), count);
        }
        private PackageFromBuiltInFeedResource AttemptDeltaPush(string fileName, Stream contents, bool replaceExisting)
        {
            if (!repository.HasLink("PackageDeltaSignature"))
            {
                Logger.Info("Server does not support delta compression for package push");
                return(null);
            }

            if (!PackageIdentityParser.TryParsePackageIdAndVersion(Path.GetFileNameWithoutExtension(fileName), out var packageId, out var version))
            {
                Logger.Info("Could not determine the package ID and/or version based on the supplied filename");
                return(null);
            }

            PackageSignatureResource signatureResult;

            try
            {
                Logger.Info($"Requesting signature for delta compression from the server for upload of a package with id '{packageId}' and version '{version}'");
                signatureResult = repository.Client.Get <PackageSignatureResource>(repository.Link("PackageDeltaSignature"), new { packageId, version });
            }
            catch (OctopusResourceNotFoundException)
            {
                Logger.Info("No package with the same ID exists on the server");
                return(null);
            }

            using (var deltaTempFile = new TemporaryFile())
            {
                var shouldUpload = DeltaCompression.CreateDelta(contents, signatureResult, deltaTempFile.FileName);
                if (!shouldUpload)
                {
                    return(null);
                }

                using (var delta = File.OpenRead(deltaTempFile.FileName))
                {
                    var result = repository.Client.Post <FileUpload, PackageFromBuiltInFeedResource>(
                        repository.Link("PackageDeltaUpload"),
                        new FileUpload()
                    {
                        Contents = delta, FileName = Path.GetFileName(fileName)
                    },
                        new { replace = replaceExisting, packageId, signatureResult.BaseVersion });

                    Logger.Info($"Delta transfer completed");
                    return(result);
                }
            }
        }
        public void Store(BinaryWriter writer, Func <int, decimal> values, int count)
        {
            writer.Write(VERSION);

            DeltaCompression.Helper helper = null;
            long[] array = null;
            int    digits;

            try
            {
                digits = GetMaxDigits(values, count);
                if (digits <= 15)
                {
                    helper = new DeltaCompression.Helper();
                    array  = new long[count];

                    decimal koef = (decimal)Math.Pow(10, digits);
                    for (int i = 0; i < count; i++)
                    {
                        decimal value = values(i);
                        long    v     = checked ((long)Math.Round(value * koef));

                        array[i] = v;
                        helper.Add(v);
                    }
                }
                else
                {
                    digits = -1;
                }
            }
            catch (OverflowException)
            {
                digits = -1;
            }

            writer.Write((sbyte)digits);
            if (digits >= 0)
            {
                DeltaCompression.Compress(writer, array, 0, count, helper);
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    writer.Write(values(i));
                }
            }
        }
Esempio n. 5
0
        public void Store(BinaryWriter writer, Func <int, decimal> values, int count)
        {
            DeltaCompression.Helper helper    = null;
            List <long>             rawValues = null;
            int maxDigits;

            try
            {
                maxDigits = GetMaxDigits(values, count);
                if (maxDigits <= 15)
                {
                    helper    = new DeltaCompression.Helper();
                    rawValues = new List <long>(count);

                    decimal koef = (decimal)Math.Pow(10, maxDigits);
                    for (int i = 0; i < count; i++)
                    {
                        decimal value = values(i);
                        long    v     = checked ((long)Math.Round(value * koef));
                        helper.AddValue(v);
                        rawValues.Add(v);
                    }
                }
                else
                {
                    maxDigits = -1;
                }
            }
            catch (OverflowException)
            {
                maxDigits = -1;
            }

            writer.Write((sbyte)maxDigits);
            if (maxDigits >= 0)
            {
                DeltaCompression.CoreCompress(writer, rawValues, helper);
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    writer.Write(values(i));
                }
            }
        }
Esempio n. 6
0
        public void Load(BinaryReader reader, Action <int, float> values, int count)
        {
            int digits = reader.ReadSByte();

            if (digits >= 0)
            {
                double      koef      = Math.Pow(10, digits);
                List <long> rawValues = (List <long>)DeltaCompression.CoreDecompress(reader);
                for (int i = 0; i < count; i++)
                {
                    values(i, (float)Math.Round(rawValues[i] / koef, digits));
                }
            }
            else //native read
            {
                for (int i = 0; i < count; i++)
                {
                    values(i, reader.ReadSingle());
                }
            }
        }
        public void Load(BinaryReader reader, Action <int, decimal> values, int count)
        {
            if (reader.ReadByte() != VERSION)
            {
                throw new Exception("Invalid DecimalIndexerPersist version.");
            }

            int digits = reader.ReadSByte();

            if (digits >= 0)
            {
                double koef = Math.Pow(10, digits);
                DeltaCompression.Decompress(reader, (idx, val) => values(idx, (decimal)Math.Round(val / koef, digits)), count);
            }
            else //native read
            {
                for (int i = 0; i < count; i++)
                {
                    values(i, reader.ReadDecimal());
                }
            }
        }
Esempio n. 8
0
        public void Store(BinaryWriter writer, Func <int, long> values, int count)
        {
            writer.Write(VERSION);

            long[] array = new long[count];

            int index = factors.Length - 1;

            for (int i = 0; i < count; i++)
            {
                long value = values(i);
                array[i] = value;

                while (index >= 0)
                {
                    if (value % factors[index] == 0)
                    {
                        break;
                    }
                    else
                    {
                        index--;
                    }
                }
            }

            long factor = index >= 0 ? factors[index] : 1;

            DeltaCompression.Helper helper = new DeltaCompression.Helper();
            for (int i = 0; i < count; i++)
            {
                array[i] /= factor;
                helper.Add(array[i]);
            }

            CountCompression.Serialize(writer, checked ((ulong)factor));
            DeltaCompression.Compress(writer, array, 0, count, helper);
        }
Esempio n. 9
0
        public void Store(BinaryWriter writer, Func <int, long> values, int count)
        {
            List <long> list = new List <long>(count);

            int index = factors.Length - 1;

            for (int i = 0; i < count; i++)
            {
                long value = values(i);
                list.Add(value);

                while (index >= 0)
                {
                    if (value % factors[index] == 0)
                    {
                        break;
                    }
                    else
                    {
                        index--;
                    }
                }
            }

            long factor = index >= 0 ? factors[index] : 1;

            DeltaCompression.Helper helper = new DeltaCompression.Helper();
            for (int i = 0; i < count; i++)
            {
                list[i] = list[i] / factor;
                helper.AddValue(list[i]);
            }

            CountCompression.Serialize(writer, checked ((ulong)factor));
            DeltaCompression.CoreCompress(writer, list, helper);
        }
Esempio n. 10
0
        private async Task <FeedPackageResult> AttemptDeltaPush(Stream stream, string originalFilename, bool replace, string region)
        {
            var(packageId, version) = PackageIdAndVersionParser.Parse(Path.GetFileNameWithoutExtension(originalFilename));

            try
            {
                _client.Log.Info($"Requesting signature for delta compression from the server for upload of a package '{packageId}' version '{version}'");

                var signature = await _client.FeedClientWrapper.Get <PackageDeltaSignatureResult>(
                    UrlTemplate.Resolve(
                        _feedRootUri + "/packages/{packageId}/{version}/delta-signature",
                        new { packageId, version }
                        )
                    );

                var tempFile = Path.GetTempFileName();
                try
                {
                    var shouldUpload = DeltaCompression.CreateDelta(_client.Log, stream, signature, tempFile);
                    if (!shouldUpload)
                    {
                        return(null);
                    }

                    using (var delta = File.OpenRead(tempFile))
                    {
                        var result = await _client.FeedClientWrapper.Create <FeedPackageResult>(
                            UrlTemplate.Resolve(
                                _feedRootUri + "/packages/{packageId}/{baseVersion}/delta{?replace,region}",
                                new { packageId, baseVersion = signature.BaseVersion, replace, region }
                                ),
                            delta,
                            originalFilename,
                            new Dictionary <string, string>()
                            );

                        _client.Log.Info($"Delta transfer completed");
                        return(result);
                    }
                }
                finally
                {
                    try
                    {
                        File.Delete(tempFile);
                    }
                    catch
                    {
                    }
                }
            }
            catch (FeedzHttpRequestException hre) when(hre.Code == HttpStatusCode.NotFound)
            {
                _client.Log.Info("No package with the same ID exists on the server");
                return(null);
            }
            catch (FeedzHttpRequestException hre) when(hre.Code == HttpStatusCode.Conflict)
            {
                throw new Exception("The package already exists");
            }
            catch (Exception)
            {
                _client.Log.Info("An error occured calculating the package delta");
                return(null);
            }
        }
        private PackageFromBuiltInFeedResource AttemptDeltaPush(string fileName, Stream contents, OverwriteMode overwriteMode)
        {
            if (!repository.HasLink("PackageDeltaSignature"))
            {
                Logger.Info("Server does not support delta compression for package push");
                return(null);
            }

            if (!PackageIdentityParser.TryParsePackageIdAndVersion(Path.GetFileNameWithoutExtension(fileName), out var packageId, out var version))
            {
                Logger.Info("Could not determine the package ID and/or version based on the supplied filename");
                return(null);
            }

            PackageSignatureResource signatureResult;

            try
            {
                Logger.Info($"Requesting signature for delta compression from the server for upload of a package with id '{packageId}' and version '{version}'");
                signatureResult = repository.Client.Get <PackageSignatureResource>(repository.Link("PackageDeltaSignature"), new { packageId, version });
            }
            catch (OctopusResourceNotFoundException)
            {
                Logger.Info("No package with the same ID exists on the server");
                return(null);
            }

            using (var deltaTempFile = new TemporaryFile())
            {
                var shouldUpload = DeltaCompression.CreateDelta(contents, signatureResult, deltaTempFile.FileName);
                if (!shouldUpload)
                {
                    return(null);
                }

                using (var delta = File.OpenRead(deltaTempFile.FileName))
                {
                    var    link = repository.Link("PackageDeltaUpload");
                    object pathParameters;

                    // if the link contains overwriteMode then we're connected to a new server, if not use the old `replace` parameter
                    if (link.Contains(OverwriteModeLink.Link))
                    {
                        pathParameters = new { overwriteMode = overwriteMode, packageId, signatureResult.BaseVersion };
                    }
                    else
                    {
                        pathParameters = new { replace = overwriteMode.ConvertToLegacyReplaceFlag(Logger), packageId, signatureResult.BaseVersion };
                    }

                    var result = repository.Client.Post <FileUpload, PackageFromBuiltInFeedResource>(
                        link,
                        new FileUpload()
                    {
                        Contents = delta, FileName = Path.GetFileName(fileName)
                    },
                        pathParameters);

                    Logger.Info($"Delta transfer completed");
                    return(result);
                }
            }
        }