Browse Source

switch recordings to ts when preserving original audio

Luke Pulverenti 9 years ago
parent
commit
383110f9af

+ 23 - 16
MediaBrowser.Providers/TV/SeriesPostScanTask.cs

@@ -195,28 +195,35 @@ namespace MediaBrowser.Providers.TV
 
 
         private async void LibraryUpdateTimerCallback(object state)
         private async void LibraryUpdateTimerCallback(object state)
         {
         {
-            if (MissingEpisodeProvider.IsRunning)
+            try
             {
             {
-                return;
-            }
+                if (MissingEpisodeProvider.IsRunning)
+                {
+                    return;
+                }
 
 
-            if (_libraryManager.IsScanRunning)
-            {
-                return ;
-            }
+                if (_libraryManager.IsScanRunning)
+                {
+                    return;
+                }
 
 
-            var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
-            {
-                IncludeItemTypes = new[] { typeof(Series).Name },
-                Recursive = true,
-                GroupByPresentationUniqueKey = false
+                var seriesList = _libraryManager.GetItemList(new InternalItemsQuery()
+                {
+                    IncludeItemTypes = new[] { typeof(Series).Name },
+                    Recursive = true,
+                    GroupByPresentationUniqueKey = false
 
 
-            }).Cast<Series>().ToList();
+                }).Cast<Series>().ToList();
 
 
-            var seriesGroups = SeriesPostScanTask.FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
+                var seriesGroups = SeriesPostScanTask.FindSeriesGroups(seriesList).Where(g => !string.IsNullOrEmpty(g.Key)).ToList();
 
 
-            await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem)
-                .Run(seriesGroups, false, CancellationToken.None).ConfigureAwait(false);
+                await new MissingEpisodeProvider(_logger, _config, _libraryManager, _localization, _fileSystem)
+                    .Run(seriesGroups, false, CancellationToken.None).ConfigureAwait(false);
+            }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Error in SeriesPostScanTask", ex);
+            }
         }
         }
 
 
         private bool FilterItem(BaseItem item)
         private bool FilterItem(BaseItem item)

+ 1 - 1
MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -50,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
                 var streams = mediaSource.MediaStreams ?? new List<MediaStream>();
                 var streams = mediaSource.MediaStreams ?? new List<MediaStream>();
                 if (streams.Any(i => i.Type == MediaStreamType.Audio && (i.Codec ?? string.Empty).IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1))
                 if (streams.Any(i => i.Type == MediaStreamType.Audio && (i.Codec ?? string.Empty).IndexOf("aac", StringComparison.OrdinalIgnoreCase) != -1))
                 {
                 {
-                    return Path.ChangeExtension(targetFile, ".mkv");
+                    return Path.ChangeExtension(targetFile, ".ts");
                 }
                 }
             }
             }
 
 

+ 38 - 2
MediaBrowser.Server.Implementations/Persistence/BaseSqliteRepository.cs

