aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs66
1 files changed, 44 insertions, 22 deletions
diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
index d20b59035..284ef10fb 100644
--- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Configuration;
+using System.Data.SQLite;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
@@ -19,6 +20,8 @@ namespace MediaBrowser.Server.Implementations.Sqlite
{
private readonly ConcurrentDictionary<string, Task<UserItemData>> _userData = new ConcurrentDictionary<string, Task<UserItemData>>();
+ private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1);
+
/// <summary>
/// The repository name
/// </summary>
@@ -172,34 +175,53 @@ namespace MediaBrowser.Server.Implementations.Sqlite
cancellationToken.ThrowIfCancellationRequested();
- using (var cmd = Connection.CreateCommand())
+ await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ SQLiteTransaction transaction = null;
+
+ try
{
- cmd.CommandText = "replace into userdata (key, userId, data) values (@1, @2, @3)";
- cmd.AddParam("@1", key);
- cmd.AddParam("@2", userId);
- cmd.AddParam("@3", serialized);
+ transaction = Connection.BeginTransaction();
- using (var tran = Connection.BeginTransaction())
+ using (var cmd = Connection.CreateCommand())
{
- try
- {
- cmd.Transaction = tran;
+ cmd.CommandText = "replace into userdata (key, userId, data) values (@1, @2, @3)";
+ cmd.AddParam("@1", key);
+ cmd.AddParam("@2", userId);
+ cmd.AddParam("@3", serialized);
- await cmd.ExecuteNonQueryAsync(cancellationToken);
+ cmd.Transaction = transaction;
- tran.Commit();
- }
- catch (OperationCanceledException)
- {
- tran.Rollback();
- }
- catch (Exception e)
- {
- Logger.ErrorException("Failed to commit transaction.", e);
- tran.Rollback();
- }
+ await cmd.ExecuteNonQueryAsync(cancellationToken);
+ }
+
+ transaction.Commit();
+ }
+ catch (OperationCanceledException)
+ {
+ if (transaction != null)
+ {
+ transaction.Rollback();
}
}
+ catch (Exception e)
+ {
+ Logger.ErrorException("Failed to save user data:", e);
+
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+ }
+ finally
+ {
+ if (transaction != null)
+ {
+ transaction.Dispose();
+ }
+
+ _writeLock.Release();
+ }
}
/// <summary>