internal void Update(IBuildStuff _builder, ICanBeSharded lastEvent, int index) { Index = index; Timestamp = DateTime.Now; if (lastEvent != null) { LastEventTimestamp = lastEvent.Timestamp; LastEventValue = lastEvent.Value; } }
public async Task AppendValues(ICanBeSharded[] values) { foreach (var shard in _sharding.Shard(values)) { var group = shard.GetValues(); var name = shard.GetName(); var header = ReadHeader(name); DateTime lastEventTimestamp = header.LastEventTimestamp; ICanBeSharded lastEvent = null; using (var stream = Open_Stream_For_Writing(name)) { var tail = header.Index; using (var buffer = CreateMemoryStream()) { using (var writer = new BinaryWriter(buffer, Encoding.Default, true)) foreach (var value in group) { _builder.Serialize(value, writer); if(value.Timestamp > lastEventTimestamp) { lastEvent = value; lastEventTimestamp = value.Timestamp; } } stream.Seek(tail, SeekOrigin.Begin); buffer.Seek(0, SeekOrigin.Begin); int writtenBytes = group.Count() * _builder.SingleElementSizeInBytes(); await buffer.CopyToAsync(stream); stream.Flush(); tail = tail + writtenBytes; } header.Update(_builder, lastEvent, tail); } await WriteHeader(header, name); } }