@@ -8,6 +8,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 {
 {
     public abstract class BaseSqliteRepository : IDisposable
     public abstract class BaseSqliteRepository : IDisposable
     {
     {
+        protected readonly SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1);
         protected readonly IDbConnector DbConnector;
         protected readonly IDbConnector DbConnector;
         protected ILogger Logger;
         protected ILogger Logger;
 
 
@@ -19,11 +20,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
             Logger = logManager.GetLogger(GetType().Name);
             Logger = logManager.GetLogger(GetType().Name);
         }
         }
 
 
+        protected virtual bool EnableConnectionPooling
+        {
+            get { return true; }
+        }
+
         protected virtual async Task<IDbConnection> CreateConnection(bool isReadOnly = false)
         protected virtual async Task<IDbConnection> CreateConnection(bool isReadOnly = false)
         {
         {
             var connection = await DbConnector.Connect(DbFilePath, false, true).ConfigureAwait(false);
             var connection = await DbConnector.Connect(DbFilePath, false, true).ConfigureAwait(false);
 
 
-            connection.RunQueries(new []
+            connection.RunQueries(new[]
             {
             {
                 "pragma temp_store = memory"
                 "pragma temp_store = memory"
 
 
@@ -45,12 +51,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
         {
         {
             _disposed = true;
             _disposed = true;
             Dispose(true);
             Dispose(true);
+            GC.SuppressFinalize(this);
         }
         }
 
 
         protected async Task Vacuum(IDbConnection connection)
         protected async Task Vacuum(IDbConnection connection)
         {
         {
             CheckDisposed();
             CheckDisposed();
 
 
+            await WriteLock.WaitAsync().ConfigureAwait(false);
+
             try
             try
             {
             {
                 using (var cmd = connection.CreateCommand())
                 using (var cmd = connection.CreateCommand())
@@ -65,14 +74,41 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
 
                 throw;
                 throw;
             }
             }
+            finally
+            {
+                WriteLock.Release();
+            }
         }
         }
 
 
+        private readonly object _disposeLock = new object();
+
         /// <summary>
         /// <summary>
         /// Releases unmanaged and - optionally - managed resources.
         /// Releases unmanaged and - optionally - managed resources.
         /// </summary>
         /// </summary>
         /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
         /// <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)
         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()
+        {
+
         }
         }
     }
     }
-}
+}

+ 1 - 5
MediaBrowser.Server.Implementations/Persistence/SqliteExtensions.cs

@@ -39,12 +39,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
 
             var connectionString = connectionstr.ConnectionString;
             var connectionString = connectionstr.ConnectionString;
 
 
-            if (enablePooling)
-            {
-                connectionString += ";Max Pool Size=100";
-            }
-
             //logger.Info("Sqlite {0} opening {1}", SQLiteConnection.SQLiteVersion, connectionString);
             //logger.Info("Sqlite {0} opening {1}", SQLiteConnection.SQLiteVersion, connectionString);
+            SQLiteConnection.SetMemoryStatus(false);
 
 
             var connection = new SQLiteConnection(connectionString);
             var connection = new SQLiteConnection(connectionString);
 
 

File diff suppressed because it is too large
+ 635 - 489
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs


+ 168 - 154
MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs

@@ -15,11 +15,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
 {
 {
     public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
     public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
     {
     {
+        private IDbConnection _connection;
+
         public SqliteUserDataRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector connector) : base(logManager, connector)
         public SqliteUserDataRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector connector) : base(logManager, connector)
         {
         {
             DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db");
             DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db");
         }
         }
 
 
+        protected override bool EnableConnectionPooling
+        {
+            get { return false; }
+        }
+
         /// <summary>
         /// <summary>
         /// Gets the name of the repository
         /// Gets the name of the repository
         /// </summary>
         /// </summary>
@@ -36,23 +43,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
         /// Opens the connection to the database
         /// Opens the connection to the database
         /// </summary>
         /// </summary>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        public async Task Initialize(IDbConnector dbConnector)
+        public async Task Initialize()
         {
         {
-            using (var connection = await CreateConnection().ConfigureAwait(false))
-            {
-                string[] queries = {
+            _connection = await CreateConnection(false).ConfigureAwait(false);
+
+            string[] queries = {
 
 
                                 "create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)",
                                 "create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)",
 
 
                                 "create index if not exists idx_userdata on userdata(key)",
                                 "create index if not exists idx_userdata on userdata(key)",
-                                "create unique index if not exists userdataindex on userdata (key, userId)"
+                                "create unique index if not exists userdataindex on userdata (key, userId)",
+
+                                //pragmas
+                                "pragma temp_store = memory",
+
+                                "pragma shrink_memory"
                                };
                                };
 
 
-                connection.RunQueries(queries, Logger);
+            _connection.RunQueries(queries, Logger);
 
 
-                connection.AddColumn(Logger, "userdata", "AudioStreamIndex", "int");
-                connection.AddColumn(Logger, "userdata", "SubtitleStreamIndex", "int");
-            }
+            _connection.AddColumn(Logger, "userdata", "AudioStreamIndex", "int");
+            _connection.AddColumn(Logger, "userdata", "SubtitleStreamIndex", "int");
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -114,63 +125,64 @@ namespace MediaBrowser.Server.Implementations.Persistence
         {
         {
             cancellationToken.ThrowIfCancellationRequested();
             cancellationToken.ThrowIfCancellationRequested();
 
 
-            using (var connection = await CreateConnection().ConfigureAwait(false))
-            {
-                IDbTransaction transaction = null;
-
-                try
-                {
-                    transaction = connection.BeginTransaction();
-
-                    using (var cmd = connection.CreateCommand())
-                    {
-                        cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
-
-                        cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
-                        cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
-                        cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating;
-                        cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played;
-                        cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount;
-                        cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite;
-                        cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks;
-                        cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate;
-                        cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex;
-                        cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex;
+            await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
 
 
-                        cmd.Transaction = transaction;
+            IDbTransaction transaction = null;
 
 
-                        cmd.ExecuteNonQuery();
-                    }
+            try
+            {
+                transaction = _connection.BeginTransaction();
 
 
-                    transaction.Commit();
-                }
-                catch (OperationCanceledException)
+                using (var cmd = _connection.CreateCommand())
                 {
                 {
-                    if (transaction != null)
-                    {
-                        transaction.Rollback();
-                    }
+                    cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
 
 
-                    throw;
+                    cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
+                    cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
+                    cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating;
+                    cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played;
+                    cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount;
+                    cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite;
+                    cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks;
+                    cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate;
+                    cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex;
+                    cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex;
+
+                    cmd.Transaction = transaction;
+
+                    cmd.ExecuteNonQuery();
                 }
                 }
-                catch (Exception e)
+
+                transaction.Commit();
+            }
+            catch (OperationCanceledException)
+            {
+                if (transaction != null)
                 {
                 {
-                    Logger.ErrorException("Failed to save user data:", e);
+                    transaction.Rollback();
+                }
 
 
-                    if (transaction != null)
-                    {
-                        transaction.Rollback();
-                    }
+                throw;
+            }
+            catch (Exception e)
+            {
+                Logger.ErrorException("Failed to save user data:", e);
 
 
-                    throw;
+                if (transaction != null)
+                {
+                    transaction.Rollback();
                 }
                 }
-                finally
+
+                throw;
+            }
+            finally
+            {
+                if (transaction != null)
                 {
                 {
-                    if (transaction != null)
-                    {
-                        transaction.Dispose();
-                    }
+                    transaction.Dispose();
                 }
                 }
+
+                WriteLock.Release();
             }
             }
         }
         }
 
 
@@ -185,68 +197,69 @@ namespace MediaBrowser.Server.Implementations.Persistence
         {
         {
             cancellationToken.ThrowIfCancellationRequested();
             cancellationToken.ThrowIfCancellationRequested();
 
 
-            using (var connection = await CreateConnection().ConfigureAwait(false))
-            {
-                IDbTransaction transaction = null;
+            await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
 
 
-                try
-                {
-                    transaction = connection.BeginTransaction();
+            IDbTransaction transaction = null;
 
 
-                    foreach (var userItemData in userData)
-                    {
-                        using (var cmd = connection.CreateCommand())
-                        {
-                            cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
-
-                            cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key;
-                            cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
-                            cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating;
-                            cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played;
-                            cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount;
-                            cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite;
-                            cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks;
-                            cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate;
-                            cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex;
-                            cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex;
-
-                            cmd.Transaction = transaction;
-
-                            cmd.ExecuteNonQuery();
-                        }
-
-                        cancellationToken.ThrowIfCancellationRequested();
-                    }
+            try
+            {
+                transaction = _connection.BeginTransaction();
 
 
-                    transaction.Commit();
-                }
-                catch (OperationCanceledException)
+                foreach (var userItemData in userData)
                 {
                 {
-                    if (transaction != null)
+                    using (var cmd = _connection.CreateCommand())
                     {
                     {
-                        transaction.Rollback();
+                        cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)";
+
+                        cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key;
+                        cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
+                        cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating;
+                        cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played;
+                        cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount;
+                        cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite;
+                        cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks;
+                        cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate;
+                        cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex;
+                        cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex;
+
+                        cmd.Transaction = transaction;
+
+                        cmd.ExecuteNonQuery();
                     }
                     }
 
 
-                    throw;
+                    cancellationToken.ThrowIfCancellationRequested();
                 }
                 }
-                catch (Exception e)
+
+                transaction.Commit();
+            }
+            catch (OperationCanceledException)
+            {
+                if (transaction != null)
                 {
                 {
-                    Logger.ErrorException("Failed to save user data:", e);
+                    transaction.Rollback();
+                }
 
 
-                    if (transaction != null)
-                    {
-                        transaction.Rollback();
-                    }
+                throw;
+            }
+            catch (Exception e)
+            {
+                Logger.ErrorException("Failed to save user data:", e);
 
 
-                    throw;
+                if (transaction != null)
+                {
+                    transaction.Rollback();
                 }
                 }
-                finally
+
+                throw;
+            }
+            finally
+            {
+                if (transaction != null)
                 {
                 {
-                    if (transaction != null)
-                    {
-                        transaction.Dispose();
-                    }
+                    transaction.Dispose();
                 }
                 }
+
+                WriteLock.Release();
             }
             }
         }
         }
 
 
@@ -272,25 +285,22 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 throw new ArgumentNullException("key");
                 throw new ArgumentNullException("key");
             }
             }
 
 
-            using (var connection = CreateConnection(true).Result)
+            using (var cmd = _connection.CreateCommand())
             {
             {
-                using (var cmd = connection.CreateCommand())
-                {
-                    cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId";
+                cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId";
 
 
-                    cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
-                    cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
+                cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
+                cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
 
 
-                    using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+                {
+                    if (reader.Read())
                     {
                     {
-                        if (reader.Read())
-                        {
-                            return ReadRow(reader);
-                        }
+                        return ReadRow(reader);
                     }
                     }
-
-                    return null;
                 }
                 }
+
+                return null;
             }
             }
         }
         }
 
 
@@ -305,41 +315,38 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 throw new ArgumentNullException("keys");
                 throw new ArgumentNullException("keys");
             }
             }
 
 
