switch recordings to ts when preserving original audio

This commit is contained in:
Luke Pulverenti 2016-06-12 19:33:11 -04:00
parent f378a2c789
commit 383110f9af
7 changed files with 1709 additions and 1783 deletions

View file

@ -195,28 +195,35 @@ namespace MediaBrowser.Providers.TV
private async void LibraryUpdateTimerCallback(object state) private async void LibraryUpdateTimerCallback(object state)
{ {
if (MissingEpisodeProvider.IsRunning) try
{ {
return; if (MissingEpisodeProvider.IsRunning)
{
return;
}
if (_libraryManager.IsScanRunning)
{
return;
}
var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
GroupByPresentationUniqueKey = false
}).Cast<Series>().ToList();
var seriesGroups = SeriesPostScanTask.FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem)
.Run(seriesGroups, false, CancellationToken.None).ConfigureAwait(false);
} }
catch (Exception ex)
if (_libraryManager.IsScanRunning)
{ {
return ; _logger.ErrorException("Error in SeriesPostScanTask", ex);
} }
var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
GroupByPresentationUniqueKey = false
}).Cast<Series>().ToList();
var seriesGroups = SeriesPostScanTask.FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem)
.Run(seriesGroups, false, CancellationToken.None).ConfigureAwait(false);
} }
private bool FilterItem(BaseItem item) private bool FilterItem(BaseItem item)

View file

@ -50,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
var streams = mediaSource.MediaStreams ?? new List<MediaStream>(); var streams = mediaSource.MediaStreams ?? new List<MediaStream>();
if (streams.Any(i => i.Type == MediaStreamType.Audio && (i.Codec ?? string.Empty).IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1)) if (streams.Any(i => i.Type == MediaStreamType.Audio && (i.Codec ?? string.Empty).IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1))
{ {
return Path.ChangeExtension(targetFile, ".mkv"); return Path.ChangeExtension(targetFile, ".ts");
} }
} }

View file

@ -8,6 +8,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
public abstract class BaseSqliteRepository : IDisposable public abstract class BaseSqliteRepository : IDisposable
{ {
protected readonly SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1);
protected readonly IDbConnector DbConnector; protected readonly IDbConnector DbConnector;
protected ILogger Logger; protected ILogger Logger;
@ -19,11 +20,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
Logger = logManager.GetLogger(GetType().Name); Logger = logManager.GetLogger(GetType().Name);
} }
protected virtual bool EnableConnectionPooling
{
get { return true; }
}
protected virtual async Task<IDbConnection> CreateConnection(bool isReadOnly = false) protected virtual async Task<IDbConnection> CreateConnection(bool isReadOnly = false)
{ {
var connection = await DbConnector.Connect(DbFilePath, false, true).ConfigureAwait(false); var connection = await DbConnector.Connect(DbFilePath, false, true).ConfigureAwait(false);
connection.RunQueries(new [] connection.RunQueries(new[]
{ {
"pragma temp_store = memory" "pragma temp_store = memory"
@ -45,12 +51,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
_disposed = true; _disposed = true;
Dispose(true); Dispose(true);
GC.SuppressFinalize(this);
} }
protected async Task Vacuum(IDbConnection connection) protected async Task Vacuum(IDbConnection connection)
{ {
CheckDisposed(); CheckDisposed();
await WriteLock.WaitAsync().ConfigureAwait(false);
try try
{ {
using (var cmd = connection.CreateCommand()) using (var cmd = connection.CreateCommand())
@ -65,14 +74,41 @@ namespace MediaBrowser.Server.Implementations.Persistence
throw; throw;
} }
finally
{
WriteLock.Release();
}
} }
private readonly object _disposeLock = new object();
/// <summary> /// <summary>
/// Releases unmanaged and - optionally - managed resources. /// Releases unmanaged and - optionally - managed resources.
/// </summary> /// </summary>
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool dispose) protected virtual void Dispose(bool dispose)
{ {
if (dispose)
{
try
{
lock (_disposeLock)
{
WriteLock.Wait();
CloseConnection();
}
}
catch (Exception ex)
{
Logger.ErrorException("Error disposing database", ex);
}
}
}
protected virtual void CloseConnection()
{
} }
} }
} }

View file

@ -39,12 +39,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
var connectionString = connectionstr.ConnectionString; var connectionString = connectionstr.ConnectionString;
if (enablePooling)
{
connectionString += ";Max Pool Size=100";
}
//logger.Info("Sqlite {0} opening {1}", SQLiteConnection.SQLiteVersion, connectionString); //logger.Info("Sqlite {0} opening {1}", SQLiteConnection.SQLiteVersion, connectionString);
SQLiteConnection.SetMemoryStatus(false);
var connection = new SQLiteConnection(connectionString); var connection = new SQLiteConnection(connectionString);

