public override int CompareTo(RevisionID other)
        {
            var otherCast = other as TreeRevisionID;

            if (otherCast == null)
            {
                Log.To.Database.E(Tag, "Cannot compare to {0}, throwing...", other.GetType().Name);
                throw new ArgumentException(String.Format("Cannot compare TreeRevisionID to {0}", other.GetType().Name));
            }

            return(CBLCollateRevIDs(_data, otherCast._data));
        }
        public static RevisionID RevIDForJSON(IEnumerable <byte> json, bool deleted, RevisionID prevRevID)
        {
            // Revision IDs have a generation count, a hyphen, and a hex digest
            var generation = 0;

            if (prevRevID != null)
            {
                generation = prevRevID.Generation;
                if (generation == 0)
                {
                    return(null);
                }
            }

            // Generate a digest for this revision based on the previous revision ID, document JSON,
            // and attachment digests. This doesn't need to be secure; we just need to ensure that this
            // code consistently generates the same ID given equivalent revisions.
            MessageDigest md5Digest;

            try {
                md5Digest = MessageDigest.GetInstance("MD5");
            } catch (NotSupportedException) {
                throw Misc.CreateExceptionAndLog(Log.To.Database, Tag, "Failed to acquire a class to create MD5");
            }

            if (prevRevID != null)
            {
                var prevIDData = prevRevID.AsData();
                var length     = prevIDData.Length;
                var lengthByte = unchecked ((byte)(length & unchecked ((0xFF))));
                md5Digest.Update(lengthByte);
                if (lengthByte > 0)
                {
                    md5Digest.Update(prevIDData);
                }
            }

            var isDeleted = deleted ? 1 : 0;

            md5Digest.Update((byte)isDeleted);

            if (json != null)
            {
                md5Digest.Update(json.ToArray());
            }

            var md5DigestResult       = md5Digest.Digest();
            var digestAsHex           = BitConverter.ToString(md5DigestResult).Replace("-", String.Empty);
            int generationIncremented = generation + 1;

            return(RevisionIDFactory.FromString(String.Format("{0}-{1}", generationIncremented, digestAsHex).ToLower()));
        }
Пример #3
0
        internal static int CBLCollateRevIDs(string revId1, string revId2)
        {
            var parsed1 = RevisionID.ParseRevId(revId1);
            var parsed2 = RevisionID.ParseRevId(revId2);

            // improper rev IDs; just compare as plain text:
            if (parsed1.Item1 == -1 || parsed2.Item1 == -1)
            {
                var gen1 = RevisionID.GetGeneration(revId1);
                var gen2 = RevisionID.GetGeneration(revId2);
                if (gen1 != 0 && gen2 != 0)
                {
                    return(gen1 - gen2);
                }

                // improper rev IDs; just compare as plain text:
                return(String.Compare(revId1, revId2, true, CultureInfo.InvariantCulture));
            }

            // Compare generation numbers; if they match, compare suffixes:
            if (parsed1.Item1 != parsed2.Item1)
            {
                return(parsed1.Item1 - parsed2.Item1);
            }
            else
            {
                if (parsed1.Item2 != null && parsed2.Item2 != null)
                {
                    // compare suffixes if possible
                    return(String.CompareOrdinal(parsed1.Item2, parsed2.Item2));
                }
                else
                {
                    // just compare as plain text:
                    return(String.Compare(revId1, revId2, true, CultureInfo.InvariantCulture));
                }
            }
        }
 public int Compare(RevisionID x, RevisionID y)
 {
     return(x.CompareTo(y));
 }