-            using (var connection = CreateConnection(true).Result)
+            using (var cmd = _connection.CreateCommand())
             {
             {
-                using (var cmd = connection.CreateCommand())
+                var index = 0;
+                var excludeIds = new List<string>();
+                var builder = new StringBuilder();
+                foreach (var key in keys)
                 {
                 {
-                    var index = 0;
-                    var excludeIds = new List<string>();
-                    var builder = new StringBuilder();
-                    foreach (var key in keys)
-                    {
-                        var paramName = "@Key" + index;
-                        excludeIds.Add("Key =" + paramName);
-                        cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key;
-                        builder.Append(" WHEN Key=" + paramName + " THEN " + index);
-                        index++;
-                    }
+                    var paramName = "@Key" + index;
+                    excludeIds.Add("Key =" + paramName);
+                    cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key;
+                    builder.Append(" WHEN Key=" + paramName + " THEN " + index);
+                    index++;
+                }
 
 
-                    var keyText = string.Join(" OR ", excludeIds.ToArray());
+                var keyText = string.Join(" OR ", excludeIds.ToArray());
 
 
-                    cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") ";
+                cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") ";
 
 
-                    cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )";
-                    cmd.CommandText += " LIMIT 1";
+                cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )";
+                cmd.CommandText += " LIMIT 1";
 
 
-                    cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
+                cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
 
 
-                    using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+                {
+                    if (reader.Read())
                     {
                     {
-                        if (reader.Read())
-                        {
-                            return ReadRow(reader);
-                        }
+                        return ReadRow(reader);
                     }
                     }
-
-                    return null;
                 }
                 }
