diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-11 01:43:42 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-11 01:43:42 -0500 |
| commit | 06afe47ee9716cb210067f3c09cd0c97722bd1c7 (patch) | |
| tree | fa856ef38f03fa051d446bc854e8d6d4b4f24899 /Emby.Server.Core/Data/BaseSqliteRepository.cs | |
| parent | 369d5e8f09e4e6e7e493bf2049325251942cd215 (diff) | |
update server core project
Diffstat (limited to 'Emby.Server.Core/Data/BaseSqliteRepository.cs')
| -rw-r--r-- | Emby.Server.Core/Data/BaseSqliteRepository.cs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/Emby.Server.Core/Data/BaseSqliteRepository.cs b/Emby.Server.Core/Data/BaseSqliteRepository.cs new file mode 100644 index 000000000..8d3cbe10a --- /dev/null +++ b/Emby.Server.Core/Data/BaseSqliteRepository.cs @@ -0,0 +1,114 @@ +using System; +using System.Data; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Model.Logging; + +namespace Emby.Server.Core.Data +{ + public abstract class BaseSqliteRepository : IDisposable + { + protected SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1); + 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 bool EnableConnectionPooling + { + get { return true; } + } + + protected virtual async Task<IDbConnection> 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); + GC.SuppressFinalize(this); + } + + protected async Task Vacuum(IDbConnection connection) + { + CheckDisposed(); + + await WriteLock.WaitAsync().ConfigureAwait(false); + + try + { + using (var cmd = connection.CreateCommand()) + { + cmd.CommandText = "vacuum"; + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + Logger.ErrorException("Failed to vacuum:", e); + + throw; + } + finally + { + WriteLock.Release(); + } + } + + private readonly object _disposeLock = new object(); + + /// <summary> + /// Releases unmanaged and - optionally - managed resources. + /// </summary> + /// <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) + { + if (dispose) + { + try + { + lock (_disposeLock) + { + WriteLock.Wait(); + + CloseConnection(); + } + } + catch (Exception ex) + { + Logger.ErrorException("Error disposing database", ex); + } + } + } + + protected virtual void CloseConnection() + { + + } + } +}
\ No newline at end of file |
