ソースを参照

rework device repository

Luke Pulverenti 7 年 前
コミット
9fdaa039c4

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

@@ -938,7 +938,9 @@ namespace Emby.Server.Implementations
             ConnectManager = CreateConnectManager();
             ConnectManager = CreateConnectManager();
             RegisterSingleInstance(ConnectManager);
             RegisterSingleInstance(ConnectManager);
 
 
-            DeviceManager = new DeviceManager(new DeviceRepository(ApplicationPaths, JsonSerializer, LogManager.GetLogger("DeviceManager"), FileSystemManager), UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager);
+            var deviceRepo = new SqliteDeviceRepository(LogManager.GetLogger("DeviceManager"), ServerConfigurationManager, FileSystemManager, JsonSerializer);
+            deviceRepo.Initialize();
+            DeviceManager = new DeviceManager(deviceRepo, UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager);
             RegisterSingleInstance(DeviceManager);
             RegisterSingleInstance(DeviceManager);
 
 
             var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);
             var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);

+ 15 - 12
Emby.Server.Implementations/Devices/DeviceManager.cs

@@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Devices
             _network = network;
             _network = network;
         }
         }
 
 
-        public async Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId)
+        public DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId)
         {
         {
             if (string.IsNullOrWhiteSpace(reportedId))
             if (string.IsNullOrWhiteSpace(reportedId))
             {
             {
@@ -76,14 +76,16 @@ namespace Emby.Server.Implementations.Devices
 
 
             device.DateLastModified = DateTime.UtcNow;
             device.DateLastModified = DateTime.UtcNow;
 
 
-            await _repo.SaveDevice(device).ConfigureAwait(false);
+            device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName;
+
+            _repo.SaveDevice(device);
 
 
             return device;
             return device;
         }
         }
 
 
-        public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities)
+        public void SaveCapabilities(string reportedId, ClientCapabilities capabilities)
         {
         {
-            return _repo.SaveCapabilities(reportedId, capabilities);
+            _repo.SaveCapabilities(reportedId, capabilities);
         }
         }
 
 
         public ClientCapabilities GetCapabilities(string reportedId)
         public ClientCapabilities GetCapabilities(string reportedId)
@@ -98,13 +100,13 @@ namespace Emby.Server.Implementations.Devices
 
 
         public QueryResult<DeviceInfo> GetDevices(DeviceQuery query)
         public QueryResult<DeviceInfo> GetDevices(DeviceQuery query)
         {
         {
-            IEnumerable<DeviceInfo> devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified);
+            IEnumerable<DeviceInfo> devices = _repo.GetDevices();
 
 
             if (query.SupportsSync.HasValue)
             if (query.SupportsSync.HasValue)
             {
             {
                 var val = query.SupportsSync.Value;
                 var val = query.SupportsSync.Value;
 
 
-                devices = devices.Where(i => GetCapabilities(i.Id).SupportsSync == val);
+                devices = devices.Where(i => i.Capabilities.SupportsSync == val);
             }
             }
 
 
             if (query.SupportsPersistentIdentifier.HasValue)
             if (query.SupportsPersistentIdentifier.HasValue)
@@ -113,8 +115,7 @@ namespace Emby.Server.Implementations.Devices
 
 
                 devices = devices.Where(i =>
                 devices = devices.Where(i =>
                 {
                 {
-                    var caps = GetCapabilities(i.Id);
-                    var deviceVal = caps.SupportsPersistentIdentifier;
+                    var deviceVal = i.Capabilities.SupportsPersistentIdentifier;
                     return deviceVal == val;
                     return deviceVal == val;
                 });
                 });
             }
             }
@@ -132,9 +133,9 @@ namespace Emby.Server.Implementations.Devices
             };
             };
         }
         }
 
 
-        public Task DeleteDevice(string id)
+        public void DeleteDevice(string id)
         {
         {
-            return _repo.DeleteDevice(id);
+            _repo.DeleteDevice(id);
         }
         }
 
 
         public ContentUploadHistory GetCameraUploadHistory(string deviceId)
         public ContentUploadHistory GetCameraUploadHistory(string deviceId)
@@ -213,14 +214,16 @@ namespace Emby.Server.Implementations.Devices
             get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); }
             get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); }
         }
         }
 
 
