diff --git a/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs b/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs index f883e6dbc..7302431e1 100644 --- a/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs +++ b/MediaBrowser.Server.Implementations/Notifications/SqliteNotificationsRepository.cs @@ -13,20 +13,11 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Notifications { - public class SqliteNotificationsRepository : INotificationsRepository + public class SqliteNotificationsRepository : BaseSqliteRepository, INotificationsRepository { private IDbConnection _connection; - private readonly ILogger _logger; private readonly IServerApplicationPaths _appPaths; - private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1); - - public SqliteNotificationsRepository(ILogManager logManager, IServerApplicationPaths appPaths) - { - _appPaths = appPaths; - _logger = logManager.GetLogger(GetType().Name); - } - public event EventHandler NotificationAdded; public event EventHandler NotificationsMarkedRead; public event EventHandler NotificationUpdated; @@ -35,11 +26,17 @@ namespace MediaBrowser.Server.Implementations.Notifications private IDbCommand _markReadCommand; private IDbCommand _markAllReadCommand; + public SqliteNotificationsRepository(ILogManager logManager, IServerApplicationPaths appPaths) + : base(logManager) + { + _appPaths = appPaths; + } + public async Task Initialize() { var dbFile = Path.Combine(_appPaths.DataPath, "notifications.db"); - _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); + _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false); string[] queries = { @@ -52,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Notifications "pragma shrink_memory" }; - _connection.RunQueries(queries, _logger); + _connection.RunQueries(queries, Logger); PrepareStatements(); } @@ -251,7 +248,7 @@ namespace MediaBrowser.Server.Implementations.Notifications } catch (Exception ex) { - _logger.ErrorException("Error in NotificationAdded event handler", ex); + Logger.ErrorException("Error in NotificationAdded event handler", ex); } } } @@ -275,7 +272,7 @@ namespace MediaBrowser.Server.Implementations.Notifications cancellationToken.ThrowIfCancellationRequested(); - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); + await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); IDbTransaction transaction = null; @@ -311,7 +308,7 @@ namespace MediaBrowser.Server.Implementations.Notifications } catch (Exception e) { - _logger.ErrorException("Failed to save notification:", e); + Logger.ErrorException("Failed to save notification:", e); if (transaction != null) { @@ -327,7 +324,7 @@ namespace MediaBrowser.Server.Implementations.Notifications transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -359,7 +356,7 @@ namespace MediaBrowser.Server.Implementations.Notifications } catch (Exception ex) { - _logger.ErrorException("Error in NotificationsMarkedRead event handler", ex); + Logger.ErrorException("Error in NotificationsMarkedRead event handler", ex); } } } @@ -368,7 +365,7 @@ namespace MediaBrowser.Server.Implementations.Notifications { cancellationToken.ThrowIfCancellationRequested(); - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); + await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); IDbTransaction transaction = null; @@ -396,7 +393,7 @@ namespace MediaBrowser.Server.Implementations.Notifications } catch (Exception e) { - _logger.ErrorException("Failed to save notification:", e); + Logger.ErrorException("Failed to save notification:", e); if (transaction != null) { @@ -412,7 +409,7 @@ namespace MediaBrowser.Server.Implementations.Notifications transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -420,7 +417,7 @@ namespace MediaBrowser.Server.Implementations.Notifications { cancellationToken.ThrowIfCancellationRequested(); - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); + await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); IDbTransaction transaction = null; @@ -455,7 +452,7 @@ namespace MediaBrowser.Server.Implementations.Notifications } catch (Exception e) { - _logger.ErrorException("Failed to save notification:", e); + Logger.ErrorException("Failed to save notification:", e); if (transaction != null) { @@ -471,7 +468,21 @@ namespace MediaBrowser.Server.Implementations.Notifications transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); + } + } + + protected override void CloseConnection() + { + if (_connection != null) + { + if (_connection.IsOpen()) + { + _connection.Close(); + } + + _connection.Dispose(); + _connection = null; } } } diff --git a/MediaBrowser.Server.Implementations/Security/AuthenticationRepository.cs b/MediaBrowser.Server.Implementations/Security/AuthenticationRepository.cs index b36db51b3..b932f0cac 100644 --- a/MediaBrowser.Server.Implementations/Security/AuthenticationRepository.cs +++ b/MediaBrowser.Server.Implementations/Security/AuthenticationRepository.cs @@ -13,19 +13,17 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Security { - public class AuthenticationRepository : IAuthenticationRepository + public class AuthenticationRepository : BaseSqliteRepository, IAuthenticationRepository { private IDbConnection _connection; - private readonly ILogger _logger; - private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1); private readonly IServerApplicationPaths _appPaths; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private IDbCommand _saveInfoCommand; - public AuthenticationRepository(ILogger logger, IServerApplicationPaths appPaths) + public AuthenticationRepository(ILogManager logManager, IServerApplicationPaths appPaths) + : base(logManager) { - _logger = logger; _appPaths = appPaths; } @@ -33,7 +31,7 @@ namespace MediaBrowser.Server.Implementations.Security { var dbFile = Path.Combine(_appPaths.DataPath, "authentication.db"); - _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); + _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false); string[] queries = { @@ -46,9 +44,9 @@ namespace MediaBrowser.Server.Implementations.Security "pragma shrink_memory" }; - _connection.RunQueries(queries, _logger); + _connection.RunQueries(queries, Logger); - _connection.AddColumn(_logger, "AccessTokens", "AppVersion", "TEXT"); + _connection.AddColumn(Logger, "AccessTokens", "AppVersion", "TEXT"); PrepareStatements(); } @@ -86,7 +84,7 @@ namespace MediaBrowser.Server.Implementations.Security cancellationToken.ThrowIfCancellationRequested(); - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); + await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); IDbTransaction transaction = null; @@ -124,7 +122,7 @@ namespace MediaBrowser.Server.Implementations.Security } catch (Exception e) { - _logger.ErrorException("Failed to save record:", e); + Logger.ErrorException("Failed to save record:", e); if (transaction != null) { @@ -140,7 +138,7 @@ namespace MediaBrowser.Server.Implementations.Security transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -305,7 +303,7 @@ namespace MediaBrowser.Server.Implementations.Security { info.DeviceName = reader.GetString(5); } - + if (!reader.IsDBNull(6)) { info.UserId = reader.GetString(6); @@ -318,49 +316,21 @@ namespace MediaBrowser.Server.Implementations.Security { info.DateRevoked = reader.GetDateTime(9).ToUniversalTime(); } - + return info; } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() + protected override void CloseConnection() { - Dispose(true); - GC.SuppressFinalize(this); - } - - private readonly object _disposeLock = new object(); - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) - { - if (dispose) + if (_connection != null) { - try + if (_connection.IsOpen()) { - lock (_disposeLock) - { - if (_connection != null) - { - if (_connection.IsOpen()) - { - _connection.Close(); - } + _connection.Close(); + } - _connection.Dispose(); - _connection = null; - } - } - } - catch (Exception ex) - { - _logger.ErrorException("Error disposing database", ex); - } + _connection.Dispose(); + _connection = null; } } } diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index 735748e08..e61a64646 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -683,7 +683,7 @@ namespace MediaBrowser.Server.Startup.Common private async Task GetAuthenticationRepository() { - var repo = new AuthenticationRepository(LogManager.GetLogger("AuthenticationRepository"), ServerConfigurationManager.ApplicationPaths); + var repo = new AuthenticationRepository(LogManager, ServerConfigurationManager.ApplicationPaths); await repo.Initialize().ConfigureAwait(false);