Exemplo n.º 1
0
 public RecordColumn(LogDeserializeContext context)
 {
     Index   = context.br.ReadInt32();
     Name    = context.br.ReadString();
     Type    = context.br.ReadString();
     Value   = context.br.ReadNullableString();
     Default = context.br.ReadNullableString();
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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));
            }
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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));
            }
        }
Exemplo n.º 6
0
        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;
            }
        }
Exemplo n.º 7
0
 internal LogEntry(LogDeserializeContext context)
 {
     LogHeader.Deserialize(this, context);
     Hash = context.br.ReadVarBuffer();
     DeserializeObjects(context);
 }
Exemplo n.º 8
0
 public Schema(LogDeserializeContext context)
 {
     Name = context.br.ReadString();
     DeserializeProperties(context);
 }
Exemplo n.º 9
0
        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);
            }
        }