Sonarr/NzbDrone.Services/NzbDrone.Services.Service/Exceptions/ExceptionRepository.cs

92 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 ExceptionRepository()
{
}
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);
}
}
}