public Task ImportSql() { using (ContextPool.AllocateOperationContext(out DocumentsOperationContext context)) { using (var sqlImportDoc = context.ReadForMemory(RequestBodyStream(), "sql-migration-request")) { MigrationRequest migrationRequest; // we can't use JsonDeserializationServer here as it doesn't support recursive processing var serializer = DocumentConventions.Default.CreateSerializer(); using (var blittableJsonReader = new BlittableJsonReader()) { blittableJsonReader.Init(sqlImportDoc); migrationRequest = serializer.Deserialize <MigrationRequest>(blittableJsonReader); } var operationId = Database.Operations.GetNextOperationId(); var sourceSqlDatabase = migrationRequest.Source; var dbDriver = DatabaseDriverDispatcher.CreateDriver(sourceSqlDatabase.Provider, sourceSqlDatabase.ConnectionString); var schema = dbDriver.FindSchema(); var token = CreateOperationToken(); var result = new MigrationResult(migrationRequest.Settings); var collectionsCount = migrationRequest.Settings.Collections.Count; var operationDescription = "Importing " + collectionsCount + " " + (collectionsCount == 1 ? "collection" : "collections") + " from SQL database: " + schema.CatalogName; Database.Operations.AddOperation(Database, operationDescription, Documents.Operations.Operations.OperationType.MigrationFromSql, onProgress => { return(Task.Run(async() => { try { // allocate new context as we executed this async using (ContextPool.AllocateOperationContext(out DocumentsOperationContext migrationContext)) { await dbDriver.Migrate(migrationRequest.Settings, schema, Database, migrationContext, result, onProgress, token.Token); } } catch (Exception e) { result.AddError($"Error occurred during import. Exception: {e.Message}"); onProgress.Invoke(result.Progress); throw; } return (IOperationResult)result; })); }, operationId, token: token);