using MediaBrowser.Model.Logging; using System; using System.Data; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Persistence { public abstract class BaseSqliteRepository : IDisposable { protected readonly IDbConnector DbConnector; protected ILogger Logger; protected string DbFilePath { get; set; } protected BaseSqliteRepository(ILogManager logManager, IDbConnector dbConnector) { DbConnector = dbConnector; Logger = logManager.GetLogger(GetType().Name); } protected virtual async Task CreateConnection(bool isReadOnly = false) { var connection = await DbConnector.Connect(DbFilePath, false, true).ConfigureAwait(false); connection.RunQueries(new [] { "pragma temp_store = memory" }, Logger); return connection; } private bool _disposed; protected void CheckDisposed() { if (_disposed) { throw new ObjectDisposedException(GetType().Name + " has been disposed and cannot be accessed."); } } public void Dispose() { _disposed = true; Dispose(true); } protected async Task Vacuum(IDbConnection connection) { CheckDisposed(); try { using (var cmd = connection.CreateCommand()) { cmd.CommandText = "vacuum"; cmd.ExecuteNonQuery(); } } catch (Exception e) { Logger.ErrorException("Failed to vacuum:", e); throw; } } /// /// 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) { } } }