diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-12-07 20:42:15 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-12-07 20:42:15 -0500 |
| commit | 1f162e39b1a26aabe7bd6080479ce000774247e6 (patch) | |
| tree | 964abded95f33e4a912691cb87cebcfb6dabbf2f /MediaBrowser.Server.Implementations/Persistence | |
| parent | 07e5b74f1344d2c80ef0d27fb6b2097459db4f4e (diff) | |
expose Tmdb collection id in editor.
Diffstat (limited to 'MediaBrowser.Server.Implementations/Persistence')
9 files changed, 139 insertions, 27 deletions
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteChapterRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteChapterRepository.cs index 9121ae87b..075ef4239 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteChapterRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteChapterRepository.cs @@ -44,7 +44,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "create index if not exists idx_chapters on chapters(ItemId, ChapterIndex)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs index 09f438aef..9f6ec0f24 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs @@ -86,8 +86,11 @@ namespace MediaBrowser.Server.Implementations.Persistence "create table if not exists userdisplaypreferences (id GUID, userId GUID, client text, data BLOB)", "create unique index if not exists userdisplaypreferencesindex on userdisplaypreferences (id, userId, client)", + //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 893d6ea62..200898a62 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -124,18 +124,24 @@ namespace MediaBrowser.Server.Implementations.Persistence "create index if not exists idx_ChildrenIds on ChildrenIds(ParentId,ItemId)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); PrepareStatements(); - + _mediaStreamsRepository.Initialize(); _providerInfoRepository.Initialize(); _chapterRepository.Initialize(); + + _shrinkMemoryTimer = new SqliteShrinkMemoryTimer(_connection, _writeLock, _logger); } + private SqliteShrinkMemoryTimer _shrinkMemoryTimer; + /// <summary> /// The _write lock /// </summary> @@ -402,6 +408,12 @@ namespace MediaBrowser.Server.Implementations.Persistence { lock (_disposeLock) { + if (_shrinkMemoryTimer != null) + { + _shrinkMemoryTimer.Dispose(); + _shrinkMemoryTimer = null; + } + if (_connection != null) { if (_connection.IsOpen()) @@ -412,30 +424,30 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.Dispose(); _connection = null; } + + if (_chapterRepository != null) + { + _chapterRepository.Dispose(); + _chapterRepository = null; + } + + if (_mediaStreamsRepository != null) + { + _mediaStreamsRepository.Dispose(); + _mediaStreamsRepository = null; + } + + if (_providerInfoRepository != null) + { + _providerInfoRepository.Dispose(); + _providerInfoRepository = null; + } } } catch (Exception ex) { _logger.ErrorException("Error disposing database", ex); } - - if (_chapterRepository != null) - { - _chapterRepository.Dispose(); - _chapterRepository = null; - } - - if (_mediaStreamsRepository != null) - { - _mediaStreamsRepository.Dispose(); - _mediaStreamsRepository = null; - } - - if (_providerInfoRepository != null) - { - _providerInfoRepository.Dispose(); - _providerInfoRepository = null; - } } } diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs index ba189396a..b898398d8 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs @@ -43,7 +43,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "create index if not exists idx_mediastreams on mediastreams(ItemId, StreamIndex)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs index c5f391765..0f9b4295e 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteNotificationsRepository.cs @@ -45,7 +45,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "create index if not exists idx_Notifications on Notifications(Id, UserId)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs index 8972beb05..5d836b090 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs @@ -42,7 +42,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "create index if not exists idx_providerinfos on providerinfos(ItemId, ProviderId)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteShrinkMemoryTimer.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteShrinkMemoryTimer.cs new file mode 100644 index 000000000..01784d540 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteShrinkMemoryTimer.cs @@ -0,0 +1,84 @@ +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; + } + } + } +} diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs index fa195859b..d3f9100b1 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs @@ -72,7 +72,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "create unique index if not exists userdataindex on userdata (key, userId)", //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs index 222cc9422..d97a55ae6 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs @@ -77,8 +77,11 @@ namespace MediaBrowser.Server.Implementations.Persistence "create table if not exists users (guid GUID primary key, data BLOB)", "create index if not exists idx_users on users(guid)", "create table if not exists schema_version (table_name primary key, version)", + //pragmas - "pragma temp_store = memory" + "pragma temp_store = memory", + + "pragma shrink_memory" }; _connection.RunQueries(queries, _logger); |
