| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | using MediaBrowser.Model.Logging;using System;using System.Data;using System.Threading;namespace MediaBrowser.Server.Implementations.Persistence{    class SqliteShrinkMemoryTimer : IDisposable    {        private Timer _shrinkMemoryTimer;        private readonly SemaphoreSlim _writeLock;        private readonly ILogger _logger;        private readonly IDbConnection _connection;        public SqliteShrinkMemoryTimer(IDbConnection connection, SemaphoreSlim writeLock, ILogger logger)        {            _connection = connection;            _writeLock = writeLock;            _logger = logger;            _shrinkMemoryTimer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(30));        }        private async void TimerCallback(object state)        {            await _writeLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);            IDbTransaction transaction = null;            try            {                transaction = _connection.BeginTransaction();                using (var cmd = _connection.CreateCommand())                {                    cmd.Transaction = transaction;                    cmd.CommandText = "pragma shrink_memory";                    cmd.ExecuteNonQuery();                }                transaction.Commit();            }            catch (OperationCanceledException)            {                if (transaction != null)                {                    transaction.Rollback();                }                throw;            }            catch (Exception e)            {                _logger.ErrorException("Failed to save items:", e);                if (transaction != null)                {                    transaction.Rollback();                }                throw;            }            finally            {                if (transaction != null)                {                    transaction.Dispose();                }                _writeLock.Release();            }        }        public void Dispose()        {            if (_shrinkMemoryTimer != null)            {                _shrinkMemoryTimer.Dispose();                _shrinkMemoryTimer = null;            }        }    }}
 |