-        public async Task UpdateDeviceInfo(string id, DeviceOptions options)
+        public void UpdateDeviceInfo(string id, DeviceOptions options)
         {
         {
             var device = GetDevice(id);
             var device = GetDevice(id);
 
 
             device.CustomName = options.CustomName;
             device.CustomName = options.CustomName;
             device.CameraUploadPath = options.CameraUploadPath;
             device.CameraUploadPath = options.CameraUploadPath;
 
 
-            await _repo.SaveDevice(device).ConfigureAwait(false);
+            device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName;
+
+            _repo.SaveDevice(device);
 
 
             EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs<DeviceInfo>(device), _logger);
             EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs<DeviceInfo>(device), _logger);
         }
         }

+ 0 - 212
Emby.Server.Implementations/Devices/DeviceRepository.cs

@@ -1,212 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.Devices;
-using MediaBrowser.Model.Devices;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Session;
-using MediaBrowser.Model.Extensions;
-
-namespace Emby.Server.Implementations.Devices
-{
-    public class DeviceRepository : IDeviceRepository
-    {
-        private readonly object _syncLock = new object();
-
-        private readonly IApplicationPaths _appPaths;
-        private readonly IJsonSerializer _json;
-        private readonly ILogger _logger;
-        private readonly IFileSystem _fileSystem;
-
-        private Dictionary<string, DeviceInfo> _devices;
-
-        public DeviceRepository(IApplicationPaths appPaths, IJsonSerializer json, ILogger logger, IFileSystem fileSystem)
-        {
-            _appPaths = appPaths;
-            _json = json;
-            _logger = logger;
-            _fileSystem = fileSystem;
-        }
-
-        private string GetDevicesPath()
-        {
-            return Path.Combine(_appPaths.DataPath, "devices");
-        }
-
-        private string GetDevicePath(string id)
-        {
-            return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N"));
-        }
-
-        public Task SaveDevice(DeviceInfo device)
-        {
-            var path = Path.Combine(GetDevicePath(device.Id), "device.json");
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
-
-            lock (_syncLock)
-            {
-                _json.SerializeToFile(device, path);
-                _devices[device.Id] = device;
-            }
-            return Task.FromResult(true);
-        }
-
-        public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities)
-        {
-            var device = GetDevice(reportedId);
-
-            if (device == null)
-            {
-                throw new ArgumentException("No device has been registed with id " + reportedId);
-            }
-
-            device.Capabilities = capabilities;
-            SaveDevice(device);
-
-            return Task.FromResult(true);
-        }
-
-        public ClientCapabilities GetCapabilities(string reportedId)
-        {
-            var device = GetDevice(reportedId);
-
-            return device == null ? null : device.Capabilities;
-        }
-
-        public DeviceInfo GetDevice(string id)
-        {
-            if (string.IsNullOrWhiteSpace(id))
-            {
-                throw new ArgumentNullException("id");
-            }
-
-            return GetDevices()
-                .FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase));
-        }
-
-        public IEnumerable<DeviceInfo> GetDevices()
-        {
-            lock (_syncLock)
-            {
-                if (_devices == null)
-                {
-                    _devices = new Dictionary<string, DeviceInfo>(StringComparer.OrdinalIgnoreCase);
-
-                    var devices = LoadDevices().ToList();
-                    foreach (var device in devices)
-                    {
-                        _devices[device.Id] = device;
-                    }
-                }
-                return _devices.Values.ToList();
-            }
-        }
-
-        private IEnumerable<DeviceInfo> LoadDevices()
-        {
-            var path = GetDevicesPath();
-
-            try
-            {
-                return _fileSystem
-                    .GetFilePaths(path, true)
-                    .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase))
-                    .ToList()
-                    .Select(i =>
-                    {
-                        try
-                        {
-                            return _json.DeserializeFromFile<DeviceInfo>(i);
-                        }
-                        catch (Exception ex)
-                        {
-                            _logger.ErrorException("Error reading {0}", ex, i);
-                            return null;
-                        }
-                    })
-                    .Where(i => i != null);
-            }
-            catch (IOException)
-            {
-                return new List<DeviceInfo>();
-            }
-        }
-
-        public Task DeleteDevice(string id)
-        {
-            var path = GetDevicePath(id);
-
-            lock (_syncLock)
-            {
-                try
-                {
-                    _fileSystem.DeleteDirectory(path, true);
-                }
-                catch (IOException)
-                {
-                }
-
-                _devices = null;
-            }
-
-            return Task.FromResult(true);
-        }
-
-        public ContentUploadHistory GetCameraUploadHistory(string deviceId)
-        {
-            var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
-
-            lock (_syncLock)
-            {
-                try
-                {
-                    return _json.DeserializeFromFile<ContentUploadHistory>(path);
-                }
-                catch (IOException)
-                {
-                    return new ContentUploadHistory
-                    {
-                        DeviceId = deviceId
-                    };
-                }
-            }
-        }
-
-        public void AddCameraUpload(string deviceId, LocalFileInfo file)
-        {
-            var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
-            _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path));
-
-            lock (_syncLock)
-            {
-                ContentUploadHistory history;
-
-                try
-                {
-                    history = _json.DeserializeFromFile<ContentUploadHistory>(path);
-                }
-                catch (IOException)
-                {
-                    history = new ContentUploadHistory
-                    {
-                        DeviceId = deviceId
-                    };
-                }
-
-                history.DeviceId = deviceId;
-
-                var list = history.FilesUploaded.ToList();
-                list.Add(file);
-                history.FilesUploaded = list.ToArray(list.Count);
-
-                _json.SerializeToFile(history, path);
-            }
-        }
-    }
-}

