rework users repository
This commit is contained in:
parent
352e21618a
commit
13abfbc3b8
|
@ -552,7 +552,7 @@ namespace Emby.Server.Core
|
||||||
UserDataManager = new UserDataManager(LogManager, ServerConfigurationManager);
|
UserDataManager = new UserDataManager(LogManager, ServerConfigurationManager);
|
||||||
RegisterSingleInstance(UserDataManager);
|
RegisterSingleInstance(UserDataManager);
|
||||||
|
|
||||||
UserRepository = await GetUserRepository().ConfigureAwait(false);
|
UserRepository = GetUserRepository();
|
||||||
|
|
||||||
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager.GetLogger("SqliteDisplayPreferencesRepository"), JsonSerializer, ApplicationPaths, MemoryStreamFactory);
|
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager.GetLogger("SqliteDisplayPreferencesRepository"), JsonSerializer, ApplicationPaths, MemoryStreamFactory);
|
||||||
DisplayPreferencesRepository = displayPreferencesRepo;
|
DisplayPreferencesRepository = displayPreferencesRepo;
|
||||||
|
@ -804,11 +804,11 @@ namespace Emby.Server.Core
|
||||||
/// Gets the user repository.
|
/// Gets the user repository.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Task{IUserRepository}.</returns>
|
/// <returns>Task{IUserRepository}.</returns>
|
||||||
private async Task<IUserRepository> 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;
|
return repo;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Class SQLiteUserRepository
|
|
||||||
/// </summary>
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the name of the repository
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "SQLite";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Opens the connection to the database
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>Task.</returns>
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Save a user in the repo
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user.</param>
|
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
|
||||||
/// <returns>Task.</returns>
|
|
||||||
/// <exception cref="System.ArgumentNullException">user</exception>
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieve all users from the database
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>IEnumerable{User}.</returns>
|
|
||||||
public IEnumerable<User> RetrieveAllUsers()
|
|
||||||
{
|
|
||||||
var list = new List<User>();
|
|
||||||
|
|
||||||
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<User>(stream);
|
|
||||||
user.Id = id;
|
|
||||||
list.Add(user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Deletes the user.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user">The user.</param>
|
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
|
||||||
/// <returns>Task.</returns>
|
|
||||||
/// <exception cref="System.ArgumentNullException">user</exception>
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
160
Emby.Server.Implementations/Data/SqliteUserRepository.cs
Normal file
160
Emby.Server.Implementations/Data/SqliteUserRepository.cs
Normal file
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class SQLiteUserRepository
|
||||||
|
/// </summary>
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the name of the repository
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The name.</value>
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "SQLite";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Opens the connection to the database
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save a user in the repo
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user">The user.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
/// <exception cref="System.ArgumentNullException">user</exception>
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve all users from the database
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>IEnumerable{User}.</returns>
|
||||||
|
public IEnumerable<User> RetrieveAllUsers()
|
||||||
|
{
|
||||||
|
var list = new List<User>();
|
||||||
|
|
||||||
|
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<User>(stream);
|
||||||
|
user.Id = id;
|
||||||
|
list.Add(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes the user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user">The user.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
/// <exception cref="System.ArgumentNullException">user</exception>
|
||||||
|
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());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,6 +51,7 @@
|
||||||
<Compile Include="Connect\Responses.cs" />
|
<Compile Include="Connect\Responses.cs" />
|
||||||
<Compile Include="Connect\Validator.cs" />
|
<Compile Include="Connect\Validator.cs" />
|
||||||
<Compile Include="Data\SqliteDisplayPreferencesRepository.cs" />
|
<Compile Include="Data\SqliteDisplayPreferencesRepository.cs" />
|
||||||
|
<Compile Include="Data\SqliteUserRepository.cs" />
|
||||||
<Compile Include="Devices\CameraUploadsDynamicFolder.cs" />
|
<Compile Include="Devices\CameraUploadsDynamicFolder.cs" />
|
||||||
<Compile Include="Devices\DeviceManager.cs" />
|
<Compile Include="Devices\DeviceManager.cs" />
|
||||||
<Compile Include="Devices\DeviceRepository.cs" />
|
<Compile Include="Devices\DeviceRepository.cs" />
|
||||||
|
|
Loading…
Reference in New Issue
Block a user