+
+                return null;
             }
             }
         }
         }
 
 
@@ -355,27 +362,20 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 throw new ArgumentNullException("userId");
                 throw new ArgumentNullException("userId");
             }
             }
 
 
-            var list = new List<UserItemData>();
-
-            using (var connection = CreateConnection(true).Result)
+            using (var cmd = _connection.CreateCommand())
             {
             {
-                using (var cmd = connection.CreateCommand())
-                {
-                    cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId";
+                cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId";
 
 
-                    cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
+                cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
 
 
-                    using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
+                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
+                {
+                    while (reader.Read())
                     {
                     {
-                        while (reader.Read())
-                        {
-                            list.Add(ReadRow(reader));
-                        }
+                        yield return ReadRow(reader);
                     }
                     }
                 }
                 }
             }
             }
-
-            return list;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -416,5 +416,19 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
 
             return userData;
             return userData;
         }
         }
+
+        protected override void CloseConnection()
+        {
+            if (_connection != null)
+            {
+                if (_connection.IsOpen())
+                {
+                    _connection.Close();
+                }
+
+                _connection.Dispose();
+                _connection = null;
+            }
+        }
     }
     }
 }
 }

+ 2 - 2
MediaBrowser.Server.Startup.Common/ApplicationHost.cs

@@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Startup.Common
 
 
             await displayPreferencesRepo.Initialize().ConfigureAwait(false);
             await displayPreferencesRepo.Initialize().ConfigureAwait(false);
             await ConfigureUserDataRepositories().ConfigureAwait(false);
             await ConfigureUserDataRepositories().ConfigureAwait(false);
-            await itemRepo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false);
+            await itemRepo.Initialize().ConfigureAwait(false);
             ((LibraryManager)LibraryManager).ItemRepository = ItemRepository;
             ((LibraryManager)LibraryManager).ItemRepository = ItemRepository;
             await ConfigureNotificationsRepository().ConfigureAwait(false);
             await ConfigureNotificationsRepository().ConfigureAwait(false);
             progress.Report(100);
             progress.Report(100);
@@ -746,7 +746,7 @@ namespace MediaBrowser.Server.Startup.Common
         {
         {
             var repo = new SqliteUserDataRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector());
             var repo = new SqliteUserDataRepository(LogManager, ApplicationPaths, NativeApp.GetDbConnector());
 
 
-            await repo.Initialize(NativeApp.GetDbConnector()).ConfigureAwait(false);
+            await repo.Initialize().ConfigureAwait(false);
 
 
             ((UserDataManager)UserDataManager).Repository = repo;
             ((UserDataManager)UserDataManager).Repository = repo;
         }
         }

Some files were not shown because too many files changed in this diff