/// <summary>
        /// Add new report to BacktraceDatabase
        /// </summary>
        public BacktraceDatabaseRecord Add(BacktraceData data, bool @lock = true)
        {
            if (data == null || !Enable)
            {
                return(null);
            }
            //remove old reports (if database is full)
            //and check database health state
            var validationResult = ValidateDatabaseSize();

            if (!validationResult)
            {
                return(null);
            }
            var record = BacktraceDatabaseContext.Add(data);

            if (!@lock)
            {
                record.Unlock();
            }
            return(record);
        }
示例#2
0
        /// <summary>
        /// Load all records stored in database path
        /// </summary>
        private void LoadReports()
        {
            var files = BacktraceDatabaseFileContext.GetRecords();

            foreach (var file in files)
            {
                var record = BacktraceDatabaseRecord.ReadFromFile(file);
                if (!record.Valid())
                {
                    try
                    {
                        record.Delete();
                    }
                    catch (Exception)
                    {
                        Debug.LogWarning($"Cannot remove file from database. File name: {file.FullName}");
                    }
                    continue;
                }
                BacktraceDatabaseContext.Add(record);
                ValidateDatabaseSize();
                record.Dispose();
            }
        }
示例#3
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);
                }));
            }
        }
示例#4
0
 /// <summary>
 /// Get database size
 /// </summary>
 /// <returns></returns>
 public long GetDatabaseSize()
 {
     return(BacktraceDatabaseContext.GetSize());
 }
示例#5
0
        /// <summary>
        /// Detect all orphaned minidump and files
        /// </summary>
        private void RemoveOrphaned()
        {
            var records = BacktraceDatabaseContext.Get();

            BacktraceDatabaseFileContext.RemoveOrphaned(records);
        }
示例#6
0
 /// <summary>
 /// Get total number of records in database
 /// </summary>
 /// <returns>Total number of records</returns>
 internal int Count()
 {
     return(BacktraceDatabaseContext.Count());
 }
示例#7
0
 /// <summary>
 /// Delete single record from database
 /// </summary>
 /// <param name="record">Record to delete</param>
 public void Delete(BacktraceDatabaseRecord record)
 {
     BacktraceDatabaseContext?.Delete(record);
 }
示例#8
0
 /// <summary>
 /// Get all stored records in BacktraceDatabase
 /// </summary>
 /// <returns>All stored records in BacktraceDatabase</returns>
 public IEnumerable <BacktraceDatabaseRecord> Get()
 {
     return(BacktraceDatabaseContext?.Get() ?? new List <BacktraceDatabaseRecord>());
 }
示例#9
0
 /// <summary>
 /// Delete all existing files and directories in current database directory
 /// </summary>
 public void Clear()
 {
     BacktraceDatabaseContext?.Clear();
     BacktraceDatabaseFileContext?.Clear();
 }
示例#10
0
 /// <summary>
 /// Get total number of records in database
 /// </summary>
 /// <returns>Total number of records</returns>
 public int Count()
 {
     return(BacktraceDatabaseContext.Count());
 }
        /// <summary>
        /// Detect all orphaned minidump and files
        /// </summary>
        protected virtual void RemoveOrphaned()
        {
            var records = BacktraceDatabaseContext.Get();

            BacktraceDatabaseFileContext.RemoveOrphaned(records);
        }
示例#12
0
        /// <summary>
        /// Validate database size - check how many records are stored
        /// in database and how much records need space.
        /// If space or number of records are invalid
        /// database will remove old reports
        /// </summary>
        private bool ValidateDatabaseSize()
        {
            //check how many records are stored in database
            //remove in case when we want to store one more than expected number
            //If record count == 0 then we ignore this condition
            if (BacktraceDatabaseContext.Count() + 1 > DatabaseSettings.MaxRecordCount && DatabaseSettings.MaxRecordCount != 0 && !BacktraceDatabaseContext.RemoveLastRecord())
            {
                return(false);
            }

            //check database size. If database size == 0 then we ignore this condition
            //remove all records till database use enough space
            if (DatabaseSettings.MaxDatabaseSize != 0 && BacktraceDatabaseContext.GetSize() > DatabaseSettings.MaxDatabaseSize)
            {
                //if your database is entry or every record is locked
                //deletePolicyRetry avoid infinity loop
                int deletePolicyRetry = 5;
                while (BacktraceDatabaseContext.GetSize() > DatabaseSettings.MaxDatabaseSize)
                {
                    BacktraceDatabaseContext.RemoveLastRecord();
                    deletePolicyRetry--;
                    if (deletePolicyRetry != 0)
                    {
                        break;
                    }
                }
                return(deletePolicyRetry != 0);
            }
            return(true);
        }
 private bool ReachedMaximumNumberOfRecords()
 {
     return(BacktraceDatabaseContext.Count() + 1 > DatabaseSettings.MaxRecordCount && DatabaseSettings.MaxRecordCount != 0);
 }
 private bool ReachedDiskSpaceLimit()
 {
     return(DatabaseSettings.MaxDatabaseSize != 0 && BacktraceDatabaseContext.GetSize() > DatabaseSettings.MaxDatabaseSize);
 }
        /// <summary>
        /// Add new report to BacktraceDatabase
        /// </summary>
        public BacktraceDatabaseRecord Add(BacktraceData data, bool @lock = true)
        {
            if (data == null || !Enable)
            {
                return(null);
            }
            //remove old reports (if database is full)
            //and check database health state
            var validationResult = ValidateDatabaseSize();

            if (!validationResult)
            {
                return(null);
            }

            // validate if record already exists in the database object
            var hash = BacktraceDatabaseContext.GetHash(data);

            if (!string.IsNullOrEmpty(hash))
            {
                var existingRecord = BacktraceDatabaseContext.GetRecordByHash(hash);
                if (existingRecord != null)
                {
                    BacktraceDatabaseContext.AddDuplicate(existingRecord);
                    return(existingRecord);
                }
            }

            //add built-in attachments
            var attachments = BacktraceDatabaseFileContext.GenerateRecordAttachments(data);

            for (int attachmentIndex = 0; attachmentIndex < attachments.Count(); attachmentIndex++)
            {
                if (!string.IsNullOrEmpty(attachments.ElementAt(attachmentIndex)))
                {
                    data.Attachments.Add(attachments.ElementAt(attachmentIndex));
                }
            }
            // add to fresh new record breadcrumb attachment
            if (Breadcrumbs != null)
            {
                data.Attachments.Add(Breadcrumbs.GetBreadcrumbLogPath());
                data.Attributes.Attributes["breadcrumbs.lastId"] = Breadcrumbs.BreadcrumbId().ToString("F0", CultureInfo.InvariantCulture);
            }

            // now we now we're adding new unique report to database
            var record = new BacktraceDatabaseRecord(data)
            {
                Hash = hash
            };

            // save record on the hard drive and add it to database context
            var saveResult = BacktraceDatabaseFileContext.Save(record);

            if (!saveResult)
            {
                // file context won't remove json object that wasn't stored in the previous method
                // but will clean up attachments associated with this record.
                BacktraceDatabaseFileContext.Delete(record);
                return(null);
            }

            BacktraceDatabaseContext.Add(record);
            if (!@lock)
            {
                record.Unlock();
            }

            return(record);
        }