+ 441 - 0
Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs

@@ -0,0 +1,441 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using Emby.Server.Implementations.Data;
+using MediaBrowser.Controller;
+using MediaBrowser.Model.Logging;
+using SQLitePCL.pretty;
+using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Devices;
+using MediaBrowser.Model.Devices;
+using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.Session;
+using MediaBrowser.Controller.Configuration;
+
+namespace Emby.Server.Implementations.Devices
+{
+    public class SqliteDeviceRepository : BaseSqliteRepository, IDeviceRepository
+    {
+        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+        protected IFileSystem FileSystem { get; private set; }
+        private readonly object _syncLock = new object();
+        private readonly IJsonSerializer _json;
+        private IServerApplicationPaths _appPaths;
+
+        public SqliteDeviceRepository(ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IJsonSerializer json)
+            : base(logger)
+        {
+            var appPaths = config.ApplicationPaths;
+
+            DbFilePath = Path.Combine(appPaths.DataPath, "devices.db");
+            FileSystem = fileSystem;
+            _json = json;
+            _appPaths = appPaths;
+        }
+
+        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())
+            {
+                RunDefaultInitialization(connection);
+
+                string[] queries = {
+                    "create table if not exists Devices (Id TEXT PRIMARY KEY, Name TEXT, ReportedName TEXT, CustomName TEXT, CameraUploadPath TEXT, LastUserName TEXT, AppName TEXT, AppVersion TEXT, LastUserId TEXT, DateLastModified DATETIME, Capabilities TEXT)",
+                    "create index if not exists idx_id on Devices(Id)"
+                               };
+
+                connection.RunQueries(queries);
+
+                MigrateDevices();
+            }
+        }
+
+        private void MigrateDevices()
+        {
+            var files = FileSystem
+                    .GetFilePaths(GetDevicesPath(), true)
+                    .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase))
+                    .ToList();
+
+            foreach (var file in files)
+            {
+                try
+                {
+                    var device = _json.DeserializeFromFile<DeviceInfo>(file);
+
+                    SaveDevice(device);
+                }
+                catch (Exception ex)
+                {
+                    Logger.ErrorException("Error reading {0}", ex, file);
+                }
+                finally
+                {
+                    try
+                    {
+                        FileSystem.DeleteFile(file);
+                    }
+                    catch (IOException)
+                    {
+                        try
+                        {
+                            FileSystem.MoveFile(file, Path.ChangeExtension(file, ".old"));
+                        }
+                        catch (IOException)
+                        {
+                        }
+                    }
+                }
+            }
+        }
+
+        private const string BaseSelectText = "select Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities from Devices";
+
+        public void SaveCapabilities(string deviceId, ClientCapabilities capabilities)
+        {
+            using (WriteLock.Write())
+            {
+                using (var connection = CreateConnection())
+                {
+                    connection.RunInTransaction(db =>
+                    {
+                        using (var statement = db.PrepareStatement("update devices set Capabilities=@Capabilities where Id=@Id"))
+                        {
+                            statement.TryBind("@Id", deviceId);
+
+                            if (capabilities == null)
+                            {
+                                statement.TryBindNull("@Capabilities");
+                            }
+                            else
+                            {
+                                statement.TryBind("@Capabilities", _json.SerializeToString(capabilities));
+                            }
+
+                            statement.MoveNext();
+                        }
+                    }, TransactionMode);
+                }
+            }
+        }
+
+        public void SaveDevice(DeviceInfo entry)
+        {
+            if (entry == null)
+            {
+                throw new ArgumentNullException("entry");
+            }
+
+            using (WriteLock.Write())
+            {
+                using (var connection = CreateConnection())
+                {
+                    connection.RunInTransaction(db =>
+                    {
+                        using (var statement = db.PrepareStatement("replace into Devices (Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities) values (@Id, @Name, @ReportedName, @CustomName, @CameraUploadPath, @LastUserName, @AppName, @AppVersion, @LastUserId, @DateLastModified, @Capabilities)"))
+                        {
+                            statement.TryBind("@Id", entry.Id);
+                            statement.TryBind("@Name", entry.Name);
+                            statement.TryBind("@ReportedName", entry.ReportedName);
+                            statement.TryBind("@CustomName", entry.CustomName);
+                            statement.TryBind("@CameraUploadPath", entry.CameraUploadPath);
+                            statement.TryBind("@LastUserName", entry.LastUserName);
+                            statement.TryBind("@AppName", entry.AppName);
+                            statement.TryBind("@AppVersion", entry.AppVersion);
+                            statement.TryBind("@DateLastModified", entry.DateLastModified);
+
+                            if (entry.Capabilities == null)
+                            {
+                                statement.TryBindNull("@Capabilities");
+                            }
+                            else
+                            {
+                                statement.TryBind("@Capabilities", _json.SerializeToString(entry.Capabilities));
+                            }
+
+                            statement.MoveNext();
+                        }
+                    }, TransactionMode);
+                }
+            }
+        }
+
+        public DeviceInfo GetDevice(string id)
+        {
+            using (WriteLock.Read())
+            {
+                using (var connection = CreateConnection(true))
+                {
+                    var statementTexts = new List<string>();
+                    statementTexts.Add(BaseSelectText + " where Id=@Id");
+
+                    return connection.RunInTransaction(db =>
+                    {
+                        var statements = PrepareAllSafe(db, statementTexts).ToList();
+
+                        using (var statement = statements[0])
+                        {
+                            statement.TryBind("@Id", id);
+
+                            foreach (var row in statement.ExecuteQuery())
+                            {
+                                return GetEntry(row);
+                            }
+                        }
+
+                        return null;
+
+                    }, ReadTransactionMode);
+                }
+            }
+        }
+
+        public List<DeviceInfo> GetDevices()
+        {
+            using (WriteLock.Read())
+            {
+                using (var connection = CreateConnection(true))
+                {
+                    var statementTexts = new List<string>();
+                    statementTexts.Add(BaseSelectText + " order by DateLastModified desc");
+
+                    return connection.RunInTransaction(db =>
+                    {
+                        var list = new List<DeviceInfo>();
+
+                        var statements = PrepareAllSafe(db, statementTexts).ToList();
+
+                        using (var statement = statements[0])
+                        {
+                            foreach (var row in statement.ExecuteQuery())
+                            {
+                                list.Add(GetEntry(row));
+                            }
+                        }
+
+                        return list;
+
+                    }, ReadTransactionMode);
+                }
+            }
+        }
+
+        public ClientCapabilities GetCapabilities(string id)
+        {
+            using (WriteLock.Read())
+            {
+                using (var connection = CreateConnection(true))
+                {
+                    var statementTexts = new List<string>();
+                    statementTexts.Add("Select Capabilities from Devices where Id=@Id");
+
+                    return connection.RunInTransaction(db =>
+                    {
+                        var statements = PrepareAllSafe(db, statementTexts).ToList();
+
+                        using (var statement = statements[0])
+                        {
+                            statement.TryBind("@Id", id);
+
+                            foreach (var row in statement.ExecuteQuery())
+                            {
+                                if (row[0].SQLiteType != SQLiteType.Null)
+                                {
+                                    return _json.DeserializeFromString<ClientCapabilities>(row.GetString(0));
+                                }
+                            }
+                        }
+
+                        return null;
+
+                    }, ReadTransactionMode);
+                }
+            }
+        }
+
+        private DeviceInfo GetEntry(IReadOnlyList<IResultSetValue> reader)
+        {
+            var index = 0;
+
+            var info = new DeviceInfo
+            {
+                Id = reader.GetString(index)
+            };
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.Name = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.ReportedName = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.CustomName = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.CameraUploadPath = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.LastUserName = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.AppName = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.AppVersion = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.LastUserId = reader.GetString(index);
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.DateLastModified = reader[index].ReadDateTime();
+            }
+
+            index++;
+            if (reader[index].SQLiteType != SQLiteType.Null)
+            {
+                info.Capabilities = _json.DeserializeFromString<ClientCapabilities>(reader.GetString(index));
+            }
+
+            return info;
+        }
+
+        private string GetDevicesPath()
+        {
+            return Path.Combine(_appPaths.DataPath, "devices");
+        }
+
+        private string GetDevicePath(string id)
+        {
+            return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N"));
+        }
+
+        public ContentUploadHistory GetCameraUploadHistory(string deviceId)
+        {
+            var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
+
+            lock (_syncLock)
+            {
+                try
+                {
+                    return _json.DeserializeFromFile<ContentUploadHistory>(path);
+                }
+                catch (IOException)
+                {
+                    return new ContentUploadHistory
+                    {
+                        DeviceId = deviceId
+                    };
+                }
+            }
+        }
+
+        public void AddCameraUpload(string deviceId, LocalFileInfo file)
+        {
+            var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json");
+            FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
+
+            lock (_syncLock)
+            {
+                ContentUploadHistory history;
+
+                try
+                {
+                    history = _json.DeserializeFromFile<ContentUploadHistory>(path);
+                }
+                catch (IOException)
+                {
+                    history = new ContentUploadHistory
+                    {
+                        DeviceId = deviceId
+                    };
+                }
+
+                history.DeviceId = deviceId;
+
+                var list = history.FilesUploaded.ToList();
+                list.Add(file);
+                history.FilesUploaded = list.ToArray(list.Count);
+
+                _json.SerializeToFile(history, path);
+            }
+        }
+
+        public void DeleteDevice(string id)
+        {
+            using (WriteLock.Write())
+            {
+                using (var connection = CreateConnection())
+                {
+                    connection.RunInTransaction(db =>
+                    {
+                        using (var statement = db.PrepareStatement("delete from devices where Id=@Id"))
+                        {
+                            statement.TryBind("@Id", id);
+
+                            statement.MoveNext();
+                        }
+                    }, TransactionMode);
+                }
+            }
+
+            var path = GetDevicePath(id);
+
+            lock (_syncLock)
+            {
+                try
+                {
+                    FileSystem.DeleteDirectory(path, true);
+                }
+                catch (IOException)
+                {
+                }
+            }
+        }
+    }
+}

