aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs')
-rw-r--r--MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs114
1 files changed, 114 insertions, 0 deletions
diff --git a/MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs b/MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs
new file mode 100644
index 000000000..8dc3e91ad
--- /dev/null
+++ b/MediaBrowser.Server.Startup.Common/Persistence/BaseSqliteRepository.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Data;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Model.Logging;
+
+namespace MediaBrowser.Server.Startup.Common.Persistence
+{
+ 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