internal async Task RunSerializeStartRequest(SerializeDataStartRequestParams serializeParams, RequestContext <SerializeDataResult> requestContext) { try { // Verify we have sensible inputs and there isn't a task running for this file already Validate.IsNotNull(nameof(serializeParams), serializeParams); Validate.IsNotNullOrWhitespaceString("FilePath", serializeParams.FilePath); DataSerializer serializer = null; if (inProgressSerializations.TryGetValue(serializeParams.FilePath, out serializer)) { // Cannot proceed as there is an in progress serialization happening throw new Exception(SR.SerializationServiceRequestInProgress(serializeParams.FilePath)); } // Create a new serializer, save for future calls if needed, and write the request out serializer = new DataSerializer(serializeParams); if (!serializeParams.IsLastBatch) { inProgressSerializations.AddOrUpdate(serializer.FilePath, serializer, (key, old) => serializer); } Logger.Write(TraceEventType.Verbose, "HandleSerializeStartRequest"); SerializeDataResult result = serializer.ProcessRequest(serializeParams); await requestContext.SendResult(result); } catch (Exception ex) { await SendErrorAndCleanup(serializeParams.FilePath, requestContext, ex); } }
private async Task TestSaveAsCsvSuccess(bool includeHeaders) { await this.RunFileSaveTest(async (filePath) => { // Given: // ... A simple data set that requires 1 message SerializeDataStartRequestParams saveParams = new SerializeDataStartRequestParams() { FilePath = filePath, Columns = DefaultColumns, Rows = DefaultData, IsLastBatch = true, SaveFormat = "csv", IncludeHeaders = includeHeaders }; // When: I attempt to save this to a file var efv = new EventFlowValidator<SerializeDataResult>() .AddStandardResultValidator() .Complete(); await SerializationService.RunSerializeStartRequest(saveParams, efv.Object); // Then: // ... There should not have been an error efv.Validate(); // ... And the file should look as expected VerifyContents.VerifyCsvMatchesData(saveParams.Rows, saveParams.Columns, saveParams.IncludeHeaders, saveParams.FilePath); }); }
private async Task TestSerializeDataMultiRequestSuccess(Action<SerializeDataStartRequestParams> setStandardParams, Action<string> verify) { await this.RunFileSaveTest(async (filePath) => { // Given: // ... A simple data set that requires 3 messages var startParams = new SerializeDataStartRequestParams() { FilePath = filePath, Columns = DefaultColumns, Rows = new DbCellValue[][] { DefaultData[0] }, IsLastBatch = false }; setStandardParams(startParams); // When I send all 3 messages await SendAndVerifySerializeStartRequest(startParams); var continueParams = new SerializeDataContinueRequestParams() { FilePath = filePath, Rows = new DbCellValue[][] { DefaultData[1] }, IsLastBatch = false }; await SendAndVerifySerializeContinueRequest(continueParams); continueParams.Rows = new DbCellValue[][] { DefaultData[2] }; continueParams.IsLastBatch = true; await SendAndVerifySerializeContinueRequest(continueParams); // ... Then the file should look as expected verify(filePath); }); }
/// <summary> /// Begin to process request to save a resultSet to a file in CSV format /// </summary> internal Task HandleSerializeStartRequest(SerializeDataStartRequestParams serializeParams, RequestContext <SerializeDataResult> requestContext) { // Run in separate thread so that message thread isn't held up by a potentially time consuming file write Task.Run(async() => { await RunSerializeStartRequest(serializeParams, requestContext); }).ContinueWithOnFaulted(async t => await SendErrorAndCleanup(serializeParams?.FilePath, requestContext, t.Exception)); return(Task.CompletedTask); }
private async Task SendAndVerifySerializeStartRequest(SerializeDataStartRequestParams request1) { // When: I attempt to save this to a file var efv = new EventFlowValidator<SerializeDataResult>() .AddStandardResultValidator() .Complete(); await SerializationService.RunSerializeStartRequest(request1, efv.Object); // Then: // ... There should not have been an error efv.Validate(); }
public DataSerializer(SerializeDataStartRequestParams requestParams) { this.requestParams = requestParams; this.columns = this.MapColumns(requestParams.Columns); this.FilePath = requestParams.FilePath; }