internal async ValueTask <bool> CreateStreamAsync <T>(DataPath dataPath, Metadata metadata, DataStreamCreateFlags flags) { var slf = (StreamLogFlags)flags; short fixedSize = 0; if (slf.IsBinary() && TypeEnumHelper <T> .FixedSize > 0) { if (slf.NoTimestamp()) { fixedSize = TypeEnumHelper <T> .FixedSize; } else { fixedSize = checked ((short)(Timestamp.Size + TypeEnumHelper <T> .FixedSize)); } } // TODO this is only first take to move further and start writing stuff, // needs review and proper ContainerSchema generation from types T. // Also there are so many different flags that they need review. var schema = new ContainerSchema() { ContainerType = (byte)ContainerLayout.None, ContainerFlags = (byte)slf, ValuesSchema = new TypeSchema() { DataTypeHeader = TypeEnumHelper <T> .DataTypeHeader, TypeName = typeof(T).Name, TypeFullName = typeof(T).FullName, FixedSize = fixedSize, } }; var mdr = await MetadataManager.CreateStreamAsync(dataPath, metadata, schema).ConfigureAwait(false); if (mdr.PK != null) { var containerId = mdr.ContainerId; var streamId = StreamLogId.ContainerIdToStreamId(containerId); var slid = new StreamLogId(mdr.RepoId, streamId); var state = StreamLogManager.StateStorage.GetState(slid); var lockHolder = state.LockHolder; state.CheckInit(slid, fixedSize, slf); return(true); } mdr = await MetadataManager.GetMetadataRecordByPathAsync(dataPath).ConfigureAwait(false); if (mdr.PK != null) { return(false); } throw new ArgumentException($"Cannot create a new data stream {dataPath}."); }
public void CouldSerializeContainerSchema() { var cs = new ContainerSchema() { ContainerType = 1, ContainerFlags = 1, ValuesSchema = new TypeSchema() { DataTypeHeader = TypeEnumHelper <long> .DataTypeHeader, FixedSize = 8, TypeName = typeof(long).Name, TypeFullName = typeof(long).FullName } }; var str = JsonSerializer.ToJsonString(cs, ExcludeNullStandardResolver.Instance); Console.WriteLine(str); }