Async async async improvements.

This commit is contained in:
tidusjar 2016-07-29 16:50:35 +01:00
parent 236024e4ae
commit b3e90c7a7f
19 changed files with 785 additions and 755 deletions

View file

@ -33,13 +33,13 @@ namespace PlexRequests.Api
{ {
public static class RetryHandler public static class RetryHandler
{ {
private static readonly TimeSpan[] DefaultTime = { TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) }; private static readonly TimeSpan[] DefaultRetryTime = { TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) };
public static T Execute<T>(Func<T> action, TimeSpan[] timeSpan = null) public static T Execute<T>(Func<T> action, TimeSpan[] timeSpan = null)
{ {
if (timeSpan == null) if (timeSpan == null)
{ {
timeSpan = DefaultTime; timeSpan = DefaultRetryTime;
} }
var policy = RetryAndWaitPolicy(timeSpan); var policy = RetryAndWaitPolicy(timeSpan);
@ -50,7 +50,7 @@ namespace PlexRequests.Api
{ {
if (timeSpan == null) if (timeSpan == null)
{ {
timeSpan = DefaultTime; timeSpan = DefaultRetryTime;
} }
var policy = RetryAndWaitPolicy(action, timeSpan); var policy = RetryAndWaitPolicy(action, timeSpan);
@ -61,7 +61,7 @@ namespace PlexRequests.Api
{ {
if (timeSpan == null) if (timeSpan == null)
{ {
timeSpan = DefaultTime; timeSpan = DefaultRetryTime;
} }
var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan, (e, ts) => action()); var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan, (e, ts) => action());
@ -72,7 +72,7 @@ namespace PlexRequests.Api
{ {
if (timeSpan == null) if (timeSpan == null)
{ {
timeSpan = DefaultTime; timeSpan = DefaultRetryTime;
} }
var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan); var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan);
@ -83,7 +83,7 @@ namespace PlexRequests.Api
{ {
if (timeSpan == null) if (timeSpan == null)
{ {
timeSpan = DefaultTime; timeSpan = DefaultRetryTime;
} }
var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan, action); var policy = Policy.Handle<Exception>().WaitAndRetry(timeSpan, action);

View file

@ -30,6 +30,7 @@ using System.Collections.Generic;
using NUnit.Framework; using NUnit.Framework;
using PlexRequests.Core.Models; using PlexRequests.Core.Models;
using PlexRequests.Core.Notification;
using PlexRequests.Core.SettingModels; using PlexRequests.Core.SettingModels;
namespace PlexRequests.Core.Tests namespace PlexRequests.Core.Tests
@ -43,7 +44,7 @@ namespace PlexRequests.Core.Tests
var n = new NotificationMessageResolver(); var n = new NotificationMessageResolver();
var s = new NotificationSettings var s = new NotificationSettings
{ {
Message = new List<NotificationMessage> { new NotificationMessage { NotificationType = NotificationType.NewRequest, Body = body } } Message = new List<Notification.NotificationMessage> { new Notification.NotificationMessage { NotificationType = NotificationType.NewRequest, Body = body } }
}; };
var result = n.ParseMessage(s, NotificationType.NewRequest, param); var result = n.ParseMessage(s, NotificationType.NewRequest, param);
@ -56,7 +57,7 @@ namespace PlexRequests.Core.Tests
var n = new NotificationMessageResolver(); var n = new NotificationMessageResolver();
var s = new NotificationSettings var s = new NotificationSettings
{ {
Message = new List<NotificationMessage> { new NotificationMessage { NotificationType = NotificationType.NewRequest, Subject = subject }} Message = new List<Notification.NotificationMessage> { new Notification.NotificationMessage { NotificationType = NotificationType.NewRequest, Subject = subject }}
}; };
var result = n.ParseMessage(s, NotificationType.NewRequest, param); var result = n.ParseMessage(s, NotificationType.NewRequest, param);

View file

@ -53,7 +53,7 @@ namespace PlexRequests.Core
model.Id = id; model.Id = id;
entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = id }; entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = id };
var result = await Repo.UpdateAsync(entity); var result = await Repo.UpdateAsync(entity).ConfigureAwait(false);
return result ? id : -1; return result ? id : -1;
} }
@ -61,21 +61,21 @@ namespace PlexRequests.Core
public async Task<bool> UpdateIssueAsync(IssuesModel model) public async Task<bool> UpdateIssueAsync(IssuesModel model)
{ {
var entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = model.Id }; var entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = model.Id };
return await Repo.UpdateAsync(entity); return await Repo.UpdateAsync(entity).ConfigureAwait(false);
} }
public async Task DeleteIssueAsync(int id) public async Task DeleteIssueAsync(int id)
{ {
var entity = await Repo.GetAsync(id); var entity = await Repo.GetAsync(id);
await Repo.DeleteAsync(entity); await Repo.DeleteAsync(entity).ConfigureAwait(false);
} }
public async Task DeleteIssueAsync(IssuesModel model) public async Task DeleteIssueAsync(IssuesModel model)
{ {
var entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = model.Id }; var entity = new IssueBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), RequestId = model.RequestId, Id = model.Id };
await Repo.DeleteAsync(entity); await Repo.DeleteAsync(entity).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -101,7 +101,7 @@ namespace PlexRequests.Core
/// <returns></returns> /// <returns></returns>
public async Task<IEnumerable<IssuesModel>> GetAllAsync() public async Task<IEnumerable<IssuesModel>> GetAllAsync()
{ {
var blobs = await Repo.GetAllAsync(); var blobs = await Repo.GetAllAsync().ConfigureAwait(false);
if (blobs == null) if (blobs == null)
{ {

View file

@ -61,12 +61,12 @@ namespace PlexRequests.Core
public async Task<int> AddRequestAsync(RequestedModel model) public async Task<int> AddRequestAsync(RequestedModel model)
{ {
var entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId }; var entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId };
var id = await Repo.InsertAsync(entity); var id = await Repo.InsertAsync(entity).ConfigureAwait(false);
model.Id = id; model.Id = id;
entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId, Id = id, MusicId = model.MusicBrainzId }; entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId, Id = id, MusicId = model.MusicBrainzId };
var result = await Repo.UpdateAsync(entity); var result = await Repo.UpdateAsync(entity).ConfigureAwait(false);
return result ? id : -1; return result ? id : -1;
} }
@ -80,7 +80,7 @@ namespace PlexRequests.Core
public async Task<RequestedModel> CheckRequestAsync(int providerId) public async Task<RequestedModel> CheckRequestAsync(int providerId)
{ {
var blobs = await Repo.GetAllAsync(); var blobs = await Repo.GetAllAsync().ConfigureAwait(false);
var blob = blobs.FirstOrDefault(x => x.ProviderId == providerId); var blob = blobs.FirstOrDefault(x => x.ProviderId == providerId);
return blob != null ? ByteConverterHelper.ReturnObject<RequestedModel>(blob.Content) : null; return blob != null ? ByteConverterHelper.ReturnObject<RequestedModel>(blob.Content) : null;
} }
@ -94,7 +94,7 @@ namespace PlexRequests.Core
public async Task<RequestedModel> CheckRequestAsync(string musicId) public async Task<RequestedModel> CheckRequestAsync(string musicId)
{ {
var blobs = await Repo.GetAllAsync(); var blobs = await Repo.GetAllAsync().ConfigureAwait(false);
var blob = blobs.FirstOrDefault(x => x.MusicId == musicId); var blob = blobs.FirstOrDefault(x => x.MusicId == musicId);
return blob != null ? ByteConverterHelper.ReturnObject<RequestedModel>(blob.Content) : null; return blob != null ? ByteConverterHelper.ReturnObject<RequestedModel>(blob.Content) : null;
} }
@ -107,8 +107,8 @@ namespace PlexRequests.Core
public async Task DeleteRequestAsync(RequestedModel request) public async Task DeleteRequestAsync(RequestedModel request)
{ {
var blob = await Repo.GetAsync(request.Id); var blob = await Repo.GetAsync(request.Id).ConfigureAwait(false);
await Repo.DeleteAsync(blob); await Repo.DeleteAsync(blob).ConfigureAwait(false);
} }
public bool UpdateRequest(RequestedModel model) public bool UpdateRequest(RequestedModel model)
@ -120,7 +120,7 @@ namespace PlexRequests.Core
public async Task<bool> UpdateRequestAsync(RequestedModel model) public async Task<bool> UpdateRequestAsync(RequestedModel model)
{ {
var entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId, Id = model.Id }; var entity = new RequestBlobs { Type = model.Type, Content = ByteConverterHelper.ReturnBytes(model), ProviderId = model.ProviderId, Id = model.Id };
return await Repo.UpdateAsync(entity); return await Repo.UpdateAsync(entity).ConfigureAwait(false);
} }
public RequestedModel Get(int id) public RequestedModel Get(int id)
@ -136,7 +136,7 @@ namespace PlexRequests.Core
public async Task<RequestedModel> GetAsync(int id) public async Task<RequestedModel> GetAsync(int id)
{ {
var blob = await Repo.GetAsync(id); var blob = await Repo.GetAsync(id).ConfigureAwait(false);
if (blob == null) if (blob == null)
{ {
return new RequestedModel(); return new RequestedModel();
@ -155,7 +155,7 @@ namespace PlexRequests.Core
public async Task<IEnumerable<RequestedModel>> GetAllAsync() public async Task<IEnumerable<RequestedModel>> GetAllAsync()
{ {
var blobs = await Repo.GetAllAsync(); var blobs = await Repo.GetAllAsync().ConfigureAwait(false);
return blobs.Select(b => Encoding.UTF8.GetString(b.Content)) return blobs.Select(b => Encoding.UTF8.GetString(b.Content))
.Select(JsonConvert.DeserializeObject<RequestedModel>) .Select(JsonConvert.DeserializeObject<RequestedModel>)
.ToList(); .ToList();
@ -169,7 +169,7 @@ namespace PlexRequests.Core
public async Task<bool> BatchUpdateAsync(IEnumerable<RequestedModel> model) public async Task<bool> BatchUpdateAsync(IEnumerable<RequestedModel> model)
{ {
var entities = model.Select(m => new RequestBlobs { Type = m.Type, Content = ByteConverterHelper.ReturnBytes(m), ProviderId = m.ProviderId, Id = m.Id }).ToList(); var entities = model.Select(m => new RequestBlobs { Type = m.Type, Content = ByteConverterHelper.ReturnBytes(m), ProviderId = m.ProviderId, Id = m.Id }).ToList();
return await Repo.UpdateAllAsync(entities); return await Repo.UpdateAllAsync(entities).ConfigureAwait(false);
} }
public bool BatchDelete(IEnumerable<RequestedModel> model) public bool BatchDelete(IEnumerable<RequestedModel> model)
{ {
@ -180,7 +180,7 @@ namespace PlexRequests.Core
public async Task<bool> BatchDeleteAsync(IEnumerable<RequestedModel> model) public async Task<bool> BatchDeleteAsync(IEnumerable<RequestedModel> model)
{ {
var entities = model.Select(m => new RequestBlobs { Type = m.Type, Content = ByteConverterHelper.ReturnBytes(m), ProviderId = m.ProviderId, Id = m.Id }).ToList(); var entities = model.Select(m => new RequestBlobs { Type = m.Type, Content = ByteConverterHelper.ReturnBytes(m), ProviderId = m.ProviderId, Id = m.Id }).ToList();
return await Repo.DeleteAllAsync(entities); return await Repo.DeleteAllAsync(entities).ConfigureAwait(false);
} }
} }
} }

View file

@ -26,7 +26,7 @@
#endregion #endregion
using PlexRequests.Core.Models; using PlexRequests.Core.Models;
namespace PlexRequests.Core namespace PlexRequests.Core.Notification
{ {
public class NotificationMessage public class NotificationMessage
{ {

View file

@ -24,7 +24,7 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/ // ************************************************************************/
#endregion #endregion
namespace PlexRequests.Core namespace PlexRequests.Core.Notification
{ {
public class NotificationMessageContent public class NotificationMessageContent
{ {

View file

@ -24,10 +24,9 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/ // ************************************************************************/
#endregion #endregion
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace PlexRequests.Core namespace PlexRequests.Core.Notification
{ {
public class NotificationMessageCurlys public class NotificationMessageCurlys
{ {

View file

@ -30,12 +30,27 @@ using System.Linq;
using PlexRequests.Core.Models; using PlexRequests.Core.Models;
using PlexRequests.Core.SettingModels; using PlexRequests.Core.SettingModels;
namespace PlexRequests.Core namespace PlexRequests.Core.Notification
{ {
public class NotificationMessageResolver public class NotificationMessageResolver
{ {
/// <summary>
/// The start character '{'
/// </summary>
private const char StartChar = (char)123; private const char StartChar = (char)123;
/// <summary>
/// The end character '}'
/// </summary>
private const char EndChar = (char)125; private const char EndChar = (char)125;
/// <summary>
/// Parses the message.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="notification">The notification.</param>
/// <param name="type">The type.</param>
/// <param name="c">The c.</param>
/// <returns></returns>
public NotificationMessageContent ParseMessage<T>(T notification, NotificationType type, NotificationMessageCurlys c) where T : NotificationSettings public NotificationMessageContent ParseMessage<T>(T notification, NotificationType type, NotificationMessageCurlys c) where T : NotificationSettings
{ {
var content = notification.Message.FirstOrDefault(x => x.NotificationType == type); var content = notification.Message.FirstOrDefault(x => x.NotificationType == type);
@ -47,33 +62,30 @@ namespace PlexRequests.Core
return Resolve(content.Body, content.Subject, c.Curlys); return Resolve(content.Body, content.Subject, c.Curlys);
} }
private NotificationMessageContent Resolve(string body, string subject, Dictionary<string, string> paramaters) /// <summary>
/// Resolves the specified message curly fields.
/// </summary>
/// <param name="body">The body.</param>
/// <param name="subject">The subject.</param>
/// <param name="parameters">The parameters.</param>
/// <returns></returns>
private NotificationMessageContent Resolve(string body, string subject, IReadOnlyDictionary<string, string> parameters)
{ {
// Find the fields
var bodyFields = FindCurlyFields(body); var bodyFields = FindCurlyFields(body);
var subjectFields = FindCurlyFields(subject); var subjectFields = FindCurlyFields(subject);
foreach (var f in bodyFields) body = ReplaceFields(bodyFields, parameters, body);
{ subject = ReplaceFields(subjectFields, parameters, subject);
string outString;
if (paramaters.TryGetValue(f, out outString))
{
body = body.Replace($"{{{f}}}", outString);
}
}
foreach (var s in subjectFields)
{
string outString;
if (paramaters.TryGetValue(s, out outString))
{
subject = subject.Replace($"{{{s}}}", outString);
}
}
return new NotificationMessageContent { Body = body ?? string.Empty, Subject = subject ?? string.Empty }; return new NotificationMessageContent { Body = body ?? string.Empty, Subject = subject ?? string.Empty };
} }
/// <summary>
/// Finds the curly fields.
/// </summary>
/// <param name="message">The message.</param>
/// <returns></returns>
private IEnumerable<string> FindCurlyFields(string message) private IEnumerable<string> FindCurlyFields(string message)
{ {
if (string.IsNullOrEmpty(message)) if (string.IsNullOrEmpty(message))
@ -116,5 +128,25 @@ namespace PlexRequests.Core
return fields; return fields;
} }
/// <summary>
/// Replaces the fields.
/// </summary>
/// <param name="fields">The fields.</param>
/// <param name="parameters">The parameters.</param>
/// <param name="mainText">The main text.</param>
/// <returns></returns>
private string ReplaceFields(IEnumerable<string> fields, IReadOnlyDictionary<string, string> parameters, string mainText)
{
foreach (var field in fields)
{
string outString;
if (parameters.TryGetValue(field, out outString))
{
mainText = mainText.Replace($"{{{field}}}", outString);
}
}
return mainText;
}
} }
} }

View file

@ -67,10 +67,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="CacheKeys.cs" /> <Compile Include="CacheKeys.cs" />
<Compile Include="NotificationMessage.cs" /> <Compile Include="Notification\NotificationMessage.cs" />
<Compile Include="NotificationMessageContent.cs" /> <Compile Include="Notification\NotificationMessageContent.cs" />
<Compile Include="NotificationMessageCurlys.cs" /> <Compile Include="Notification\NotificationMessageCurlys.cs" />
<Compile Include="NotificationMessageResolver.cs" /> <Compile Include="Notification\NotificationMessageResolver.cs" />
<Compile Include="IIssueService.cs" /> <Compile Include="IIssueService.cs" />
<Compile Include="IRequestService.cs" /> <Compile Include="IRequestService.cs" />
<Compile Include="ISettingsService.cs" /> <Compile Include="ISettingsService.cs" />
@ -130,6 +130,7 @@
<Name>PlexRequests.Store</Name> <Name>PlexRequests.Store</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -27,6 +27,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using PlexRequests.Core.Models; using PlexRequests.Core.Models;
using PlexRequests.Core.Notification;
namespace PlexRequests.Core.SettingModels namespace PlexRequests.Core.SettingModels
{ {
@ -40,21 +41,15 @@ namespace PlexRequests.Core.SettingModels
new NotificationMessage { NotificationType = NotificationType.Issue }, new NotificationMessage { NotificationType = NotificationType.Issue },
new NotificationMessage { NotificationType = NotificationType.AdminNote }, new NotificationMessage { NotificationType = NotificationType.AdminNote },
new NotificationMessage { NotificationType = NotificationType.RequestApproved }, new NotificationMessage { NotificationType = NotificationType.RequestApproved },
new NotificationMessage { NotificationType = NotificationType.RequestAvailable }, new NotificationMessage { NotificationType = NotificationType.RequestAvailable }
}; };
} }
public List<NotificationMessage> Message { get; set; } public List<NotificationMessage> Message { get; set; }
} }
public static class NotificationCurly public static class NotificationCurly
{ {
public static readonly List<string> Curlys = new List<string> public static readonly List<string> Curlys = new List<string> { "Username", "Title", "Date", "Issue", "Type" };
{
"Username",
"Title",
"Date",
"Issue",
"Type"
};
} }
} }

View file

@ -65,7 +65,7 @@ namespace PlexRequests.Core
public async Task<T> GetSettingsAsync() public async Task<T> GetSettingsAsync()
{ {
var result = await Repo.GetAsync(EntityName); var result = await Repo.GetAsync(EntityName).ConfigureAwait(false);
if (result == null) if (result == null)
{ {
return new T(); return new T();
@ -110,7 +110,7 @@ namespace PlexRequests.Core
var settings = new GlobalSettings { SettingsName = EntityName, Content = JsonConvert.SerializeObject(newEntity, SerializerSettings.Settings) }; var settings = new GlobalSettings { SettingsName = EntityName, Content = JsonConvert.SerializeObject(newEntity, SerializerSettings.Settings) };
settings.Content = EncryptSettings(settings); settings.Content = EncryptSettings(settings);
var insertResult = await Repo.InsertAsync(settings); var insertResult = await Repo.InsertAsync(settings).ConfigureAwait(false);
return insertResult != int.MinValue; return insertResult != int.MinValue;
} }
@ -120,7 +120,7 @@ namespace PlexRequests.Core
var globalSettings = new GlobalSettings { SettingsName = EntityName, Content = JsonConvert.SerializeObject(modified, SerializerSettings.Settings), Id = entity.Id }; var globalSettings = new GlobalSettings { SettingsName = EntityName, Content = JsonConvert.SerializeObject(modified, SerializerSettings.Settings), Id = entity.Id };
globalSettings.Content = EncryptSettings(globalSettings); globalSettings.Content = EncryptSettings(globalSettings);
var result = await Repo.UpdateAsync(globalSettings); var result = await Repo.UpdateAsync(globalSettings).ConfigureAwait(false);
return result; return result;
} }

View file

@ -41,7 +41,7 @@ namespace PlexRequests.Helpers
/// <returns></returns> /// <returns></returns>
public static string GetAnalyticClientId(IDictionary<string, string> cookies) public static string GetAnalyticClientId(IDictionary<string, string> cookies)
{ {
var outString = string.Empty; string outString;
if (cookies.TryGetValue(GaCookie, out outString)) if (cookies.TryGetValue(GaCookie, out outString))
{ {

View file

@ -98,7 +98,7 @@ namespace PlexRequests.Store.Repository
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
await db.DeleteAsync(entity); await db.DeleteAsync(entity).ConfigureAwait(false);
} }
} }
catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt) catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt)
@ -134,7 +134,7 @@ namespace PlexRequests.Store.Repository
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
return await db.UpdateAsync(entity); return await db.UpdateAsync(entity).ConfigureAwait(false);
} }
} }
catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt) catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt)
@ -173,16 +173,17 @@ namespace PlexRequests.Store.Repository
try try
{ {
ResetCache(); ResetCache();
var result = new HashSet<bool>(); var tasks = new List<Task<bool>>();
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
foreach (var e in entity) foreach (var e in entity)
{ {
result.Add(await db.UpdateAsync(e)); tasks.Add(db.UpdateAsync(e));
} }
} }
var result = await Task.WhenAll(tasks).ConfigureAwait(false);
return result.All(x => true); return result.All(x => true);
} }
catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt) catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt)
@ -200,7 +201,7 @@ namespace PlexRequests.Store.Repository
using (var cnn = Config.DbConnection()) using (var cnn = Config.DbConnection())
{ {
cnn.Open(); cnn.Open();
return await cnn.InsertAsync(entity); return await cnn.InsertAsync(entity).ConfigureAwait(false);
} }
} }
catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt) catch (SqliteException e) when (e.ErrorCode == SQLiteErrorCode.Corrupt)
@ -240,7 +241,7 @@ namespace PlexRequests.Store.Repository
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
var result = await db.GetAllAsync<T>(); var result = await db.GetAllAsync<T>().ConfigureAwait(false);
return result; return result;
} }
} }

