Browse Source

fixes #2904 - disabling transcoding for a user is not working

Luke Pulverenti 7 years ago
parent
commit
2d29d903be

+ 20 - 1
Emby.Server.Implementations/Activity/ActivityRepository.cs

@@ -10,20 +10,39 @@ using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Querying;
 using SQLitePCL.pretty;
 using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.IO;
 
 namespace Emby.Server.Implementations.Activity
 {
     public class ActivityRepository : BaseSqliteRepository, IActivityRepository
     {
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+        protected IFileSystem FileSystem { get; private set; }
 
-        public ActivityRepository(ILogger logger, IServerApplicationPaths appPaths)
+        public ActivityRepository(ILogger logger, IServerApplicationPaths appPaths, IFileSystem fileSystem)
             : base(logger)
         {
             DbFilePath = Path.Combine(appPaths.DataPath, "activitylog.db");
+            FileSystem = fileSystem;
         }
 
         public void Initialize()
+        {
+            try
+            {
+                InitializeInternal();
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error loading database file. Will reset and retry.", ex);
+
+                FileSystem.DeleteFile(DbFilePath);
+
+                InitializeInternal();
+            }
+        }
+
+        private void InitializeInternal()
         {
             using (var connection = CreateConnection())
             {

+ 3 - 3
Emby.Server.Implementations/ApplicationHost.cs

@@ -879,7 +879,7 @@ namespace Emby.Server.Implementations
             // This is only needed for disposal purposes. If removing this, make sure to have the manager handle disposing it
             RegisterSingleInstance(UserRepository);
 
-            var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager.GetLogger("SqliteDisplayPreferencesRepository"), JsonSerializer, ApplicationPaths, MemoryStreamFactory);
+            var displayPreferencesRepo = new SqliteDisplayPreferencesRepository(LogManager.GetLogger("SqliteDisplayPreferencesRepository"), JsonSerializer, ApplicationPaths, MemoryStreamFactory, FileSystemManager);
             DisplayPreferencesRepository = displayPreferencesRepo;
             RegisterSingleInstance(DisplayPreferencesRepository);
 
@@ -997,7 +997,7 @@ namespace Emby.Server.Implementations
             EncodingManager = new EncodingManager(FileSystemManager, Logger, MediaEncoder, ChapterManager, LibraryManager);
             RegisterSingleInstance(EncodingManager);
 
-            var sharingRepo = new SharingRepository(LogManager.GetLogger("SharingRepository"), ApplicationPaths);
+            var sharingRepo = new SharingRepository(LogManager.GetLogger("SharingRepository"), ApplicationPaths, FileSystemManager);
             sharingRepo.Initialize();
             // This is only needed for disposal purposes. If removing this, make sure to have the manager handle disposing it
             RegisterSingleInstance<ISharingRepository>(sharingRepo);
@@ -1351,7 +1351,7 @@ namespace Emby.Server.Implementations
 
         private IActivityRepository GetActivityLogRepository()
         {
-            var repo = new ActivityRepository(LogManager.GetLogger("ActivityRepository"), ServerConfigurationManager.ApplicationPaths);
+            var repo = new ActivityRepository(LogManager.GetLogger("ActivityRepository"), ServerConfigurationManager.ApplicationPaths, FileSystemManager);
 
             repo.Initialize();
 

+ 55 - 38
Emby.Server.Implementations/Data/BaseSqliteRepository.cs

@@ -108,37 +108,49 @@ namespace Emby.Server.Implementations.Data
 
                 var db = SQLite3.Open(DbFilePath, connectionFlags, null);
 
-                if (string.IsNullOrWhiteSpace(_defaultWal))
+                try
                 {
-                    _defaultWal = db.Query("PRAGMA journal_mode").SelectScalarString().First();
+                    if (string.IsNullOrWhiteSpace(_defaultWal))
+                    {
+                        _defaultWal = db.Query("PRAGMA journal_mode").SelectScalarString().First();
 
-                    Logger.Info("Default journal_mode for {0} is {1}", DbFilePath, _defaultWal);
-                }
+                        Logger.Info("Default journal_mode for {0} is {1}", DbFilePath, _defaultWal);
+                    }
 
-                var queries = new List<string>
-                {
-                    //"PRAGMA cache size=-10000"
-                    //"PRAGMA read_uncommitted = true",
-                    "PRAGMA synchronous=Normal"
-                };
+                    var queries = new List<string>
+                    {
+                        //"PRAGMA cache size=-10000"
+                        //"PRAGMA read_uncommitted = true",
+                        "PRAGMA synchronous=Normal"
+                    };
 
-                if (CacheSize.HasValue)
-                {
-                    queries.Add("PRAGMA cache_size=" + CacheSize.Value.ToString(CultureInfo.InvariantCulture));
-                }
+                    if (CacheSize.HasValue)
+                    {
+                        queries.Add("PRAGMA cache_size=" + CacheSize.Value.ToString(CultureInfo.InvariantCulture));
+                    }
 
-                if (EnableTempStoreMemory)
-                {
-                    queries.Add("PRAGMA temp_store = memory");
+                    if (EnableTempStoreMemory)
+                    {
+                        queries.Add("PRAGMA temp_store = memory");
+                    }
+                    else
+                    {
+                        queries.Add("PRAGMA temp_store = file");
+                    }
+
+                    foreach (var query in queries)
+                    {
+                        db.Execute(query);
+                    }
                 }
-                else
+                catch
                 {
-                    queries.Add("PRAGMA temp_store = file");
-                }
+                    using (db)
+                    {
 
-                foreach (var query in queries)
-                {
-                    db.Execute(query);
+                    }
+
+                    throw;
                 }
 
                 _connection = new ManagedConnection(db, false);
@@ -265,29 +277,34 @@ namespace Emby.Server.Implementations.Data
         {
             if (dispose)
             {
-                try
+                DisposeConnection();
+            }
+        }
+
+        private void DisposeConnection()
+        {
+            try
+            {
+                lock (_disposeLock)
                 {
-                    lock (_disposeLock)
+                    using (WriteLock.Write())
                     {
-                        using (WriteLock.Write())
+                        if (_connection != null)
                         {
-                            if (_connection != null)
+                            using (_connection)
                             {
-                                using (_connection)
-                                {
-                                    
-                                }
-                                _connection = null;
+                                _connection.Close();
                             }
-
-                            CloseConnection();
+                            _connection = null;
                         }
+
+                        CloseConnection();
                     }
                 }
-                catch (Exception ex)
-                {
-                    Logger.ErrorException("Error disposing database", ex);
-                }
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error disposing database", ex);
             }
         }
 

+ 20 - 2
Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs

@@ -19,12 +19,14 @@ namespace Emby.Server.Implementations.Data
     public class SqliteDisplayPreferencesRepository : BaseSqliteRepository, IDisplayPreferencesRepository
     {
         private readonly IMemoryStreamFactory _memoryStreamProvider;
+        protected IFileSystem FileSystem { get; private set; }
 
-        public SqliteDisplayPreferencesRepository(ILogger logger, IJsonSerializer jsonSerializer, IApplicationPaths appPaths, IMemoryStreamFactory memoryStreamProvider)
+        public SqliteDisplayPreferencesRepository(ILogger logger, IJsonSerializer jsonSerializer, IApplicationPaths appPaths, IMemoryStreamFactory memoryStreamProvider, IFileSystem fileSystem)
             : base(logger)
         {
             _jsonSerializer = jsonSerializer;
             _memoryStreamProvider = memoryStreamProvider;
+            FileSystem = fileSystem;
             DbFilePath = Path.Combine(appPaths.DataPath, "displaypreferences.db");
         }
 
@@ -45,11 +47,27 @@ namespace Emby.Server.Implementations.Data
         /// </summary>
         private readonly IJsonSerializer _jsonSerializer;
 
+        public void Initialize()
+        {
+            try
+            {
+                InitializeInternal();
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error loading database file. Will reset and retry.", ex);
+
+                FileSystem.DeleteFile(DbFilePath);
+
+                InitializeInternal();
+            }
+        }
+
         /// <summary>
         /// Opens the connection to the database
         /// </summary>
         /// <returns>Task.</returns>
-        public void Initialize()
+        private void InitializeInternal()
         {
             using (var connection = CreateConnection())
             {

+ 2 - 2
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -120,13 +120,13 @@ namespace Emby.Server.Implementations.Data
 
         protected override void CloseConnection()
         {
-            base.CloseConnection();
-
             if (_shrinkMemoryTimer != null)
             {
                 _shrinkMemoryTimer.Dispose();
                 _shrinkMemoryTimer = null;
             }
+
+            base.CloseConnection();
         }
 
         /// <summary>

+ 1 - 1
Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs

@@ -38,7 +38,7 @@ namespace Emby.Server.Implementations.Notifications
             }
             catch (Exception ex)
             {
-                Logger.ErrorException("Error loading notifications database file. Will reset and retry.", ex);
+                Logger.ErrorException("Error loading database file. Will reset and retry.", ex);
 
                 FileSystem.DeleteFile(DbFilePath);
 

+ 22 - 2
Emby.Server.Implementations/Social/SharingRepository.cs

@@ -7,22 +7,42 @@ using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Social;
 using SQLitePCL.pretty;
 using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.IO;
 
 namespace Emby.Server.Implementations.Social
 {
     public class SharingRepository : BaseSqliteRepository, ISharingRepository
     {
-        public SharingRepository(ILogger logger, IApplicationPaths appPaths)
+        protected IFileSystem FileSystem { get; private set; }
+
+        public SharingRepository(ILogger logger, IApplicationPaths appPaths, IFileSystem fileSystem)
             : base(logger)
         {
+            FileSystem = fileSystem;
             DbFilePath = Path.Combine(appPaths.DataPath, "shares.db");
         }
 
+        public void Initialize()
+        {
+            try
+            {
+                InitializeInternal();
+            }
+            catch (Exception ex)
+            {
+                Logger.ErrorException("Error loading database file. Will reset and retry.", ex);
+
+                FileSystem.DeleteFile(DbFilePath);
+
+                InitializeInternal();
+            }
+        }
+
         /// <summary>
         /// Opens the connection to the database
         /// </summary>
         /// <returns>Task.</returns>
-        public void Initialize()
+        private void InitializeInternal()
         {
             using (var connection = CreateConnection())
             {