/// <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); }
/// <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(); } }
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); })); } }
/// <summary> /// Get database size /// </summary> /// <returns></returns> public long GetDatabaseSize() { return(BacktraceDatabaseContext.GetSize()); }
/// <summary> /// Detect all orphaned minidump and files /// </summary> private void RemoveOrphaned() { var records = BacktraceDatabaseContext.Get(); BacktraceDatabaseFileContext.RemoveOrphaned(records); }
/// <summary> /// Get total number of records in database /// </summary> /// <returns>Total number of records</returns> internal int Count() { return(BacktraceDatabaseContext.Count()); }
/// <summary> /// Delete single record from database /// </summary> /// <param name="record">Record to delete</param> public void Delete(BacktraceDatabaseRecord record) { BacktraceDatabaseContext?.Delete(record); }
/// <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>()); }
/// <summary> /// Delete all existing files and directories in current database directory /// </summary> public void Clear() { BacktraceDatabaseContext?.Clear(); BacktraceDatabaseFileContext?.Clear(); }
/// <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); }
/// <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); }