private IEnumerator <IAsyncResult> GetBlobImpl(IBlobRegion blobRegion, BlobPropertyNames propertyNames, IBlobObjectCondition condition, AsyncIteratorContext <CrcStream> context) { IAsyncResult asyncResult = this._storageManager.AsyncProcessor.BeginExecute <CrcStream>((TimeSpan param0) => { CrcStream streamFromByteArray; using (TransactionScope transactionScope = new TransactionScope()) { using (DevelopmentStorageDbDataContext dbContext = DevelopmentStorageDbDataContext.GetDbContext()) { base.LoadContainer(dbContext); BlockBlob blockBlob = base.LoadBlockBlob(dbContext); if (blobRegion == null) { blobRegion = new BlobRegion((long)0, blockBlob.ContentLength); } else if (blobRegion.Offset > blockBlob.ContentLength || blobRegion.Offset == blockBlob.ContentLength && blockBlob.ContentLength > (long)0) { throw new InvalidBlobRegionException(new long?(blobRegion.Offset), "Offset value is greater than the contentlength"); } BlobLeaseInfo blobLeaseInfo = new BlobLeaseInfo(blockBlob, DateTime.UtcNow); DbBlobObject.CheckConditionsAndReturnResetRequired(blockBlob, blobLeaseInfo, condition, null, false); long offset = blobRegion.Offset; long num = Math.Min(offset + blobRegion.Length, blockBlob.ContentLength); IOrderedQueryable <CommittedBlock> committedBlocks = from b in dbContext.CommittedBlocks where (b.AccountName == this._blob.AccountName) && (b.ContainerName == this._blob.ContainerName) && (b.BlobName == this._blob.BlobName) && (b.VersionTimestamp == this._blob.VersionTimestamp) && (long?)b.Offset + b.Length >= (long?)offset && b.Offset < num orderby b.Offset select b; byte[] bytesFromCommittedBlocks = this.GetBytesFromCommittedBlocks(dbContext, offset, num, committedBlocks); transactionScope.Complete(); this._blob = blockBlob; this.LeaseInfo = blobLeaseInfo; streamFromByteArray = DbStorageHelper.GetStreamFromByteArray(bytesFromCommittedBlocks); } } return(streamFromByteArray); }, base.Timeout, context.GetResumeCallback(), context.GetResumeState("DbListBlobObject.GetBlob")); yield return(asyncResult); context.ResultData = this._storageManager.AsyncProcessor.EndExecute <CrcStream>(asyncResult); }
private IEnumerator <IAsyncResult> PutBlockImpl(byte[] blockIdentifier, long contentLength, Stream inputStream, byte[] contentMD5, bool isLargeBlockBlobRequest, IBlobObjectCondition condition, AsyncIteratorContext <NoResults> context) { Microsoft.WindowsAzure.DevelopmentStorage.Store.BlobContainer blobContainer = null; BlockBlob blockBlob = null; IAsyncResult asyncResult = this._storageManager.AsyncProcessor.BeginExecute((TimeSpan param0) => { long num; long num1; StorageStampHelpers.ValidatePutBlockArguments(this, blockIdentifier, contentLength, contentMD5, condition, true); string str = null; using (DevelopmentStorageDbDataContext dbContext = DevelopmentStorageDbDataContext.GetDbContext()) { blobContainer = base.LoadContainer(dbContext); blockBlob = base.TryLoadBlockBlob(dbContext, out str); if (blockBlob == null) { lock (DbListBlobObject.SynchronizePutBlock) { blockBlob = base.TryLoadBlockBlob(dbContext, out str); if (blockBlob == null) { if (string.IsNullOrEmpty(str)) { str = BlockBlobDataManager.CreateUniqueDirectoryLoadBalanced(); } using (DevelopmentStorageDbDataContext developmentStorageDbDataContext = DevelopmentStorageDbDataContext.GetDbContext()) { Logger <INormalAndDebugLogger> .Instance.VerboseDebug.Log("PutBlockImpl: Creating record for ({0};{1};{2})", new object[] { this._blob.AccountName, this._blob.ContainerName, this._blob.BlobName }); StorageStampHelpers.CheckBlobName(this._blob.BlobName, this._blob.ContainerName); blockBlob = new BlockBlob() { AccountName = this._blob.AccountName, ContainerName = this._blob.ContainerName, BlobName = this._blob.BlobName, VersionTimestamp = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc), ContentLength = (long)0, IsCommitted = new bool?(false), HasBlock = new bool?(true), DirectoryPath = str, GenerationId = Guid.NewGuid().ToString(), SnapshotCount = 0 }; developmentStorageDbDataContext.Blobs.InsertOnSubmit(blockBlob); developmentStorageDbDataContext.SubmitChanges(); } } } } bool flag = false; BlobLeaseInfo blobLeaseInfo = new BlobLeaseInfo(blockBlob, DateTime.UtcNow); DbBlobObject.CheckCopyState(blockBlob); flag = DbBlobObject.CheckConditionsAndReturnResetRequired(blockBlob, blobLeaseInfo, condition, null, true); byte[] byteArrayFromStream = DbStorageHelper.GetByteArrayFromStream(inputStream, out num, true, isLargeBlockBlobRequest); string file = BlockBlobDataManager.WriteBytesToFile(new BlockBlobMetaInfo(this._blob.AccountName, this._blob.ContainerName, this._blob.BlobName, str), byteArrayFromStream, out num1); string hexString = DbListBlobObject.ToHexString(blockIdentifier); BlockData blockDatum = this.TryLoadUncommittedBlock(dbContext, hexString); if (blockDatum == null) { blockDatum = new BlockData() { AccountName = this._blob.AccountName, ContainerName = this._blob.ContainerName, BlobName = this._blob.BlobName, VersionTimestamp = this._blob.VersionTimestamp, IsCommitted = false, BlockId = hexString }; dbContext.BlocksData.InsertOnSubmit(blockDatum); } blockDatum.Length = new long?(num); blockDatum.FilePath = file; blockDatum.StartOffset = new long?(num1); base.ResetBlobLeaseToAvailable(blockBlob, flag); dbContext.SubmitChanges(); blobLeaseInfo.SetBlob(blockBlob, blobLeaseInfo.LeaseInfoValidAt); this.LeaseInfo = blobLeaseInfo; } }, base.Timeout, context.GetResumeCallback(), context.GetResumeState("DbListBlobObject.PutBlock")); yield return(asyncResult); this._storageManager.AsyncProcessor.EndExecute(asyncResult); }
private IEnumerator <IAsyncResult> PutBlobImpl(string contentType, long contentLength, byte[] serviceMetadata, byte[] applicationMetadata, Stream inputStream, byte[] contentMD5, bool invokeGeneratePutBlobServiceMetadata, GeneratePutBlobServiceMetadata generatePutBlobServiceMetadata, bool isLargeBlockBlobRequest, ISequenceNumberUpdate sequenceNumberUpdate, OverwriteOption overwriteOption, IBlobObjectCondition condition, AsyncIteratorContext <NoResults> context) { IAsyncResult asyncResult = this._storageManager.AsyncProcessor.BeginExecute((TimeSpan param0) => { long num; long num1; using (TransactionScope transactionScope = new TransactionScope()) { using (DevelopmentStorageDbDataContext dbContext = DevelopmentStorageDbDataContext.GetDbContext()) { base.LoadContainer(dbContext); string str = null; BlockBlob blockBlob = base.TryLoadBlockBlob(dbContext, out str); DateTime utcNow = DateTime.UtcNow; bool flag = false; if (blockBlob != null) { if (blockBlob.IsCommitted.Value && overwriteOption == OverwriteOption.CreateNewOnly) { throw new BlobAlreadyExistsException(); } DbBlobObject.CheckCopyState(blockBlob); flag = DbBlobObject.CheckConditionsAndReturnResetRequired(blockBlob, new BlobLeaseInfo(blockBlob, utcNow), condition, null, true); dbContext.ClearUncommittedBlocks(this._blob.AccountName, this._blob.ContainerName, this._blob.BlobName); dbContext.Refresh(RefreshMode.KeepChanges, blockBlob); } else { if (overwriteOption == OverwriteOption.UpdateExistingOnly) { if (condition == null || !condition.LeaseId.HasValue) { throw new ConditionNotMetException(); } throw new LeaseNotPresentException(); } StorageStampHelpers.CheckBlobName(this._blob.BlobName, this._blob.ContainerName); if (string.IsNullOrEmpty(str)) { str = BlockBlobDataManager.CreateUniqueDirectoryLoadBalanced(); } blockBlob = new BlockBlob() { AccountName = this._blob.AccountName, ContainerName = this._blob.ContainerName, BlobName = this._blob.BlobName, VersionTimestamp = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc), DirectoryPath = str }; dbContext.Blobs.InsertOnSubmit(blockBlob); } StorageStampHelpers.ValidatePutBlobArguments(this, contentLength, null, applicationMetadata, contentMD5, sequenceNumberUpdate, overwriteOption, condition, true, false); byte[] byteArrayFromStream = DbStorageHelper.GetByteArrayFromStream(inputStream, out num, false, isLargeBlockBlobRequest); string file = BlockBlobDataManager.WriteBytesToFile(new BlockBlobMetaInfo(this._blob.AccountName, this._blob.ContainerName, this._blob.BlobName, str), byteArrayFromStream, out num1); Guid guid = Guid.NewGuid(); BlockData blockDatum = new BlockData() { AccountName = this._blob.AccountName, ContainerName = this._blob.ContainerName, BlobName = this._blob.BlobName, VersionTimestamp = this._blob.VersionTimestamp, IsCommitted = false, BlockId = DbListBlobObject.ToHexString(guid.ToByteArray()), FilePath = file, StartOffset = new long?(num1) }; dbContext.BlocksData.InsertOnSubmit(blockDatum); if (invokeGeneratePutBlobServiceMetadata && generatePutBlobServiceMetadata != null) { serviceMetadata = generatePutBlobServiceMetadata(); } blockBlob.ContentType = contentType ?? "application/octet-stream"; blockBlob.ContentMD5 = contentMD5; blockBlob.ServiceMetadata = serviceMetadata; blockBlob.Metadata = applicationMetadata; blockBlob.IsCommitted = new bool?(false); blockBlob.HasBlock = new bool?(false); blockBlob.UncommittedBlockIdLength = null; blockBlob.GenerationId = Guid.NewGuid().ToString(); blockBlob.SnapshotCount = 0; blockDatum.Length = new long?(num); blockBlob.ContentLength = num; base.ResetBlobLeaseToAvailable(blockBlob, flag); dbContext.SubmitChanges(); StringBuilder stringBuilder = new StringBuilder(); DbListBlobObject.SerializeCommitBlockListEntry(stringBuilder, guid.ToByteArray(), BlockSource.Uncommitted); DateTime?nullable = null; dbContext.CommitBlockList(this._blob.AccountName, this._blob.ContainerName, this._blob.BlobName, stringBuilder.ToString(), ref nullable); transactionScope.Complete(); blockBlob.LastModificationTime = nullable; this._blob = blockBlob; this.LeaseInfo = new BlobLeaseInfo(blockBlob, utcNow); } } }, base.Timeout, context.GetResumeCallback(), context.GetResumeState("DbListBlobObject.PutBlobImpl")); yield return(asyncResult); this._storageManager.AsyncProcessor.EndExecute(asyncResult); }