private void SendData(BacktraceDatabaseRecord record) { var backtraceData = record?.BacktraceData; //meanwhile someone delete data from a disk if (backtraceData == null || backtraceData.Report == null) { Delete(record); } else { StartCoroutine( BacktraceApi.Send(backtraceData, (BacktraceResult sendResult) => { if (sendResult.Status == BacktraceResultStatus.Ok) { Delete(record); } else { record.Dispose(); BacktraceDatabaseContext.IncrementBatchRetry(); } record = BacktraceDatabaseContext.FirstOrDefault(); SendData(record); })); } }
private void FlushRecord(BacktraceDatabaseRecord record) { if (record == null) { return; } var stopWatch = Configuration.PerformanceStatistics ? new System.Diagnostics.Stopwatch() : System.Diagnostics.Stopwatch.StartNew(); var backtraceData = record.BacktraceDataJson(); Delete(record); var queryAttributes = new Dictionary <string, string>(); if (Configuration.PerformanceStatistics) { stopWatch.Stop(); queryAttributes["performance.database.flush"] = stopWatch.GetMicroseconds(); } if (backtraceData == null) { return; } queryAttributes["_mod_duplicate"] = record.Count.ToString(); StartCoroutine( BacktraceApi.Send(backtraceData, record.Attachments, queryAttributes, (BacktraceResult result) => { record = BacktraceDatabaseContext.FirstOrDefault(); FlushRecord(record); })); }
/// <summary> /// Backtrace database update event /// </summary> private void Update() { if (!Enable) { return; } LastFrameTime = Time.time; if (!DatabaseSettings.AutoSendMode) { return; } if (Time.time - _lastConnection > DatabaseSettings.RetryInterval) { _lastConnection = Time.time; if (_timerBackgroundWork || !BacktraceDatabaseContext.Any()) { return; } _timerBackgroundWork = true; SendData(BacktraceDatabaseContext.FirstOrDefault()); _timerBackgroundWork = false; } }
/// <summary> /// Send and delete all records from database /// </summary> public void Flush() { if (!_enable || !BacktraceDatabaseContext.Any()) { return; } FlushRecord(BacktraceDatabaseContext.FirstOrDefault()); }
/// <summary> /// Try to send all data from database /// </summary> public void Send() { if (!Enable || !BacktraceDatabaseContext.Any()) { return; } SendData(BacktraceDatabaseContext.FirstOrDefault()); }
private void SendData(BacktraceDatabaseRecord record) { if (record == null) { return; } var stopWatch = Configuration.PerformanceStatistics ? System.Diagnostics.Stopwatch.StartNew() : new System.Diagnostics.Stopwatch(); var backtraceData = record != null?record.BacktraceDataJson() : null; //check if report exists on hard drive // to avoid situation when someone manually remove data if (string.IsNullOrEmpty(backtraceData)) { Delete(record); } else { var queryAttributes = new Dictionary <string, string>(); if (Configuration.PerformanceStatistics) { stopWatch.Stop(); queryAttributes["performance.database.send"] = stopWatch.GetMicroseconds(); } queryAttributes["_mod_duplicate"] = record.Count.ToString(CultureInfo.InvariantCulture); StartCoroutine( BacktraceApi.Send(backtraceData, record.Attachments, queryAttributes, (BacktraceResult sendResult) => { record.Unlock(); if (sendResult.Status != BacktraceResultStatus.ServerError && sendResult.Status != BacktraceResultStatus.NetworkError) { Delete(record); } else { IncrementBatchRetry(); return; } bool shouldProcess = _reportLimitWatcher.WatchReport(DateTimeHelper.Timestamp()); if (!shouldProcess) { return; } record = BacktraceDatabaseContext.FirstOrDefault(); SendData(record); })); } }
private void Start() { if (!_enable) { return; } if (DatabaseSettings.AutoSendMode) { _lastConnection = Time.time; } // load reports from hard drive LoadReports(); // remove orphaned files RemoveOrphaned(); SendData(BacktraceDatabaseContext.FirstOrDefault()); }
private void Update() { if (!_enable) { return; } if (Time.time - _lastConnection > DatabaseSettings.RetryInterval) { _lastConnection = Time.time; if (!BacktraceDatabaseContext.Any() || _timerBackgroundWork) { return; } _timerBackgroundWork = true; SendData(BacktraceDatabaseContext.FirstOrDefault()); _timerBackgroundWork = false; } }
/// <summary> /// Send and asynchronous delete all records from database /// </summary> public async Task FlushAsync() { if (BacktraceApi == null) { throw new ArgumentException("BacktraceApi is required if you want to use Flush method"); } var record = BacktraceDatabaseContext?.FirstOrDefault(); while (record != null) { var backtraceData = record.BacktraceData; Delete(record); record = BacktraceDatabaseContext.FirstOrDefault(); if (backtraceData != null) { await BacktraceApi.SendAsync(backtraceData); } } }
private async void OnTimedEventAsync(object source, ElapsedEventArgs e) { if (!BacktraceDatabaseContext.Any() || _timerBackgroundWork) { return; } _timerBackgroundWork = true; _timer.Stop(); //read first record (keep in mind LIFO and FIFO settings) from memory database var record = BacktraceDatabaseContext.FirstOrDefault(); while (record != null) { var backtraceData = record.BacktraceData; //meanwhile someone delete data from a disk if (backtraceData == null || backtraceData.Report == null) { Delete(record); } else { //send record from database to API var result = await BacktraceApi.SendAsync(backtraceData); if (result.Status == BacktraceResultStatus.Ok) { Delete(record); } else { record.Dispose(); BacktraceDatabaseContext.IncrementBatchRetry(); break; } } record = BacktraceDatabaseContext.FirstOrDefault(); } _timer.Start(); _timerBackgroundWork = false; }
private void FlushRecord(BacktraceDatabaseRecord record) { if (record == null) { return; } var backtraceData = record.BacktraceData; Delete(record); if (backtraceData == null) { return; } StartCoroutine( BacktraceApi.Send(backtraceData, (BacktraceResult result) => { record = BacktraceDatabaseContext.FirstOrDefault(); FlushRecord(record); })); }
private void SendData(BacktraceDatabaseRecord record) { var backtraceData = record != null ? record.BacktraceData : null; //check if report exists on hard drive // to avoid situation when someone manually remove data if (backtraceData == null || backtraceData.Report == null) { Delete(record); } else { StartCoroutine( BacktraceApi.Send(backtraceData, (BacktraceResult sendResult) => { if (sendResult.Status == BacktraceResultStatus.Ok) { Delete(record); } else { record.Dispose(); BacktraceDatabaseContext.IncrementBatchRetry(); return; } bool limitHit = _reportLimitWatcher.WatchReport(new DateTime().Timestamp()); if (!limitHit) { _reportLimitWatcher.DisplayReportLimitHitMessage(); return; } record = BacktraceDatabaseContext.FirstOrDefault(); SendData(record); })); } }