mirror of
https://github.com/Sonarr/Sonarr
synced 2025-01-05 15:02:21 +00:00
88 lines
3.3 KiB
C#
88 lines
3.3 KiB
C#
|
using System;
|
|||
|
using System.Linq;
|
|||
|
using MongoDB.Driver;
|
|||
|
using MongoDB.Driver.Builders;
|
|||
|
|
|||
|
namespace NzbDrone.Services.Service.Exceptions
|
|||
|
{
|
|||
|
public class ExceptionRepository
|
|||
|
{
|
|||
|
private readonly MongoDatabase _mongoDb;
|
|||
|
|
|||
|
public ExceptionRepository(MongoDatabase mongoDb)
|
|||
|
{
|
|||
|
_mongoDb = mongoDb;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public virtual string Store(NzbDrone.Services.Service.Exceptions.ExceptionReport exceptionReport)
|
|||
|
{
|
|||
|
var hash = GetExceptionDetailId(exceptionReport);
|
|||
|
|
|||
|
var exceptionInstance = new NzbDrone.Services.Service.Exceptions.ExceptionInstance
|
|||
|
{
|
|||
|
AppVersion = exceptionReport.AppVersion,
|
|||
|
ExceptionMessage = exceptionReport.ExceptionMessage,
|
|||
|
Message = exceptionReport.Message,
|
|||
|
Time = DateTime.UtcNow,
|
|||
|
UserId = exceptionReport.Uid
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
var applicationExceptions = _mongoDb.GetCollection(exceptionReport.ApplicationId);
|
|||
|
|
|||
|
applicationExceptions.Update(Query.EQ("_id", hash), Update.PushWrapped("inst", exceptionInstance));
|
|||
|
|
|||
|
return hash;
|
|||
|
}
|
|||
|
|
|||
|
private string GetExceptionDetailId(NzbDrone.Services.Service.Exceptions.ExceptionReport exceptionReport)
|
|||
|
{
|
|||
|
var hash = Hash(String.Concat(exceptionReport.AppVersion, exceptionReport.Location, exceptionReport.ExceptionType, exceptionReport.Stack));
|
|||
|
|
|||
|
if (!ExceptionInfoExists(exceptionReport.ApplicationId, hash))
|
|||
|
{
|
|||
|
var exceptionInfo = new NzbDrone.Services.Service.Exceptions.ExceptionInfo
|
|||
|
{
|
|||
|
Hash = hash,
|
|||
|
Stack = exceptionReport.Stack,
|
|||
|
ExceptionType = exceptionReport.ExceptionType,
|
|||
|
Location = exceptionReport.Location
|
|||
|
};
|
|||
|
|
|||
|
_mongoDb.GetCollection(exceptionReport.ApplicationId).Insert(exceptionInfo);
|
|||
|
}
|
|||
|
|
|||
|
return hash;
|
|||
|
}
|
|||
|
|
|||
|
public bool ExceptionInfoExists(string applicationId, string hash)
|
|||
|
{
|
|||
|
var appCollection = _mongoDb.GetCollection(applicationId);
|
|||
|
return appCollection.FindAs<NzbDrone.Services.Service.Exceptions.ExceptionInfo>(Query.EQ("_id", hash)).Any();
|
|||
|
}
|
|||
|
|
|||
|
private static string Hash(string input)
|
|||
|
{
|
|||
|
uint mCrc = 0xffffffff;
|
|||
|
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input);
|
|||
|
foreach (byte myByte in bytes)
|
|||
|
{
|
|||
|
mCrc ^= ((uint)(myByte) << 24);
|
|||
|
for (var i = 0; i < 8; i++)
|
|||
|
{
|
|||
|
if ((Convert.ToUInt32(mCrc) & 0x80000000) == 0x80000000)
|
|||
|
{
|
|||
|
mCrc = (mCrc << 1) ^ 0x04C11DB7;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
mCrc <<= 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return String.Format("{0:x8}", mCrc);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|