public RecordColumn(LogDeserializeContext context) { Index = context.br.ReadInt32(); Name = context.br.ReadString(); Type = context.br.ReadString(); Value = context.br.ReadNullableString(); Default = context.br.ReadNullableString(); }
public ILogSerialized Deserialize(Type type, LogDeserializeContext context) { if (!_serializers.TryGetValue(type, out var serializer)) { return(null); } var deserialized = serializer.Invoke(new object[] { context }); return((ILogSerialized)deserialized); }
private void DeserializeProperties(LogDeserializeContext context) { var count = context.br.ReadInt32(); Properties = new List <SchemaProperty>(count); for (var i = 0; i < count; i++) { Properties.Add(new SchemaProperty(context)); } }
internal void DeserializeObjects(LogDeserializeContext context) { var count = context.br.ReadInt32(); Objects = new List <LogObject>(count); for (var i = 0; i < count; i++) { var o = new LogObject(context); Objects.Add(o); } }
public Record(Guid id, LogDeserializeContext context) : this() { Uuid = id; Type = context.br.ReadString(); TimestampV1 = context.br.ReadUInt64(); TimestampV2 = context.br.ReadUInt64(); var columns = context.br.ReadInt32(); for (var i = 0; i < columns; i++) { Columns.Add(new RecordColumn(context)); } }
public IEnumerable <LogEntry> StreamEntries(ulong startingFrom = 0, byte[] secretKey = null, CancellationToken cancellationToken = default) { if (cancellationToken.IsCancellationRequested) { yield break; } LogEntry previousEntry = default; using var tx = env.Value.BeginTransaction(TransactionBeginFlags.ReadOnly); using var db = tx.OpenDatabase(); var length = tx.GetEntriesCount(db); while (startingFrom < (ulong)length && !cancellationToken.IsCancellationRequested) { var key = BitConverter.GetBytes((long)startingFrom); var(r, _, v) = tx.Get(db, key); if (r != MDBResultCode.Success) { yield break; } using var ms = new MemoryStream(v.AsSpan().ToArray()); using var br = new BinaryReader(ms); var context = new LogDeserializeContext(br, _typeProvider); var entry = new LogEntry(context) { Index = startingFrom++ }; if (previousEntry != default) { entry.EntryCheck(previousEntry, _hashProvider); } yield return(entry); previousEntry = entry; } }
internal LogEntry(LogDeserializeContext context) { LogHeader.Deserialize(this, context); Hash = context.br.ReadVarBuffer(); DeserializeObjects(context); }
public Schema(LogDeserializeContext context) { Name = context.br.ReadString(); DeserializeProperties(context); }
public static void RoundTripCheck(this LogEntry entry, ILogObjectTypeProvider typeProvider, byte[] secretKey) { var firstMemoryStream = new MemoryStream(); var firstSerializeContext = new LogSerializeContext(new BinaryWriter(firstMemoryStream), typeProvider); byte[] nonce; if (secretKey != null) { nonce = SecretStream.Nonce(); firstSerializeContext.bw.WriteVarBuffer(nonce); using var ems = new MemoryStream(); using var ebw = new BinaryWriter(ems); var ec = new LogSerializeContext(ebw, typeProvider, firstSerializeContext.Version); entry.Serialize(ec, false); firstSerializeContext.bw.WriteVarBuffer(SecretStream.EncryptMessage(ems.ToArray(), nonce, secretKey)); } else { firstSerializeContext.bw.Write(false); entry.Serialize(firstSerializeContext, false); } var originalData = firstMemoryStream.ToArray(); var br = new BinaryReader(new MemoryStream(originalData)); var deserializeContext = new LogDeserializeContext(br, typeProvider); nonce = deserializeContext.br.ReadVarBuffer(); LogEntry deserialized; if (nonce != null) { using var dms = new MemoryStream(SecretStream.DecryptMessage(deserializeContext.br.ReadVarBuffer(), nonce, secretKey)); using var dbr = new BinaryReader(dms); var dc = new LogDeserializeContext(dbr, typeProvider); deserialized = new LogEntry(dc); } else { deserialized = new LogEntry(deserializeContext); } var secondMemoryStream = new MemoryCompareStream(originalData); var secondSerializeContext = new LogSerializeContext(new BinaryWriter(secondMemoryStream), typeProvider); if (secretKey != null) { secondSerializeContext.bw.WriteVarBuffer(nonce); using var ems = new MemoryStream(); using var ebw = new BinaryWriter(ems); var ec = new LogSerializeContext(ebw, typeProvider, secondSerializeContext.Version); deserialized.Serialize(ec, false); secondSerializeContext.bw.WriteVarBuffer(SecretStream.EncryptMessage(ems.ToArray(), nonce, secretKey)); } else { secondSerializeContext.bw.Write(false); deserialized.Serialize(secondSerializeContext, false); } }