+ 1 - 1
Emby.Server.Implementations/Emby.Server.Implementations.csproj

@@ -67,7 +67,7 @@
     <Compile Include="Devices\CameraUploadsFolder.cs" />
     <Compile Include="Devices\CameraUploadsFolder.cs" />
     <Compile Include="Devices\DeviceId.cs" />
     <Compile Include="Devices\DeviceId.cs" />
     <Compile Include="Devices\DeviceManager.cs" />
     <Compile Include="Devices\DeviceManager.cs" />
-    <Compile Include="Devices\DeviceRepository.cs" />
+    <Compile Include="Devices\SqliteDeviceRepository.cs" />
     <Compile Include="Diagnostics\CommonProcess.cs" />
     <Compile Include="Diagnostics\CommonProcess.cs" />
     <Compile Include="Diagnostics\ProcessFactory.cs" />
     <Compile Include="Diagnostics\ProcessFactory.cs" />
     <Compile Include="Dto\DtoService.cs" />
     <Compile Include="Dto\DtoService.cs" />

+ 6 - 6
Emby.Server.Implementations/Session/SessionManager.cs

@@ -437,7 +437,7 @@ namespace Emby.Server.Implementations.Session
                     if (!string.IsNullOrEmpty(deviceId))
                     if (!string.IsNullOrEmpty(deviceId))
                     {
                     {
                         var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
                         var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
-                        device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false);
+                        device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString);
                     }
                     }
                 }
                 }
 
 