View file

@ -15,11 +15,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
{ {
private IDbConnection _connection;
public SqliteUserDataRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector connector) : base(logManager, connector) public SqliteUserDataRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector connector) : base(logManager, connector)
{ {
DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db"); DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db");
} }
protected override bool EnableConnectionPooling
{
get { return false; }
}
/// <summary> /// <summary>
/// Gets the name of the repository /// Gets the name of the repository
/// </summary> /// </summary>
@ -36,23 +43,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
/// Opens the connection to the database /// Opens the connection to the database
/// </summary> /// </summary>
/// <returns>Task.</returns> /// <returns>Task.</returns>
public async Task Initialize(IDbConnector dbConnector) public async Task Initialize()
{ {
using (var connection = await CreateConnection().ConfigureAwait(false)) _connection = await CreateConnection(false).ConfigureAwait(false);
{
string[] queries = { string[] queries = {
"create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)", "create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)",
"create index if not exists idx_userdata on userdata(key)", "create index if not exists idx_userdata on userdata(key)",
"create unique index if not exists userdataindex on userdata (key, userId)" "create unique index if not exists userdataindex on userdata (key, userId)",
//pragmas
"pragma temp_store = memory",
"pragma shrink_memory"
}; };
connection.RunQueries(queries, Logger); _connection.RunQueries(queries, Logger);
connection.AddColumn(Logger, "userdata", "AudioStreamIndex", "int"); _connection.AddColumn(Logger, "userdata", "AudioStreamIndex", "int");
connection.AddColumn(Logger, "userdata", "SubtitleStreamIndex", "int"); _connection.AddColumn(Logger, "userdata", "SubtitleStreamIndex", "int");
}
} }
/// <summary> /// <summary>
@ -114,63 +125,64 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
using (var connection = await CreateConnection().ConfigureAwait(false)) await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
IDbTransaction transaction = null;
try
{ {
IDbTransaction transaction = null; transaction = _connection.BeginTransaction();
try using (var cmd = _connection.CreateCommand())
{ {
transaction = connection.BeginTransaction(); cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
using (var cmd = connection.CreateCommand()) cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
{ cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"; cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating;
cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played;
cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount;
cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite;
cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks;
cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate;
cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex;
cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex;
cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key; cmd.Transaction = transaction;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating;
cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played;
cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount;
cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite;
cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks;
cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate;
cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex;
cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex;
cmd.Transaction = transaction; cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery();
}
transaction.Commit();
} }
catch (OperationCanceledException)
transaction.Commit();
}
catch (OperationCanceledException)
{
if (transaction != null)
{ {
if (transaction != null) transaction.Rollback();
{
transaction.Rollback();
}
throw;
} }
catch (Exception e)
throw;
}
catch (Exception e)
{
Logger.ErrorException("Failed to save user data:", e);
if (transaction != null)
{ {
Logger.ErrorException("Failed to save user data:", e); transaction.Rollback();
if (transaction != null)
{
transaction.Rollback();
}
throw;
} }
finally
throw;
}
finally
{
if (transaction != null)
{ {
if (transaction != null) transaction.Dispose();
{
transaction.Dispose();
}
} }
WriteLock.Release();
} }
} }
@ -185,68 +197,69 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
using (var connection = await CreateConnection().ConfigureAwait(false)) await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
IDbTransaction transaction = null;
try
{ {
IDbTransaction transaction = null; transaction = _connection.BeginTransaction();
try foreach (var userItemData in userData)
{ {
transaction = connection.BeginTransaction(); using (var cmd = _connection.CreateCommand())
foreach (var userItemData in userData)
{ {
using (var cmd = connection.CreateCommand()) cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
{
cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key; cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating; cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating;
cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played; cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played;
cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount; cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount;
cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite; cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite;
cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks; cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks;
cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate; cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate;
cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex; cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex;
cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex; cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex;
cmd.Transaction = transaction; cmd.Transaction = transaction;
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
}
cancellationToken.ThrowIfCancellationRequested();
} }
transaction.Commit(); cancellationToken.ThrowIfCancellationRequested();
} }
catch (OperationCanceledException)
{
if (transaction != null)
{
transaction.Rollback();
}
throw; transaction.Commit();
} }
catch (Exception e) catch (OperationCanceledException)
{
if (transaction != null)
{ {
Logger.ErrorException("Failed to save user data:", e); transaction.Rollback();
if (transaction != null)
{
transaction.Rollback();
}
throw;
} }
finally
throw;
}
catch (Exception e)
{
Logger.ErrorException("Failed to save user data:", e);
if (transaction != null)
{ {
if (transaction != null) transaction.Rollback();
{
transaction.Dispose();
}
} }
throw;
}
finally
{
if (transaction != null)
{
transaction.Dispose();
}
WriteLock.Release();
} }
} }
@ -272,25 +285,22 @@ namespace MediaBrowser.Server.Implementations.Persistence
throw new ArgumentNullException("key"); throw new ArgumentNullException("key");
} }
using (var connection = CreateConnection(true).Result) using (var cmd = _connection.CreateCommand())
{ {
using (var cmd = connection.CreateCommand()) cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId";
cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
{ {
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId"; if (reader.Read())
cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
{ {
if (reader.Read()) return ReadRow(reader);
{
return ReadRow(reader);
}
} }
return null;
} }
return null;
} }
} }
@ -305,41 +315,38 @@ namespace MediaBrowser.Server.Implementations.Persistence
throw new ArgumentNullException("keys"); throw new ArgumentNullException("keys");
} }
using (var connection = CreateConnection(true).Result) using (var cmd = _connection.CreateCommand())
{ {
using (var cmd = connection.CreateCommand()) var index = 0;
var excludeIds = new List<string>();
var builder = new StringBuilder();
foreach (var key in keys)
{ {
var index = 0; var paramName = "@Key" + index;
var excludeIds = new List<string>(); excludeIds.Add("Key =" + paramName);
var builder = new StringBuilder(); cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key;
foreach (var key in keys) builder.Append(" WHEN Key=" + paramName + " THEN " + index);
{ index++;
var paramName = "@Key" + index;
excludeIds.Add("Key =" + paramName);
cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key;
builder.Append(" WHEN Key=" + paramName + " THEN " + index);
index++;
}
var keyText = string.Join(" OR ", excludeIds.ToArray());
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") ";
cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )";
cmd.CommandText += " LIMIT 1";
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
{
if (reader.Read())
{
return ReadRow(reader);
}
}
return null;
} }
var keyText = string.Join(" OR ", excludeIds.ToArray());
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") ";
cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )";
cmd.CommandText += " LIMIT 1";
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
{
if (reader.Read())
{
return ReadRow(reader);
}
}
return null;
} }
} }
@ -355,27 +362,20 @@ namespace MediaBrowser.Server.Implementations.Persistence
throw new ArgumentNullException("userId"); throw new ArgumentNullException("userId");
} }
var list = new List<UserItemData>(); using (var cmd = _connection.CreateCommand())
using (var connection = CreateConnection(true).Result)
{ {
using (var cmd = connection.CreateCommand()) cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId";
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
{ {
cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId"; while (reader.Read())
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
{ {
while (reader.Read()) yield return ReadRow(reader);
{
list.Add(ReadRow(reader));
}
} }
} }
} }
return list;
} }
/// <summary> /// <summary>
@ -416,5 +416,19 @@ namespace MediaBrowser.Server.Implementations.Persistence
return userData; return userData;
} }
protected override void CloseConnection()
{
if (_connection != null)
{
if (_connection.IsOpen())
{
_connection.Close();
}
_connection.Dispose();
_connection = null;
}
}
} }
} }

View file

@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Startup.Common
await displayPreferencesRepo.Initialize().ConfigureAwait(false); await displayPreferencesRepo.Initialize().ConfigureAwait(false);
await ConfigureUserDataRepositories().ConfigureAwait(false); await ConfigureUserDataRepositories().ConfigureAwait(false);
await itemRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); await itemRepo.Initialize().ConfigureAwait(false);
((LibraryManager)LibraryManager).ItemRepository = ItemRepository; ((LibraryManager)LibraryManager).ItemRepository = ItemRepository;
await ConfigureNotificationsRepository().ConfigureAwait(false); await ConfigureNotificationsRepository().ConfigureAwait(false);
progress.Report(100); progress.Report(100);
@ -746,7 +746,7 @@ namespace MediaBrowser.Server.Startup.Common
{ {
var repo = new SqliteUserDataRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector()); var repo = new SqliteUserDataRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector());
await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false); await repo.Initialize().ConfigureAwait(false);
((UserDataManager)UserDataManager).Repository = repo; ((UserDataManager)UserDataManager).Repository = repo;
} }