示例#1
0
        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;
            }
        }
示例#4
0
 /// <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);
                }));
            }
        }
示例#7
0
 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());
 }
示例#8
0
        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;
            }
        }
示例#9
0
        /// <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);
                }
            }
        }
示例#10
0
        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;
        }
示例#11
0
        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);
            }));
        }
示例#12
0
        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);
                }));
            }
        }