diff options
| author | Bond-009 <bond.009@outlook.com> | 2019-02-26 18:30:13 +0100 |
|---|---|---|
| committer | Bond_009 <bond.009@outlook.com> | 2019-06-28 12:12:54 +0200 |
| commit | c30ba14c1f9701638bbb47e81d3e7027cb778135 (patch) | |
| tree | 608448e86e00ab4fd3ed06adb7bf1147ad4a2f7f /Emby.Server.Implementations/Data/ManagedConnection.cs | |
| parent | cec22ad10daf7abef2f27f846e4022d5a35faccf (diff) | |
Use a connection pool instead of creating new connections
Diffstat (limited to 'Emby.Server.Implementations/Data/ManagedConnection.cs')
| -rw-r--r-- | Emby.Server.Implementations/Data/ManagedConnection.cs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/Data/ManagedConnection.cs b/Emby.Server.Implementations/Data/ManagedConnection.cs new file mode 100644 index 000000000..71b934a9b --- /dev/null +++ b/Emby.Server.Implementations/Data/ManagedConnection.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading; +using SQLitePCL.pretty; + +namespace Emby.Server.Implementations.Data +{ + public class ManagedConnection : IDisposable + { + private SQLiteDatabaseConnection _db; + private SemaphoreSlim _writeLock; + private BlockingCollection<SQLiteDatabaseConnection> _readConPool; + private bool _disposed = false; + + public ManagedConnection(SQLiteDatabaseConnection db, SemaphoreSlim writeLock) + { + _db = db; + _writeLock = writeLock; + } + + public ManagedConnection(SQLiteDatabaseConnection db, BlockingCollection<SQLiteDatabaseConnection> queue) + { + _db = db; + _readConPool = queue; + } + + public IStatement PrepareStatement(string sql) + { + return _db.PrepareStatement(sql); + } + + public IEnumerable<IStatement> PrepareAll(string sql) + { + return _db.PrepareAll(sql); + } + + public void ExecuteAll(string sql) + { + _db.ExecuteAll(sql); + } + + public void Execute(string sql, params object[] values) + { + _db.Execute(sql, values); + } + + public void RunQueries(string[] sql) + { + _db.RunQueries(sql); + } + + public void RunInTransaction(Action<IDatabaseConnection> action, TransactionMode mode) + { + _db.RunInTransaction(action, mode); + } + + public T RunInTransaction<T>(Func<IDatabaseConnection, T> action, TransactionMode mode) + { + return _db.RunInTransaction(action, mode); + } + + public IEnumerable<IReadOnlyList<IResultSetValue>> Query(string sql) + { + return _db.Query(sql); + } + + public IEnumerable<IReadOnlyList<IResultSetValue>> Query(string sql, params object[] values) + { + return _db.Query(sql, values); + } + + public void Dispose() + { + if (_disposed) + { + return; + } + + _writeLock?.Release(); + _readConPool?.Add(_db); + + _db = null; // Don't dispose it + _disposed = true; + } + } +} |
