/// <summary> /// Initializes an instance of the BuiltInBlobProviderSelector /// </summary> public BuiltInBlobProviderSelector() { // check if there is a configuration for an external blob provider if (string.IsNullOrEmpty(BlobStorage.BlobProviderClassName) || ExternalBlobProvider != null) { return; } try { ExternalBlobProvider = (IBlobProvider)TypeResolver.CreateInstance(BlobStorage.BlobProviderClassName); SnLog.WriteInformation("External BlobProvider created by configuration. Type: " + BlobStorage.BlobProviderClassName, EventId.RepositoryLifecycle); } catch (Exception ex) { SnLog.WriteException(ex); } // We throw an exception in a static constructor (which will prevent this type to work) // because if something is wrong with the blob provider configuration, it will affect // the whole system and it should be resolved immediately. if (ExternalBlobProvider == null) { throw new ConfigurationErrorsException("Unknown blob provider name in configuration: " + BlobStorage.BlobProviderClassName); } }
public async Task <PendingDocumentResponse> Get(long?fromId, [FromServices] IBlobProvider blobProvider, CancellationToken token) { var query = new PendingDocumentQuery(fromId, User.GetCountryClaim()); var retVal = await _queryBus.QueryAsync(query, token); var tasks = new Lazy <List <Task> >(); var counter = 0; long?id = null; foreach (var document in retVal) { id = document.Id; var files = await _blobProvider.FilesInDirectoryAsync("preview-0", document.Id.ToString(), token); var file = files.FirstOrDefault(); if (file != null) { document.Preview = blobProvider.GeneratePreviewLink(file, TimeSpan.FromMinutes(20)); counter++; } else { var t = _queueProvider.InsertBlobReprocessAsync(document.Id); tasks.Value.Add(t); } document.SiteLink = Url.RouteUrl("DocumentDownload", new { id = document.Id }); if (counter >= 21) { break; } } if (tasks.IsValueCreated) { await Task.WhenAll(tasks.Value); } string nextLink = null; if (id.HasValue) { nextLink = Url.RouteUrl("Pending", new { fromId = id.Value }); } return(new PendingDocumentResponse() { Documents = retVal, NextLink = nextLink }); }
/// <summary> /// Creates a new instance of the BlobStorageContext class. /// </summary> /// <param name="provider">Blob provider to work with.</param> /// <param name="providerData">Optional existing provider-specific data in text format.</param> public BlobStorageContext(IBlobProvider provider, string providerData = null) { Provider = provider; if (providerData != null) { BlobProviderData = provider.ParseData(providerData); } }
internal static bool UseFileStream(IBlobProvider blobProvider, long fullSize) { if (!(blobProvider is SqlFileStreamBlobProvider)) { return(false); } return(fullSize > BlobStorage.MinimumSizeForBlobProviderInBytes); }
public BlobManager() { if (BlobSettings.DefaultProvider == null) { Provider = new Providers.LocalBlobProvider(); } else { Provider = BlobSettings.DefaultProvider; } }
public void UpdateBinaryProperty(IBlobProvider blobProvider, BinaryDataValue value) { var streamLength = value.Stream?.Length ?? 0; if (streamLength > 0) { var ctx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, UseFileStream = false }; blobProvider.Allocate(ctx); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } var isRepositoryStream = value.Stream is RepositoryStream || value.Stream is SenseNetSqlFileStream; var hasStream = isRepositoryStream || value.Stream is MemoryStream; if (!hasStream) { // do not do any database operation if the stream is not modified return; } var db = _dataProvider.DB; var fileId = db.Files.Count == 0 ? 1 : db.Files.Max(r => r.FileId) + 1; db.Files.Add(new InMemoryDataProvider.FileRecord { FileId = fileId, ContentType = value.ContentType, Extension = value.FileName.Extension, FileNameWithoutExtension = value.FileName.FileNameWithoutExtension, Size = Math.Max(0, value.Size), BlobProvider = value.BlobProviderName, BlobProviderData = value.BlobProviderData }); var binaryPropertyRow = db.BinaryProperties.FirstOrDefault(r => r.BinaryPropertyId == value.Id); if (binaryPropertyRow != null) { binaryPropertyRow.FileId = fileId; } if (fileId > 0 && fileId != value.FileId) { value.FileId = fileId; } }
public ContestFileProvider( IBlobProvider blobProvider, ContestReadmeNameFormat?crnFormatter = null, ContestReadmeSourceFormat?crsFormatter = null) { _blobProvider = blobProvider; _contestReadmeNameFormat = crnFormatter ?? (cid => $"c{cid}/readme.html"); _contestReadmeSourceFormat = crsFormatter ?? (cid => $"c{cid}/readme.md"); }
public STT.Task InsertBinaryPropertyAsync(IBlobProvider blobProvider, BinaryDataValue value, int versionId, int propertyTypeId, bool isNewNode, SnDataContext dataContext) { var streamLength = value.Stream?.Length ?? 0; var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = streamLength }; // blob operation blobProvider.AllocateAsync(ctx, CancellationToken.None).GetAwaiter().GetResult(); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); // metadata operation var db = DataProvider.DB; if (!isNewNode) { DeleteBinaryPropertyAsync(versionId, propertyTypeId, dataContext).GetAwaiter().GetResult(); } var fileId = db.Files.GetNextId(); db.Files.Insert(new FileDoc { FileId = fileId, ContentType = value.ContentType, Extension = value.FileName.Extension, FileNameWithoutExtension = value.FileName.FileNameWithoutExtension, Size = Math.Max(0, value.Size), BlobProvider = value.BlobProviderName, BlobProviderData = value.BlobProviderData }); var binaryPropertyId = db.BinaryProperties.GetNextId(); db.BinaryProperties.Insert(new BinaryPropertyDoc { BinaryPropertyId = binaryPropertyId, FileId = fileId, PropertyTypeId = propertyTypeId, VersionId = versionId }); value.Id = binaryPropertyId; value.FileId = fileId; value.Timestamp = 0L; //TODO: file row timestamp return(STT.Task.CompletedTask); }
public BlobManager() { if (BlobSettings.DefaultProvider == null) { Provider = new Providers.LocalBlobProvider(); } else { Provider = BlobSettings.DefaultProvider; } }
public BookmarkConsumer(ICapPublisher capPublisher, IHttpClientFactory httpClientFactory, IBlobProvider blobProvider, IPostService postService, IBookmarkService bookmarkService) { _capPublisher = capPublisher; _blobProvider = blobProvider; _postService = postService; _bookmarkService = bookmarkService; _httpClient = httpClientFactory.CreateClient(); }
public void InsertBinaryProperty(IBlobProvider blobProvider, BinaryDataValue value, int versionId, int propertyTypeId, bool isNewNode) { var streamLength = value.Stream?.Length ?? 0; var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = streamLength }; // blob operation blobProvider.Allocate(ctx); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); // metadata operation var db = _dataProvider.DB; if (!isNewNode) { db.BinaryProperties.RemoveAll(r => r.VersionId == versionId && r.PropertyTypeId == propertyTypeId); } var fileId = db.Files.Count == 0 ? 1 : db.Files.Max(r => r.FileId) + 1; db.Files.Add(new InMemoryDataProvider.FileRecord { FileId = fileId, ContentType = value.ContentType, Extension = value.FileName.Extension, FileNameWithoutExtension = value.FileName.FileNameWithoutExtension, Size = Math.Max(0, value.Size), BlobProvider = value.BlobProviderName, BlobProviderData = value.BlobProviderData }); var binaryPropertyId = db.BinaryProperties.Count == 0 ? 1 : db.BinaryProperties.Max(r => r.BinaryPropertyId) + 1; db.BinaryProperties.Add(new InMemoryDataProvider.BinaryPropertyRecord { BinaryPropertyId = binaryPropertyId, FileId = fileId, PropertyTypeId = propertyTypeId, VersionId = versionId }); value.Id = binaryPropertyId; value.FileId = fileId; value.Timestamp = 0L; //TODO: file row timestamp }
public async Task <IActionResult> DownloadDocument(long id, [FromServices] IDocumentDirectoryBlobProvider blobProvider, [FromServices] IBlobProvider blobProvider2, CancellationToken token) { var files = await blobProvider.FilesInDirectoryAsync("file-", id.ToString(), token); var file = files.First(); //blob.core.windows.net/spitball-files/files/6160/file-82925b5c-e3ba-4f88-962c-db3244eaf2b2-advanced-linux-programming.pdf var extension = Path.GetExtension(file.Segments.Last()); var url = blobProvider2.GenerateDownloadLink(file, TimeSpan.FromMinutes(30), "Temp" + extension); return(Redirect(url.AbsoluteUri)); }
public async Task <ActionResult> DownloadAsync(long id, [FromServices] ICommandBus commandBus, [FromServices] IBlobProvider blobProvider2, CancellationToken token) { var user = _userManager.GetLongUserId(User); var query = new DocumentById(id, user); var tItem = _queryBus.QueryAsync(query, token); var tFiles = _blobProvider.FilesInDirectoryAsync("file-", id.ToString(), token); await Task.WhenAll(tItem, tFiles); var item = tItem.Result; if (item == null) { return(NotFound()); } if (item.Document.DocumentType == DocumentType.Video) { return(Unauthorized()); } if (!item.IsPurchased) { return(Unauthorized()); } var files = tFiles.Result; var uri = files.First(); var file = uri.Segments.Last(); Task followTask = Task.CompletedTask; //blob.core.windows.net/spitball-files/files/6160/file-82925b5c-e3ba-4f88-962c-db3244eaf2b2-advanced-linux-programming.pdf if (item.Document.User.Id != user) { var command = new DownloadDocumentCommand(item.Document.Id, user); //var command = new FollowUserCommand(item.Document.User.Id, user); followTask = commandBus.DispatchAsync(command, token); } var messageTask = _queueProvider.InsertMessageAsync(new UpdateDocumentNumberOfDownloads(id), token); await Task.WhenAll(followTask, messageTask); var nameToDownload = item.Document.Title; var extension = Path.GetExtension(file); var url = blobProvider2.GenerateDownloadLink(uri, TimeSpan.FromMinutes(30), nameToDownload + extension); return(Redirect(url.AbsoluteUri)); }
public DigniteAbpBlobContainer( string containerName, BlobContainerConfiguration configuration, IBlobProvider provider, ICurrentTenant currentTenant, ICancellationTokenProvider cancellationTokenProvider, IBlobNormalizeNamingService blobNormalizeNamingService, IServiceProvider serviceProvider) : base( containerName, configuration, provider, currentTenant, cancellationTokenProvider, blobNormalizeNamingService, serviceProvider ) { }
public async Task <IEnumerable <FlaggedDocumentDto> > FlagAsync ([FromServices] IBlobProvider blobProvider, CancellationToken token) { var query = new FlaggedDocumentQuery(User.GetCountryClaim()); var retVal = await _queryBus.QueryAsync(query, token); var tasks = new Lazy <List <Task> >(); foreach (var document in retVal) { var files = await _blobProvider.FilesInDirectoryAsync("preview-0", document.Id.ToString(), token); var file = files.FirstOrDefault(); if (file != null) { document.Preview = blobProvider.GeneratePreviewLink(file, TimeSpan.FromMinutes(20)); document.SiteLink = Url.RouteUrl("DocumentDownload", new { id = document.Id }); } else { var t = _queueProvider.InsertBlobReprocessAsync(document.Id); tasks.Value.Add(t); } } if (tasks.IsValueCreated) { await Task.WhenAll(tasks.Value); } //return retVal.Where(w => w.Preview != null); return(retVal); }
public STT.Task UpdateBinaryPropertyAsync(IBlobProvider blobProvider, BinaryDataValue value, SnDataContext dataContext) { var streamLength = value.Stream?.Length ?? 0; var isExternal = false; if (streamLength > 0) { // BlobProviderData parameter is irrelevant because it will be overridden in the Allocate method var ctx = new BlobStorageContext(blobProvider) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, }; blobProvider.AllocateAsync(ctx, CancellationToken.None).GetAwaiter().GetResult(); isExternal = true; value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } var isRepositoryStream = value.Stream is RepositoryStream; var hasStream = isRepositoryStream || value.Stream is MemoryStream; if (!isExternal && !hasStream) { // do not do any database operation if the stream is not modified return(STT.Task.CompletedTask); } var db = DataProvider.DB; var fileId = db.Files.GetNextId(); db.Files.Insert(new FileDoc { FileId = fileId, ContentType = value.ContentType, Extension = value.FileName.Extension, FileNameWithoutExtension = value.FileName.FileNameWithoutExtension, Size = Math.Max(0, value.Size), BlobProvider = value.BlobProviderName, BlobProviderData = value.BlobProviderData }); var binaryPropertyDoc = db.BinaryProperties.FirstOrDefault(x => x.BinaryPropertyId == value.Id); if (binaryPropertyDoc != null) { binaryPropertyDoc.FileId = fileId; } if (fileId > 0 && fileId != value.FileId) { value.FileId = fileId; } // update stream with a new context var newCtx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, }; using (var stream = blobProvider.GetStreamForWrite(newCtx)) value.Stream?.CopyTo(stream); return(STT.Task.CompletedTask); }
public string StartChunk(IBlobProvider blobProvider, int versionId, int propertyTypeId, long fullSize) { throw new NotImplementedException(); }
public IBlobProvider GetProvider(long fullSize, Dictionary <string, IBlobProvider> providers, IBlobProvider builtIn) { return(providers[typeof(InMemoryBlobProvider).FullName]); }
/// <summary> /// Starts a chunked save operation on an existing content. It does not write any binary data /// to the storage, it only makes prerequisite operations - e.g. allocates a new slot in the storage. /// </summary> /// <param name="blobProvider">Blob storage provider.</param> /// <param name="versionId">Content version id.</param> /// <param name="propertyTypeId">Binary property type id.</param> /// <param name="fullSize">Full size (stream length) of the binary value.</param> /// <returns>A token containing all the information (db record ids) that identify a single entry in the blob storage.</returns> public string StartChunk(IBlobProvider blobProvider, int versionId, int propertyTypeId, long fullSize) { var isLocalTransaction = !TransactionScope.IsActive; if (isLocalTransaction) { TransactionScope.Begin(); } var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = fullSize }; string blobProviderName = null; string blobProviderData = null; if (blobProvider != BlobStorageBase.BuiltInProvider) { blobProvider.Allocate(ctx); blobProviderName = blobProvider.GetType().FullName; blobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } try { using (var cmd = new SqlProcedure { CommandText = InsertStagingBinaryScript, CommandType = CommandType.Text }) { cmd.Parameters.Add("@VersionId", SqlDbType.Int).Value = versionId; cmd.Parameters.Add("@PropertyTypeId", SqlDbType.Int).Value = propertyTypeId; cmd.Parameters.Add("@Size", SqlDbType.BigInt).Value = fullSize; cmd.Parameters.Add("@BlobProvider", SqlDbType.NVarChar, 450).Value = blobProviderName != null ? (object)blobProviderName : DBNull.Value; cmd.Parameters.Add("@BlobProviderData", SqlDbType.NVarChar, int.MaxValue).Value = blobProviderData != null ? (object)blobProviderData : DBNull.Value; int binaryPropertyId; int fileId; using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { binaryPropertyId = reader.GetSafeInt32(0); fileId = reader.GetSafeInt32(1); } else { throw new DataException("File row could not be inserted."); } } ctx.FileId = fileId; return(new ChunkToken { VersionId = versionId, PropertyTypeId = propertyTypeId, BinaryPropertyId = binaryPropertyId, FileId = fileId }.GetToken()); } } catch (Exception ex) { if (isLocalTransaction && TransactionScope.IsActive) { TransactionScope.Rollback(); } throw new DataException("Error during saving binary chunk to SQL Server.", ex); } finally { if (isLocalTransaction && TransactionScope.IsActive) { TransactionScope.Commit(); } } }
public Task <string> StartChunkAsync(IBlobProvider blobProvider, int versionId, int propertyTypeId, long fullSize, CancellationToken cancellationToken) { throw new NotImplementedException(); }
public Downloader(IBlobProvider blobProvider, IOptions <AppOptions> options) { _blobProvider = blobProvider; _appOptions = options.Value; }
public async Task <string> StartChunkAsync(IBlobProvider blobProvider, int versionId, int propertyTypeId, long fullSize, CancellationToken cancellationToken) { var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = fullSize }; string blobProviderName = null; string blobProviderData = null; if (!(blobProvider is IBuiltInBlobProvider)) { await blobProvider.AllocateAsync(ctx, cancellationToken).ConfigureAwait(false); blobProviderName = blobProvider.GetType().FullName; blobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } try { using (var dctx = new MsSqlDataContext(ConnectionStrings.ConnectionString, DataOptions, cancellationToken)) { using (var transaction = dctx.BeginTransaction()) { var result = await dctx.ExecuteReaderAsync(InsertStagingBinaryScript, cmd => { cmd.Parameters.AddRange(new[] { dctx.CreateParameter("@VersionId", DbType.Int32, versionId), dctx.CreateParameter("@PropertyTypeId", DbType.Int32, propertyTypeId), dctx.CreateParameter("@Size", DbType.Int64, fullSize), dctx.CreateParameter("@BlobProvider", DbType.String, 450, blobProviderName != null ? (object)blobProviderName : DBNull.Value), dctx.CreateParameter("@BlobProviderData", DbType.String, int.MaxValue, blobProviderData != null ? (object)blobProviderData : DBNull.Value), }); }, async (reader, cancel) => { int binaryPropertyId; int fileId; cancel.ThrowIfCancellationRequested(); if (await reader.ReadAsync(cancel).ConfigureAwait(false)) { binaryPropertyId = reader.GetSafeInt32(0); fileId = reader.GetSafeInt32(1); } else { throw new DataException("File row could not be inserted."); } ctx.FileId = fileId; return(new ChunkToken { VersionId = versionId, PropertyTypeId = propertyTypeId, BinaryPropertyId = binaryPropertyId, FileId = fileId }.GetToken()); }).ConfigureAwait(false); transaction.Commit(); return(result); } } } catch (Exception ex) { throw new DataException("Error during saving binary chunk to SQL Server.", ex); } }
public async Task UpdateBinaryPropertyAsync(IBlobProvider blobProvider, BinaryDataValue value, SnDataContext dataContext) { var streamLength = value.Stream?.Length ?? 0; var isExternal = false; if (!(blobProvider is IBuiltInBlobProvider)) { // BlobProviderData parameter is irrelevant because it will be overridden in the Allocate method var ctx = new BlobStorageContext(blobProvider) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, }; await blobProvider.AllocateAsync(ctx, dataContext.CancellationToken).ConfigureAwait(false); isExternal = true; value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } else { value.BlobProviderName = null; value.BlobProviderData = null; } if (blobProvider is IBuiltInBlobProvider) { // MS-SQL does not support stream size over [Int32.MaxValue]. if (streamLength > int.MaxValue) { throw new NotSupportedException(); } } var isRepositoryStream = value.Stream is RepositoryStream; var hasStream = isRepositoryStream || value.Stream is MemoryStream; if (!isExternal && !hasStream) { // do not do any database operation if the stream is not modified return; } if (!(dataContext is MsSqlDataContext sqlCtx)) { throw new PlatformNotSupportedException(); } var sql = blobProvider is IBuiltInBlobProvider ? UpdateBinaryPropertyScript : UpdateBinaryPropertyNewFilerowScript; var fileId = (int)await sqlCtx.ExecuteScalarAsync(sql, cmd => { cmd.Parameters.AddRange(new[] { sqlCtx.CreateParameter("@BinaryPropertyId", DbType.Int32, value.Id), sqlCtx.CreateParameter("@ContentType", DbType.String, 450, value.ContentType), sqlCtx.CreateParameter("@FileNameWithoutExtension", DbType.String, 450, value.FileName.FileNameWithoutExtension == null ? DBNull.Value : (object)value.FileName.FileNameWithoutExtension), sqlCtx.CreateParameter("@Extension", DbType.String, 50, ValidateExtension(value.FileName.Extension)), sqlCtx.CreateParameter("@Size", DbType.Int64, value.Size), sqlCtx.CreateParameter("@Checksum", DbType.AnsiString, 200, value.Checksum != null ? (object)value.Checksum : DBNull.Value), sqlCtx.CreateParameter("@BlobProvider", DbType.String, 450, value.BlobProviderName != null ? (object)value.BlobProviderName : DBNull.Value), sqlCtx.CreateParameter("@BlobProviderData", DbType.String, int.MaxValue, value.BlobProviderData != null ? (object)value.BlobProviderData : DBNull.Value), }); }).ConfigureAwait(false); if (fileId > 0 && fileId != value.FileId) { value.FileId = fileId; } if (blobProvider is IBuiltInBlobProvider) { // Stream exists and is loaded -> write it var ctx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, BlobProviderData = new BuiltinBlobProviderData() }; await BuiltInBlobProvider.UpdateStreamAsync(ctx, value.Stream, sqlCtx).ConfigureAwait(false); } else { var ctx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, }; if (streamLength == 0) { await blobProvider.ClearAsync(ctx, dataContext.CancellationToken).ConfigureAwait(false); } else { using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); } } }
public IBlobProvider GetBlobProvider() { //TODO: [DIBLOB] compare provider types or type full names? return(_provider ?? (_provider = _providers?.Values.FirstOrDefault(p => p.GetType().FullName == typeof(T).FullName))); }
public async Task <IEnumerable <UserDocumentsDto> > GetUserInfo(long id, int page, [FromServices] IBlobProvider blobProvider, CancellationToken token) { var country = User.GetCountryClaim(); var query = new UserDocumentsQuery(id, page, country); var retVal = (await _queryBus.QueryAsync(query, token)).ToList(); var tasks = new Lazy <List <Task> >(); foreach (var document in retVal) { var files = await _blobProvider.FilesInDirectoryAsync("preview-0", document.Id.ToString(), token); var file = files.FirstOrDefault(); if (file != null) { document.Preview = blobProvider.GeneratePreviewLink(file, TimeSpan.FromMinutes(20)); document.SiteLink = Url.RouteUrl("DocumentDownload", new { id = document.Id }); } else { var t = _queueProvider.InsertBlobReprocessAsync(document.Id); tasks.Value.Add(t); } } return(retVal); }
public async Task <string> StartChunkAsync(IBlobProvider blobProvider, int versionId, int propertyTypeId, long fullSize, CancellationToken cancellationToken) { var db = DataProvider.DB; // Get related objects var binaryDoc = db.BinaryProperties.FirstOrDefault(r => r.VersionId == versionId && r.PropertyTypeId == propertyTypeId); if (binaryDoc == null) { return(null); } var fileDoc = db.Files.FirstOrDefault(x => x.FileId == binaryDoc.FileId); if (fileDoc == null) { return(null); } if (fileDoc.Staging) { return(null); } // Create context var binaryPropertyId = binaryDoc.BinaryPropertyId; var fileId = fileDoc.FileId; var providerName = fileDoc.BlobProvider; var providerTextData = fileDoc.BlobProviderData; var provider = BlobStorageBase.GetProvider(providerName); var context = new BlobStorageContext(provider, providerTextData) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = fileId, Length = fullSize, }; // Allocate a new blob await blobProvider.AllocateAsync(context, cancellationToken); var blobProviderName = blobProvider.GetType().FullName; var blobProviderData = BlobStorageContext.SerializeBlobProviderData(context.BlobProviderData); // Insert a new file row var contentType = fileDoc.ContentType; var fileNameWithoutExtension = fileDoc.FileNameWithoutExtension; var extension = fileDoc.Extension; var newFileId = db.Files.GetNextId(); db.Files.Insert(new FileDoc { FileId = newFileId, BlobProvider = blobProviderName, BlobProviderData = blobProviderData, ContentType = contentType, Extension = extension, FileNameWithoutExtension = fileNameWithoutExtension, Size = fullSize, Staging = true, }); // Return a token return(new ChunkToken { VersionId = versionId, PropertyTypeId = propertyTypeId, BinaryPropertyId = binaryPropertyId, FileId = newFileId }.GetToken()); }
public BlobManager(IBlobProvider provider) { Provider = provider; }
/// <summary> /// Inserts a new binary property value into the metadata database and the blob storage, /// removing the previous one if the content is not new. /// </summary> /// <param name="blobProvider">Blob storage provider.</param> /// <param name="value">Binary data to insert.</param> /// <param name="versionId">Content version id.</param> /// <param name="propertyTypeId">Binary property type id.</param> /// <param name="isNewNode">Whether this value belongs to a new or an existing node.</param> public void InsertBinaryProperty(IBlobProvider blobProvider, BinaryDataValue value, int versionId, int propertyTypeId, bool isNewNode) { var streamLength = value.Stream?.Length ?? 0; var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = streamLength }; // In case of an external provider allocate the place for bytes and // write the stream beforehand and get the generated provider data. // Note that the external provider does not need an existing record // in the Files table to work, it just stores the bytes. if (blobProvider != BlobStorageBase.BuiltInProvider && streamLength > 0) { blobProvider.Allocate(ctx); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } SqlProcedure cmd = null; try { cmd = new SqlProcedure { CommandText = isNewNode ? InsertBinaryPropertyScript : DeleteAndInsertBinaryProperty, CommandType = CommandType.Text }; cmd.Parameters.Add("@VersionId", SqlDbType.Int).Value = versionId != 0 ? (object)versionId : DBNull.Value; cmd.Parameters.Add("@PropertyTypeId", SqlDbType.Int).Value = propertyTypeId != 0 ? (object)propertyTypeId : DBNull.Value; cmd.Parameters.Add("@ContentType", SqlDbType.NVarChar, 450).Value = value.ContentType; cmd.Parameters.Add("@FileNameWithoutExtension", SqlDbType.NVarChar, 450).Value = value.FileName.FileNameWithoutExtension == null ? DBNull.Value : (object)value.FileName.FileNameWithoutExtension; cmd.Parameters.Add("@Extension", SqlDbType.NVarChar, 50).Value = ValidateExtension(value.FileName.Extension); cmd.Parameters.Add("@Size", SqlDbType.BigInt).Value = Math.Max(0, value.Size); cmd.Parameters.Add("@BlobProvider", SqlDbType.NVarChar, 450).Value = value.BlobProviderName != null ? (object)value.BlobProviderName : DBNull.Value; cmd.Parameters.Add("@BlobProviderData", SqlDbType.NVarChar, int.MaxValue).Value = value.BlobProviderData != null ? (object)value.BlobProviderData : DBNull.Value; cmd.Parameters.Add("@Checksum", SqlDbType.VarChar, 200).Value = value.Checksum != null ? (object)value.Checksum : DBNull.Value; // insert binary and file rows and retrieve new ids. using (var reader = cmd.ExecuteReader()) { reader.Read(); value.Id = Convert.ToInt32(reader[0]); value.FileId = Convert.ToInt32(reader[1]); value.Timestamp = Utility.Convert.BytesToLong((byte[])reader.GetValue(2)); } } finally { cmd.Dispose(); } // The BuiltIn blob provider saves the stream after the record // was saved into the Files table, because simple varbinary // column must exist before we can write a stream into the record. // ReSharper disable once InvertIf if (blobProvider == BlobStorageBase.BuiltInProvider && value.Stream != null && value.Stream.Length > 0) { ctx.FileId = value.FileId; ctx.BlobProviderData = new BuiltinBlobProviderData(); BuiltInBlobProvider.AddStream(ctx, value.Stream); } }
public void Register(IBlobProvider provider) { providers.Add(provider); }
/// <summary> /// Updates an existing binary property value in the database and the blob storage. /// </summary> /// <param name="blobProvider">Blob storage provider.</param> /// <param name="value">Binary data to update.</param> public void UpdateBinaryProperty(IBlobProvider blobProvider, BinaryDataValue value) { var streamLength = value.Stream?.Length ?? 0; if (blobProvider != BlobStorageBase.BuiltInProvider && streamLength > 0) { var ctx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, }; blobProvider.Allocate(ctx); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } else { value.BlobProviderName = null; value.BlobProviderData = null; } if (blobProvider == BlobStorageBase.BuiltInProvider) { // MS-SQL does not support stream size over [Int32.MaxValue]. if (streamLength > int.MaxValue) { throw new NotSupportedException(); } } var isRepositoryStream = value.Stream is RepositoryStream; var hasStream = isRepositoryStream || value.Stream is MemoryStream; if (!hasStream) { // do not do any database operation if the stream is not modified return; } SqlProcedure cmd = null; try { string sql; CommandType commandType; if (blobProvider == BlobStorageBase.BuiltInProvider) { commandType = CommandType.StoredProcedure; sql = "proc_BinaryProperty_Update"; } else { commandType = CommandType.Text; sql = UpdateBinaryPropertyNewFilerowScript; } cmd = new SqlProcedure { CommandText = sql, CommandType = commandType }; cmd.Parameters.Add("@BinaryPropertyId", SqlDbType.Int).Value = value.Id; cmd.Parameters.Add("@ContentType", SqlDbType.NVarChar, 450).Value = value.ContentType; cmd.Parameters.Add("@FileNameWithoutExtension", SqlDbType.NVarChar, 450).Value = value.FileName.FileNameWithoutExtension == null ? DBNull.Value : (object)value.FileName.FileNameWithoutExtension; cmd.Parameters.Add("@Extension", SqlDbType.NVarChar, 50).Value = ValidateExtension(value.FileName.Extension); cmd.Parameters.Add("@Size", SqlDbType.BigInt).Value = value.Size; cmd.Parameters.Add("@Checksum", SqlDbType.VarChar, 200).Value = value.Checksum != null ? (object)value.Checksum : DBNull.Value; cmd.Parameters.Add("@BlobProvider", SqlDbType.NVarChar, 450).Value = value.BlobProviderName != null ? (object)value.BlobProviderName : DBNull.Value; cmd.Parameters.Add("@BlobProviderData", SqlDbType.NVarChar, int.MaxValue).Value = value.BlobProviderData != null ? (object)value.BlobProviderData : DBNull.Value; var fileId = (int)cmd.ExecuteScalar(); if (fileId > 0 && fileId != value.FileId) { value.FileId = fileId; } } finally { cmd.Dispose(); } // ReSharper disable once InvertIf if (blobProvider == BlobStorageBase.BuiltInProvider && !isRepositoryStream && streamLength > 0) { // Stream exists and is loaded -> write it var ctx = new BlobStorageContext(blobProvider, value.BlobProviderData) { VersionId = 0, PropertyTypeId = 0, FileId = value.FileId, Length = streamLength, BlobProviderData = new BuiltinBlobProviderData() }; BuiltInBlobProvider.UpdateStream(ctx, value.Stream); } }
/// <summary> /// Legacy API for tests and tools. In production use the AddSenseNetBlobProvider method /// instead to register a blob provider service in DI. /// </summary> public static IRepositoryBuilder AddBlobProvider(this IRepositoryBuilder repositoryBuilder, IBlobProvider provider) { Configuration.Providers.Instance.BlobProviders.AddProvider(provider); return(repositoryBuilder); }
public async Task InsertBinaryPropertyAsync(IBlobProvider blobProvider, BinaryDataValue value, int versionId, int propertyTypeId, bool isNewNode, SnDataContext dataContext) { var streamLength = value.Stream?.Length ?? 0; var ctx = new BlobStorageContext(blobProvider) { VersionId = versionId, PropertyTypeId = propertyTypeId, FileId = 0, Length = streamLength }; // In case of an external provider allocate the place for bytes and // write the stream beforehand and get the generated provider data. // Note that the external provider does not need an existing record // in the Files table to work, it just stores the bytes. if (!(blobProvider is IBuiltInBlobProvider)) { await blobProvider.AllocateAsync(ctx, dataContext.CancellationToken).ConfigureAwait(false); using (var stream = blobProvider.GetStreamForWrite(ctx)) value.Stream?.CopyTo(stream); value.BlobProviderName = ctx.Provider.GetType().FullName; value.BlobProviderData = BlobStorageContext.SerializeBlobProviderData(ctx.BlobProviderData); } if (!(dataContext is MsSqlDataContext sqlCtx)) { throw new PlatformNotSupportedException(); } var sql = isNewNode ? InsertBinaryPropertyScript : DeleteAndInsertBinaryPropertyScript; if (!isNewNode) { dataContext.NeedToCleanupFiles = true; } await sqlCtx.ExecuteReaderAsync(sql, cmd => { cmd.Parameters.AddRange(new[] { sqlCtx.CreateParameter("@VersionId", DbType.Int32, versionId != 0 ? (object)versionId : DBNull.Value), sqlCtx.CreateParameter("@PropertyTypeId", DbType.Int32, propertyTypeId != 0 ? (object)propertyTypeId : DBNull.Value), sqlCtx.CreateParameter("@ContentType", DbType.String, 450, value.ContentType), sqlCtx.CreateParameter("@FileNameWithoutExtension", DbType.String, 450, value.FileName.FileNameWithoutExtension == null ? DBNull.Value : (object)value.FileName.FileNameWithoutExtension), sqlCtx.CreateParameter("@Extension", DbType.String, 50, ValidateExtension(value.FileName.Extension)), sqlCtx.CreateParameter("@Size", DbType.Int64, Math.Max(0, value.Size)), sqlCtx.CreateParameter("@BlobProvider", DbType.String, 450, value.BlobProviderName != null ? (object)value.BlobProviderName : DBNull.Value), sqlCtx.CreateParameter("@BlobProviderData", DbType.String, int.MaxValue, value.BlobProviderData != null ? (object)value.BlobProviderData : DBNull.Value), sqlCtx.CreateParameter("@Checksum", DbType.AnsiString, 200, value.Checksum != null ? (object)value.Checksum : DBNull.Value), }); }, async (reader, cancel) => { if (await reader.ReadAsync(cancel).ConfigureAwait(false)) { value.Id = Convert.ToInt32(reader[0]); value.FileId = Convert.ToInt32(reader[1]); value.Timestamp = Utility.Convert.BytesToLong((byte[])reader.GetValue(2)); } return(true); }).ConfigureAwait(false); // The BuiltIn blob provider saves the stream after the record // was saved into the Files table, because simple varbinary // column must exist before we can write a stream into the record. // ReSharper disable once InvertIf if (blobProvider is IBuiltInBlobProvider && value.Stream != null) { ctx.FileId = value.FileId; ctx.BlobProviderData = new BuiltinBlobProviderData(); await BuiltInBlobProvider.AddStreamAsync(ctx, value.Stream, sqlCtx).ConfigureAwait(false); } }