diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Core/ApplicationHost.cs
index 8a62a9b27a..914344b661 100644
--- a/Emby.Server.Core/ApplicationHost.cs
+++ b/Emby.Server.Core/ApplicationHost.cs
@@ -552,7 +552,7 @@ namespace Emby.Server.Core
UserDataManager = new UserDataManager(LogManager, ServerConfigurationManager);
RegisterSingleInstance(UserDataManager);
- UserRepository = await GetUserRepository().ConfigureAwait(false);
+ UserRepository = GetUserRepository();
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager.GetLogger("SqliteDisplayPreferencesRepository"), JsonSerializer, ApplicationPaths, MemoryStreamFactory);
DisplayPreferencesRepository = displayPreferencesRepo;
@@ -804,11 +804,11 @@ namespace Emby.Server.Core
/// Gets the user repository.
///
/// Task{IUserRepository}.
- private async Task GetUserRepository()
+ private IUserRepository GetUserRepository()
{
- var repo = new SqliteUserRepository(LogManager, ApplicationPaths, JsonSerializer, GetDbConnector(), MemoryStreamFactory);
+ var repo = new SqliteUserRepository(LogManager.GetLogger("SqliteUserRepository"), ApplicationPaths, JsonSerializer, MemoryStreamFactory);
- await repo.Initialize().ConfigureAwait(false);
+ repo.Initialize();
return repo;
}
diff --git a/Emby.Server.Core/Data/SqliteUserRepository.cs b/Emby.Server.Core/Data/SqliteUserRepository.cs
deleted file mode 100644
index 54851fffbf..0000000000
--- a/Emby.Server.Core/Data/SqliteUserRepository.cs
+++ /dev/null
@@ -1,237 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
-
-namespace Emby.Server.Core.Data
-{
- ///
- /// Class SQLiteUserRepository
- ///
- public class SqliteUserRepository : BaseSqliteRepository, IUserRepository
- {
- private readonly IJsonSerializer _jsonSerializer;
- private readonly IMemoryStreamFactory _memoryStreamProvider;
-
- public SqliteUserRepository(ILogManager logManager, IServerApplicationPaths appPaths, IJsonSerializer jsonSerializer, IDbConnector dbConnector, IMemoryStreamFactory memoryStreamProvider) : base(logManager, dbConnector)
- {
- _jsonSerializer = jsonSerializer;
- _memoryStreamProvider = memoryStreamProvider;
-
- DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
- }
-
- ///
- /// Gets the name of the repository
- ///
- /// The name.
- public string Name
- {
- get
- {
- return "SQLite";
- }
- }
-
- ///
- /// Opens the connection to the database
- ///
- /// Task.
- public async Task Initialize()
- {
- using (var connection = await CreateConnection().ConfigureAwait(false))
- {
- string[] queries = {
-
- "create table if not exists users (guid GUID primary key, data BLOB)",
- "create index if not exists idx_users on users(guid)",
- "create table if not exists schema_version (table_name primary key, version)",
-
- "pragma shrink_memory"
- };
-
- connection.RunQueries(queries, Logger);
- }
- }
-
- ///
- /// Save a user in the repo
- ///
- /// The user.
- /// The cancellation token.
- /// Task.
- /// user
- public async Task SaveUser(User user, CancellationToken cancellationToken)
- {
- if (user == null)
- {
- throw new ArgumentNullException("user");
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- var serialized = _jsonSerializer.SerializeToBytes(user, _memoryStreamProvider);
-
- cancellationToken.ThrowIfCancellationRequested();
-
- using (var connection = await CreateConnection().ConfigureAwait(false))
- {
- IDbTransaction transaction = null;
-
- try
- {
- transaction = connection.BeginTransaction();
-
- using (var cmd = connection.CreateCommand())
- {
- cmd.CommandText = "replace into users (guid, data) values (@1, @2)";
- cmd.Parameters.Add(cmd, "@1", DbType.Guid).Value = user.Id;
- cmd.Parameters.Add(cmd, "@2", DbType.Binary).Value = serialized;
-
- cmd.Transaction = transaction;
-
- cmd.ExecuteNonQuery();
- }
-
- transaction.Commit();
- }
- catch (OperationCanceledException)
- {
- if (transaction != null)
- {
- transaction.Rollback();
- }
-
- throw;
- }
- catch (Exception e)
- {
- Logger.ErrorException("Failed to save user:", e);
-
- if (transaction != null)
- {
- transaction.Rollback();
- }
-
- throw;
- }
- finally
- {
- if (transaction != null)
- {
- transaction.Dispose();
- }
- }
- }
- }
-
- ///
- /// Retrieve all users from the database
- ///
- /// IEnumerable{User}.
- public IEnumerable RetrieveAllUsers()
- {
- var list = new List();
-
- using (var connection = CreateConnection(true).Result)
- {
- using (var cmd = connection.CreateCommand())
- {
- cmd.CommandText = "select guid,data from users";
-
- using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
- {
- while (reader.Read())
- {
- var id = reader.GetGuid(0);
-
- using (var stream = reader.GetMemoryStream(1, _memoryStreamProvider))
- {
- var user = _jsonSerializer.DeserializeFromStream(stream);
- user.Id = id;
- list.Add(user);
- }
- }
- }
- }
- }
-
- return list;
- }
-
- ///
- /// Deletes the user.
- ///
- /// The user.
- /// The cancellation token.
- /// Task.
- /// user
- public async Task DeleteUser(User user, CancellationToken cancellationToken)
- {
- if (user == null)
- {
- throw new ArgumentNullException("user");
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- using (var connection = await CreateConnection().ConfigureAwait(false))
- {
- IDbTransaction transaction = null;
-
- try
- {
- transaction = connection.BeginTransaction();
-
- using (var cmd = connection.CreateCommand())
- {
- cmd.CommandText = "delete from users where guid=@guid";
-
- cmd.Parameters.Add(cmd, "@guid", DbType.Guid).Value = user.Id;
-
- cmd.Transaction = transaction;
-
- cmd.ExecuteNonQuery();
- }
-
- transaction.Commit();
- }
- catch (OperationCanceledException)
- {
- if (transaction != null)
- {
- transaction.Rollback();
- }
-
- throw;
- }
- catch (Exception e)
- {
- Logger.ErrorException("Failed to delete user:", e);
-
- if (transaction != null)
- {
- transaction.Rollback();
- }
-
- throw;
- }
- finally
- {
- if (transaction != null)
- {
- transaction.Dispose();
- }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Emby.Server.Implementations/Data/SqliteUserRepository.cs b/Emby.Server.Implementations/Data/SqliteUserRepository.cs
new file mode 100644
index 0000000000..5e4b1c7b85
--- /dev/null
+++ b/Emby.Server.Implementations/Data/SqliteUserRepository.cs
@@ -0,0 +1,160 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using SQLitePCL.pretty;
+
+namespace Emby.Server.Implementations.Data
+{
+ ///
+ /// Class SQLiteUserRepository
+ ///
+ public class SqliteUserRepository : BaseSqliteRepository, IUserRepository
+ {
+ private readonly IJsonSerializer _jsonSerializer;
+ private readonly IMemoryStreamFactory _memoryStreamProvider;
+
+ public SqliteUserRepository(ILogger logger, IServerApplicationPaths appPaths, IJsonSerializer jsonSerializer, IMemoryStreamFactory memoryStreamProvider)
+ : base(logger)
+ {
+ _jsonSerializer = jsonSerializer;
+ _memoryStreamProvider = memoryStreamProvider;
+
+ DbFilePath = Path.Combine(appPaths.DataPath, "users.db");
+ }
+
+ ///
+ /// Gets the name of the repository
+ ///
+ /// The name.
+ public string Name
+ {
+ get
+ {
+ return "SQLite";
+ }
+ }
+
+ ///
+ /// Opens the connection to the database
+ ///
+ /// Task.
+ public void Initialize()
+ {
+ using (var connection = CreateConnection())
+ {
+ string[] queries = {
+
+ "create table if not exists users (guid GUID primary key, data BLOB)",
+ "create index if not exists idx_users on users(guid)",
+ "create table if not exists schema_version (table_name primary key, version)",
+
+ "pragma shrink_memory"
+ };
+
+ connection.RunQueries(queries);
+ }
+ }
+
+ ///
+ /// Save a user in the repo
+ ///
+ /// The user.
+ /// The cancellation token.
+ /// Task.
+ /// user
+ public async Task SaveUser(User user, CancellationToken cancellationToken)
+ {
+ if (user == null)
+ {
+ throw new ArgumentNullException("user");
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var serialized = _jsonSerializer.SerializeToBytes(user, _memoryStreamProvider);
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ lock (WriteLock)
+ {
+ using (var connection = CreateConnection())
+ {
+ connection.RunInTransaction(db =>
+ {
+ var commandText = "replace into users (guid, data) values (?, ?)";
+
+ db.Execute(commandText,
+ user.Id.ToGuidParamValue(),
+ serialized);
+ });
+ }
+ }
+ }
+
+ ///
+ /// Retrieve all users from the database
+ ///
+ /// IEnumerable{User}.
+ public IEnumerable RetrieveAllUsers()
+ {
+ var list = new List();
+
+ using (var connection = CreateConnection(true))
+ {
+ foreach (var row in connection.Query("select guid,data from users"))
+ {
+ var id = row[0].ReadGuid();
+
+ using (var stream = _memoryStreamProvider.CreateNew(row[1].ToBlob()))
+ {
+ stream.Position = 0;
+ var user = _jsonSerializer.DeserializeFromStream(stream);
+ user.Id = id;
+ list.Add(user);
+ }
+ }
+ }
+
+ return list;
+ }
+
+ ///
+ /// Deletes the user.
+ ///
+ /// The user.
+ /// The cancellation token.
+ /// Task.
+ /// user
+ public async Task DeleteUser(User user, CancellationToken cancellationToken)
+ {
+ if (user == null)
+ {
+ throw new ArgumentNullException("user");
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ lock (WriteLock)
+ {
+ using (var connection = CreateConnection())
+ {
+ connection.RunInTransaction(db =>
+ {
+ var commandText = "delete from users where guid=?";
+
+ db.Execute(commandText,
+ user.Id.ToGuidParamValue());
+ });
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index a4f26bc601..0c47bc2994 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -51,6 +51,7 @@
+