Exemple #1
0
        public async Task<CloudAppendBlob> GetBlobReference(String shardingKey, String containerName, String streamId, CancellationToken token, StreamOptions streamOptions)
        {
            var client = _hydra.CreateBlobClient(shardingKey);
            var account = client.Credentials.AccountName;
            var container = client.GetContainerReference(containerName);
            var semaphore = GetSemaphore(account, containerName, streamId);

            if (await semaphore.WaitAsync(TimeSpan.FromSeconds(5), token))
            {
                try
                {
                    if (streamOptions.CreateContainer && !GetContainerExists(account, containerName))
                    {
                        await container.CreateIfNotExistsAsync(token);
                        SetContainerExists(account, containerName);
                    }

                    var blob = container.GetAppendBlobReference(streamId);

                    if (streamOptions.CreateBlob && !GetStreamExists(account, containerName, streamId) && !await blob.ExistsAsync(token))
                    {
                        await blob.CreateOrReplaceAsync(token);
                        SetStreamExists(account, containerName, streamId);
                    }

                    return blob;
                }
                finally
                {
                    semaphore.Release();
                }
            }

            throw new TimeoutException("Unable to get blob reference");
        }
Exemple #2
0
        public async Task<String[]> ReadEventsAsync(String shardingKey, String streamId, StreamOptions options = default(StreamOptions), CancellationToken token = default(CancellationToken))
        {
            var streamOptions = options ?? new StreamOptions();
            var blob = await _streamContainer.GetBlobReference(shardingKey, Container, streamId, token, streamOptions);
            var content = await blob.DownloadTextAsync(Encoding.UTF8, null, null, null, token);

            return content.Split(new[] { DelimiterString }, StringSplitOptions.None);
        }
Exemple #3
0
        public async Task WriteEventAsync(String shardingKey, String streamId, String eventData, StreamOptions options = default(StreamOptions), CancellationToken token = default(CancellationToken))
        {
            var dataBuilder = new StringBuilder(eventData);
            var streamOptions = options ?? new StreamOptions();
            var blob = await _streamContainer.GetBlobReference(shardingKey, Container, streamId, token, streamOptions);

            if (streamOptions.AppendDelimeter)
            {
                dataBuilder.Append(DelimiterString);
            }

            using (var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(dataBuilder.ToString())))
            {
                await blob.AppendBlockAsync(dataStream, null, token);
            }
        }
Exemple #4
0
        public async Task <CloudAppendBlob> GetBlobReference(string shardingKey, string containerName, string streamId, CancellationToken token, StreamOptions streamOptions)
        {
            var client    = _hydra.CreateBlobClient(shardingKey);
            var account   = client.Credentials.AccountName;
            var container = client.GetContainerReference(containerName);
            var semaphore = GetSemaphore(account, containerName, streamId);

            if (await semaphore.WaitAsync(TimeSpan.FromSeconds(5), token))
            {
                try
                {
                    if (streamOptions.CreateContainer && !GetContainerExists(account, containerName))
                    {
                        await container.CreateIfNotExistsAsync(BlobContainerPublicAccessType.Off, null, null, token);

                        SetContainerExists(account, containerName);
                    }

                    var blob = container.GetAppendBlobReference(streamId);

                    if (streamOptions.CreateBlob && !GetStreamExists(account, containerName, streamId) && !await blob.ExistsAsync(null, null, token))
                    {
                        await blob.CreateOrReplaceAsync(null, null, null, token);

                        SetStreamExists(account, containerName, streamId);
                    }

                    return(blob);
                }
                finally
                {
                    semaphore.Release();
                }
            }

            throw new TimeoutException("Unable to get blob reference");
        }
Exemple #5
0
        public async Task <string[]> ReadEventsAsync(string shardingKey, string streamId, StreamOptions options = default(StreamOptions), CancellationToken token = default(CancellationToken))
        {
            var streamOptions = options ?? new StreamOptions();
            var blob          = await _streamContainer.GetBlobReference(shardingKey, Container, streamId, token, streamOptions);

            var content = await blob.DownloadTextAsync(Encoding.UTF8, null, null, null, token);

            return(content.Split(new[] { DelimiterString }, StringSplitOptions.None));
        }
Exemple #6
0
        public async Task WriteEventAsync(string shardingKey, string streamId, string eventData, StreamOptions options = default(StreamOptions), CancellationToken token = default(CancellationToken))
        {
            var dataBuilder   = new StringBuilder(eventData);
            var streamOptions = options ?? new StreamOptions();
            var blob          = await _streamContainer.GetBlobReference(shardingKey, Container, streamId, token, streamOptions);

            if (streamOptions.AppendDelimeter)
            {
                dataBuilder.Append(DelimiterString);
            }

            using (var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(dataBuilder.ToString())))
            {
                await blob.AppendBlockAsync(dataStream, null, null, null, null, token);
            }
        }