View file

@ -28,11 +28,9 @@
#endregion #endregion
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Dapper.Contrib.Extensions; using Dapper.Contrib.Extensions;
using NLog;
using PlexRequests.Helpers; using PlexRequests.Helpers;
namespace PlexRequests.Store.Repository namespace PlexRequests.Store.Repository
@ -81,7 +79,7 @@ namespace PlexRequests.Store.Repository
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
return await db.GetAsync<T>(id); return await db.GetAsync<T>(id).ConfigureAwait(false);
} }
}); });
return item; return item;

View file

@ -62,7 +62,7 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
var id = await con.InsertAsync(entity); var id = await con.InsertAsync(entity).ConfigureAwait(false);
return id; return id;
} }
} }
@ -88,7 +88,7 @@ namespace PlexRequests.Store.Repository
{ {
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
var page = await con.GetAllAsync<RequestBlobs>(); var page = await con.GetAllAsync<RequestBlobs>().ConfigureAwait(false);
return page; return page;
} }
}, 5); }, 5);
@ -116,7 +116,7 @@ namespace PlexRequests.Store.Repository
{ {
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
var page = await con.GetAsync<RequestBlobs>(id); var page = await con.GetAsync<RequestBlobs>(id).ConfigureAwait(false);
return page; return page;
} }
}, 5); }, 5);
@ -137,22 +137,24 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
return await con.DeleteAsync(entity); return await con.DeleteAsync(entity).ConfigureAwait(false);
} }
} }
public async Task<bool> DeleteAllAsync(IEnumerable<RequestBlobs> entity) public async Task<bool> DeleteAllAsync(IEnumerable<RequestBlobs> entity)
{ {
ResetCache(); ResetCache();
var result = new HashSet<bool>(); var tasks = new List<Task<bool>>();
using (var db = Db.DbConnection()) using (var db = Db.DbConnection())
{ {
db.Open(); db.Open();
foreach (var e in entity) foreach (var e in entity)
{ {
result.Add(await db.DeleteAsync(e)); tasks.Add(db.DeleteAsync(e));
} }
} }
var result = await Task.WhenAll(tasks).ConfigureAwait(false);
return result.All(x => true); return result.All(x => true);
} }
@ -170,7 +172,7 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
return await con.UpdateAsync(entity); return await con.UpdateAsync(entity).ConfigureAwait(false);
} }
} }
@ -198,15 +200,16 @@ namespace PlexRequests.Store.Repository
public async Task<bool> UpdateAllAsync(IEnumerable<RequestBlobs> entity) public async Task<bool> UpdateAllAsync(IEnumerable<RequestBlobs> entity)
{ {
ResetCache(); ResetCache();
var result = new HashSet<bool>(); var tasks = new List<Task<bool>>();
using (var db = Db.DbConnection()) using (var db = Db.DbConnection())
{ {
db.Open(); db.Open();
foreach (var e in entity) foreach (var e in entity)
{ {
result.Add(await db.UpdateAsync(e)); tasks.Add(db.UpdateAsync(e));
} }
} }
var result = await Task.WhenAll(tasks).ConfigureAwait(false);
return result.All(x => true); return result.All(x => true);
} }