@@ -446,7 +446,7 @@ namespace Emby.Server.Implementations.Session
                 if (device == null)
                 if (device == null)
                 {
                 {
                     var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
                     var userIdString = userId.HasValue ? userId.Value.ToString("N") : null;
-                    device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false);
+                    device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString);
                 }
                 }
 
 
                 if (device != null)
                 if (device != null)
@@ -1567,7 +1567,7 @@ namespace Emby.Server.Implementations.Session
             ReportCapabilities(session, capabilities, true);
             ReportCapabilities(session, capabilities, true);
         }
         }
 
 
-        private async void ReportCapabilities(SessionInfo session,
+        private void ReportCapabilities(SessionInfo session,
             ClientCapabilities capabilities,
             ClientCapabilities capabilities,
             bool saveCapabilities)
             bool saveCapabilities)
         {
         {
@@ -1593,7 +1593,7 @@ namespace Emby.Server.Implementations.Session
             {
             {
                 try
                 try
                 {
                 {
-                    await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false);
+                    SaveCapabilities(session.DeviceId, capabilities);
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)
                 {
                 {
@@ -1607,9 +1607,9 @@ namespace Emby.Server.Implementations.Session
             return _deviceManager.GetCapabilities(deviceId);
             return _deviceManager.GetCapabilities(deviceId);
         }
         }
 
 
-        private Task SaveCapabilities(string deviceId, ClientCapabilities capabilities)
+        private void SaveCapabilities(string deviceId, ClientCapabilities capabilities)
         {
         {
-            return _deviceManager.SaveCapabilities(deviceId, capabilities);
+            _deviceManager.SaveCapabilities(deviceId, capabilities);
         }
         }
 
 
         public SessionInfoDto GetSessionInfoDto(SessionInfo session)
         public SessionInfoDto GetSessionInfoDto(SessionInfo session)

+ 2 - 6
MediaBrowser.Api/Devices/DeviceService.cs

@@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices
 
 
         public void Post(PostDeviceOptions request)
         public void Post(PostDeviceOptions request)
         {
         {
-            var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
+            _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
             {
             {
                 CustomName = request.CustomName,
                 CustomName = request.CustomName,
                 CameraUploadPath = request.CameraUploadPath
                 CameraUploadPath = request.CameraUploadPath
             });
             });
-
-            Task.WaitAll(task);
         }
         }
 
 
         public object Get(GetDeviceInfo request)
         public object Get(GetDeviceInfo request)
@@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices
 
 
         public void Delete(DeleteDevice request)
         public void Delete(DeleteDevice request)
         {
         {
-            var task = _deviceManager.DeleteDevice(request.Id);
-
-            Task.WaitAll(task);
+            _deviceManager.DeleteDevice(request.Id);
         }
         }
 
 
         public void Post(PostCameraUpload request)
         public void Post(PostCameraUpload request)

+ 4 - 9
MediaBrowser.Controller/Devices/IDeviceManager.cs

@@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Devices
         /// <param name="appVersion">The application version.</param>
         /// <param name="appVersion">The application version.</param>
         /// <param name="usedByUserId">The used by user identifier.</param>
         /// <param name="usedByUserId">The used by user identifier.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId);
+        DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId);
 
 
         /// <summary>
         /// <summary>
         /// Saves the capabilities.
         /// Saves the capabilities.
@@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Devices
         /// <param name="reportedId">The reported identifier.</param>
         /// <param name="reportedId">The reported identifier.</param>
         /// <param name="capabilities">The capabilities.</param>
         /// <param name="capabilities">The capabilities.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task SaveCapabilities(string reportedId, ClientCapabilities capabilities);
+        void SaveCapabilities(string reportedId, ClientCapabilities capabilities);
 
 
         /// <summary>
         /// <summary>
         /// Gets the capabilities.
         /// Gets the capabilities.
@@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Devices
         /// <param name="id">The identifier.</param>
         /// <param name="id">The identifier.</param>
         /// <param name="options">The options.</param>
         /// <param name="options">The options.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task UpdateDeviceInfo(string id, DeviceOptions options);
+        void UpdateDeviceInfo(string id, DeviceOptions options);
 
 
         /// <summary>
         /// <summary>
         /// Gets the devices.
         /// Gets the devices.
@@ -67,12 +67,7 @@ namespace MediaBrowser.Controller.Devices
         /// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
         /// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
         QueryResult<DeviceInfo> GetDevices(DeviceQuery query);
         QueryResult<DeviceInfo> GetDevices(DeviceQuery query);
 
 
-        /// <summary>
-        /// Deletes the device.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <returns>Task.</returns>
-        Task DeleteDevice(string id);
+        void DeleteDevice(string id);
 
 
         /// <summary>
         /// <summary>
         /// Gets the upload history.
         /// Gets the upload history.

+ 4 - 9
MediaBrowser.Controller/Devices/IDeviceRepository.cs

@@ -1,7 +1,6 @@
 using MediaBrowser.Model.Devices;
 using MediaBrowser.Model.Devices;
 using MediaBrowser.Model.Session;
 using MediaBrowser.Model.Session;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Controller.Devices
 namespace MediaBrowser.Controller.Devices
 {
 {
@@ -12,7 +11,7 @@ namespace MediaBrowser.Controller.Devices
         /// </summary>
         /// </summary>
         /// <param name="device">The device.</param>
         /// <param name="device">The device.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task SaveDevice(DeviceInfo device);
+        void SaveDevice(DeviceInfo device);
 
 
         /// <summary>
         /// <summary>
         /// Saves the capabilities.
         /// Saves the capabilities.
@@ -20,7 +19,7 @@ namespace MediaBrowser.Controller.Devices
         /// <param name="id">The identifier.</param>
         /// <param name="id">The identifier.</param>
         /// <param name="capabilities">The capabilities.</param>
         /// <param name="capabilities">The capabilities.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task SaveCapabilities(string id, ClientCapabilities capabilities);
+        void SaveCapabilities(string id, ClientCapabilities capabilities);
 
 
         /// <summary>
         /// <summary>
         /// Gets the capabilities.
         /// Gets the capabilities.
@@ -36,18 +35,14 @@ namespace MediaBrowser.Controller.Devices
         /// <returns>DeviceInfo.</returns>
         /// <returns>DeviceInfo.</returns>
         DeviceInfo GetDevice(string id);
         DeviceInfo GetDevice(string id);
 
 
-        /// <summary>
-        /// Gets the devices.
-        /// </summary>
-        /// <returns>IEnumerable&lt;DeviceInfo&gt;.</returns>
-        IEnumerable<DeviceInfo> GetDevices();
+        List<DeviceInfo> GetDevices();
 
 
         /// <summary>
         /// <summary>
         /// Deletes the device.
         /// Deletes the device.
         /// </summary>
         /// </summary>
         /// <param name="id">The identifier.</param>
         /// <param name="id">The identifier.</param>
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
-        Task DeleteDevice(string id);
+        void DeleteDevice(string id);
 
 
         /// <summary>
         /// <summary>
         /// Gets the upload history.
         /// Gets the upload history.

+ 1 - 11
MediaBrowser.Model/Devices/DeviceInfo.cs

@@ -21,17 +21,7 @@ namespace MediaBrowser.Model.Devices
         /// <value>The camera upload path.</value>
         /// <value>The camera upload path.</value>
         public string CameraUploadPath { get; set; }
         public string CameraUploadPath { get; set; }
 
 
-        /// <summary>
-        /// Gets the name.
-        /// </summary>
-        /// <value>The name.</value>
-        public string Name
-        {
-            get
-            {
-                return string.IsNullOrEmpty(CustomName) ? ReportedName : CustomName;
-            }
-        }
+        public string Name { get; set; }
 
 
         /// <summary>
         /// <summary>
         /// Gets or sets the identifier.
         /// Gets or sets the identifier.