예제 #1
0
        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}.");
        }
예제 #2
0
        public ValueTask <bool> CreateStreamAsync <T>(
            string newStreamName,
            Metadata metadata,
            DataStreamCreateFlags flags = DataStreamCreateFlags.None)
        {
            var dp = _dataPathPrefix.Combine(newStreamName, false);

            return(_dataStore.CreateStreamAsync <T>(dp, metadata, flags));
        }