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())); }
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)); }