View file

@ -36,9 +36,9 @@ namespace PlexRequests.Store.Repository
{ {
public class SettingsJsonRepository : ISettingsRepository public class SettingsJsonRepository : ISettingsRepository
{ {
private ICacheProvider Cache { get; set; } private ICacheProvider Cache { get; }
private string TypeName { get; set; } private string TypeName { get; }
public SettingsJsonRepository(ISqliteConfiguration config, ICacheProvider cacheProvider) public SettingsJsonRepository(ISqliteConfiguration config, ICacheProvider cacheProvider)
{ {
Db = config; Db = config;
@ -46,7 +46,7 @@ namespace PlexRequests.Store.Repository
TypeName = typeof(SettingsJsonRepository).Name; TypeName = typeof(SettingsJsonRepository).Name;
} }
private ISqliteConfiguration Db { get; set; } private ISqliteConfiguration Db { get; }
public long Insert(GlobalSettings entity) public long Insert(GlobalSettings entity)
{ {
@ -62,7 +62,7 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
return await con.InsertAsync(entity); return await con.InsertAsync(entity).ConfigureAwait(false);
} }
} }
@ -87,7 +87,7 @@ namespace PlexRequests.Store.Repository
{ {
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
var page = await con.GetAllAsync<GlobalSettings>(); var page = await con.GetAllAsync<GlobalSettings>().ConfigureAwait(false);
return page; return page;
} }
}, 5); }, 5);
@ -115,7 +115,7 @@ namespace PlexRequests.Store.Repository
{ {
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
var page = await con.GetAllAsync<GlobalSettings>(); var page = await con.GetAllAsync<GlobalSettings>().ConfigureAwait(false);
return page.SingleOrDefault(x => x.SettingsName == settingsName); return page.SingleOrDefault(x => x.SettingsName == settingsName);
} }
}, 5); }, 5);
@ -127,7 +127,7 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
return await con.DeleteAsync(entity); return await con.DeleteAsync(entity).ConfigureAwait(false);
} }
} }
@ -136,7 +136,7 @@ namespace PlexRequests.Store.Repository
ResetCache(); ResetCache();
using (var con = Db.DbConnection()) using (var con = Db.DbConnection())
{ {
return await con.UpdateAsync(entity); return await con.UpdateAsync(entity).ConfigureAwait(false);
} }
} }

View file

@ -67,7 +67,7 @@ namespace PlexRequests.Store
using (var db = Config.DbConnection()) using (var db = Config.DbConnection())
{ {
db.Open(); db.Open();
var result = await db.GetAllAsync<T>(); var result = await db.GetAllAsync<T>().ConfigureAwait(false);
var selected = result.FirstOrDefault(x => x.UserGuid == id); var selected = result.FirstOrDefault(x => x.UserGuid == id);
return selected; return selected;
} }