/// <summary> /// Send changes to server /// </summary> public async Task <(SyncContext, ChangesStatistics)> ApplyChangesAsync(SyncContext context, ScopeInfo fromScope, BatchInfo changes) { if (changes == null || changes.BatchPartsInfo.Count == 0) { return(context, new ChangesStatistics()); } SyncContext syncContext = null; ChangesStatistics changesStatistics = null; // Foreach part, will have to send them to the remote // once finished, return context foreach (var bpi in changes.BatchPartsInfo.OrderBy(bpi => bpi.Index)) { HttpMessage httpMessage = new HttpMessage(); httpMessage.Step = HttpStep.ApplyChanges; httpMessage.SyncContext = context; httpMessage.ApplyChanges = new HttpApplyChangesMessage(); httpMessage.ApplyChanges.ScopeInfo = fromScope; // If BPI is InMempory, no need to deserialize from disk // Set already contained in part.Set if (!changes.InMemory) { // get the batch var partBatch = bpi.GetBatch(); // get the surrogate dmSet if (partBatch != null) { httpMessage.ApplyChanges.Set = partBatch.DmSetSurrogate; } } else if (bpi.Set != null) { httpMessage.ApplyChanges.Set = new DmSetSurrogate(bpi.Set); } if (httpMessage.ApplyChanges.Set == null || httpMessage.ApplyChanges.Set.Tables == null || httpMessage.ApplyChanges.Set.Tables.Count == 0) { throw new ArgumentException("No changes to upload found."); } // no need to send filename httpMessage.ApplyChanges.BatchPartInfo = new BatchPartInfo { FileName = null, Index = bpi.Index, IsLastBatch = bpi.IsLastBatch, Tables = bpi.Tables }; httpMessage.ApplyChanges.InMemory = changes.InMemory; httpMessage.ApplyChanges.BatchIndex = bpi.Index; //Post request and get response var httpMessageResponse = await this.httpRequestHandler.ProcessRequest(context, httpMessage, cancellationToken); // Clear surrogate httpMessage.ApplyChanges.Set.Dispose(); httpMessage.ApplyChanges.Set = null; if (httpMessageResponse == null) { throw new Exception("Can't have an empty body"); } syncContext = httpMessageResponse.SyncContext; changesStatistics = httpMessageResponse.ApplyChanges.ChangesStatistics; } return(syncContext, changesStatistics); }
public async Task <(SyncContext, BatchInfo, ChangesStatistics)> GetChangeBatchAsync(SyncContext context, ScopeInfo scopeInfo) { // While we have an other batch to process var isLastBatch = false; // Create the BatchInfo and SyncContext to return at the end BatchInfo changes = new BatchInfo(); changes.Directory = BatchInfo.GenerateNewDirectoryName(); SyncContext syncContext = null; ChangesStatistics changesStatistics = null; while (!isLastBatch) { HttpMessage httpMessage = new HttpMessage(); httpMessage.SyncContext = context; httpMessage.Step = HttpStep.GetChangeBatch; httpMessage.GetChangeBatch = new HttpGetChangeBatchMessage { ScopeInfo = scopeInfo, BatchIndexRequested = changes.BatchIndex }; var httpMessageResponse = await this.httpRequestHandler.ProcessRequest(context, httpMessage, cancellationToken); if (httpMessageResponse == null) { throw new Exception("Can't have an empty body"); } if (httpMessageResponse.GetChangeBatch == null) { throw new Exception("Can't have an empty GetChangeBatch"); } changesStatistics = httpMessageResponse.GetChangeBatch.ChangesStatistics; changes.InMemory = httpMessageResponse.GetChangeBatch.InMemory; syncContext = httpMessageResponse.SyncContext; // get the bpi and add it to the BatchInfo var bpi = httpMessageResponse.GetChangeBatch.BatchPartInfo; if (bpi != null) { changes.BatchIndex = bpi.Index; changes.BatchPartsInfo.Add(bpi); isLastBatch = bpi.IsLastBatch; } else { changes.BatchIndex = 0; isLastBatch = true; // break the while { } story break; } if (changes.InMemory) { // load the DmSet in memory bpi.Set = httpMessageResponse.GetChangeBatch.Set.ConvertToDmSet(); } else { // Serialize the file ! var bpId = BatchInfo.GenerateNewFileName(changes.BatchIndex.ToString()); var fileName = Path.Combine(this.serviceConfiguration.BatchDirectory, changes.Directory, bpId); BatchPart.Serialize(httpMessageResponse.GetChangeBatch.Set, fileName); bpi.FileName = fileName; } // Clear the DmSetSurrogate from response, we don't need it anymore httpMessageResponse.GetChangeBatch.Set.Dispose(); httpMessageResponse.GetChangeBatch.Set = null; // if not last, increment batchIndex for next request if (!isLastBatch) { changes.BatchIndex++; } } return(syncContext, changes, changesStatistics); }