aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Sync
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sync')
-rw-r--r--MediaBrowser.Server.Implementations/Sync/MediaSync.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs13
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs85
-rw-r--r--MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs80
4 files changed, 88 insertions, 92 deletions
diff --git a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
index cff72ae58..fd2f8ae8d 100644
--- a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
+++ b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
@@ -66,7 +66,7 @@ namespace MediaBrowser.Server.Implementations.Sync
// Do the data sync twice so the server knows what was removed from the device
await SyncData(provider, dataProvider, serverId, target, cancellationToken).ConfigureAwait(false);
-
+
progress.Report(100);
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index c715c3f50..21377da7e 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -341,7 +341,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (primaryImage == null)
{
- var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
+ var parentWithImage = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
if (parentWithImage != null)
{
@@ -380,7 +380,7 @@ namespace MediaBrowser.Server.Implementations.Sync
if (primaryImage == null)
{
- var parentWithImage = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Primary));
+ var parentWithImage = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Primary));
if (parentWithImage != null)
{
@@ -640,7 +640,6 @@ namespace MediaBrowser.Server.Implementations.Sync
dtoOptions.Fields.Remove(ItemFields.MediaStreams);
dtoOptions.Fields.Remove(ItemFields.IndexOptions);
dtoOptions.Fields.Remove(ItemFields.MediaSourceCount);
- dtoOptions.Fields.Remove(ItemFields.OriginalPrimaryImageAspectRatio);
dtoOptions.Fields.Remove(ItemFields.Path);
dtoOptions.Fields.Remove(ItemFields.SeriesGenres);
dtoOptions.Fields.Remove(ItemFields.Settings);
@@ -740,10 +739,10 @@ namespace MediaBrowser.Server.Implementations.Sync
var requiresSaving = false;
var removeFromDevice = false;
- var libraryItem = _libraryManager.GetItemById(jobItem.ItemId);
-
if (request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase))
{
+ var libraryItem = _libraryManager.GetItemById(jobItem.ItemId);
+
var job = _repo.GetJob(jobItem.JobId);
var user = _userManager.GetUserById(job.UserId);
@@ -846,10 +845,10 @@ namespace MediaBrowser.Server.Implementations.Sync
var requiresSaving = false;
var removeFromDevice = false;
- var libraryItem = _libraryManager.GetItemById(jobItem.ItemId);
-
if (request.SyncJobItemIds.Contains(jobItem.Id, StringComparer.OrdinalIgnoreCase))
{
+ var libraryItem = _libraryManager.GetItemById(jobItem.ItemId);
+
var job = _repo.GetJob(jobItem.JobId);
var user = _userManager.GetUserById(job.UserId);
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index 75c929016..d266a534d 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -17,12 +17,9 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Sync
{
- public class SyncRepository : ISyncRepository, IDisposable
+ public class SyncRepository : BaseSqliteRepository, ISyncRepository
{
private IDbConnection _connection;
- private readonly ILogger _logger;
- private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1);
- private readonly IServerApplicationPaths _appPaths;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private IDbCommand _insertJobCommand;
@@ -34,19 +31,20 @@ namespace MediaBrowser.Server.Implementations.Sync
private IDbCommand _updateJobItemCommand;
private readonly IJsonSerializer _json;
+ private readonly IServerApplicationPaths _appPaths;
- public SyncRepository(ILogger logger, IServerApplicationPaths appPaths, IJsonSerializer json)
+ public SyncRepository(ILogManager logManager, IJsonSerializer json, IServerApplicationPaths appPaths)
+ : base(logManager)
{
- _logger = logger;
- _appPaths = appPaths;
_json = json;
+ _appPaths = appPaths;
}
public async Task Initialize()
{
var dbFile = Path.Combine(_appPaths.DataPath, "sync14.db");
- _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
+ _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false);
string[] queries = {
@@ -62,10 +60,10 @@ namespace MediaBrowser.Server.Implementations.Sync
"pragma shrink_memory"
};
- _connection.RunQueries(queries, _logger);
+ _connection.RunQueries(queries, Logger);
- _connection.AddColumn(_logger, "SyncJobs", "Profile", "TEXT");
- _connection.AddColumn(_logger, "SyncJobs", "Bitrate", "INT");
+ _connection.AddColumn(Logger, "SyncJobs", "Profile", "TEXT");
+ _connection.AddColumn(Logger, "SyncJobs", "Bitrate", "INT");
PrepareStatements();
}
@@ -298,7 +296,7 @@ namespace MediaBrowser.Server.Implementations.Sync
CheckDisposed();
- await _writeLock.WaitAsync().ConfigureAwait(false);
+ await WriteLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -344,7 +342,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
catch (Exception e)
{
- _logger.ErrorException("Failed to save record:", e);
+ Logger.ErrorException("Failed to save record:", e);
if (transaction != null)
{
@@ -360,7 +358,7 @@ namespace MediaBrowser.Server.Implementations.Sync
transaction.Dispose();
}
- _writeLock.Release();
+ WriteLock.Release();
}
}
@@ -373,7 +371,7 @@ namespace MediaBrowser.Server.Implementations.Sync
CheckDisposed();
- await _writeLock.WaitAsync().ConfigureAwait(false);
+ await WriteLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -405,7 +403,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
catch (Exception e)
{
- _logger.ErrorException("Failed to save record:", e);
+ Logger.ErrorException("Failed to save record:", e);
if (transaction != null)
{
@@ -421,7 +419,7 @@ namespace MediaBrowser.Server.Implementations.Sync
transaction.Dispose();
}
- _writeLock.Release();
+ WriteLock.Release();
}
}
@@ -656,7 +654,7 @@ namespace MediaBrowser.Server.Implementations.Sync
CheckDisposed();
- await _writeLock.WaitAsync().ConfigureAwait(false);
+ await WriteLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -699,7 +697,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
catch (Exception e)
{
- _logger.ErrorException("Failed to save record:", e);
+ Logger.ErrorException("Failed to save record:", e);
if (transaction != null)
{
@@ -715,7 +713,7 @@ namespace MediaBrowser.Server.Implementations.Sync
transaction.Dispose();
}
- _writeLock.Release();
+ WriteLock.Release();
}
}
@@ -802,15 +800,6 @@ namespace MediaBrowser.Server.Implementations.Sync
return item;
}
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
private bool _disposed;
private void CheckDisposed()
{
@@ -820,38 +809,26 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- private readonly object _disposeLock = new object();
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <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 override void Dispose(bool dispose)
{
if (dispose)
{
_disposed = true;
+ }
+ base.Dispose(dispose);
+ }
- try
- {
- lock (_disposeLock)
- {
- if (_connection != null)
- {
- if (_connection.IsOpen())
- {
- _connection.Close();
- }
-
- _connection.Dispose();
- _connection = null;
- }
- }
- }
- catch (Exception ex)
+ protected override void CloseConnection()
+ {
+ if (_connection != null)
+ {
+ if (_connection.IsOpen())
{
- _logger.ErrorException("Error disposing database", ex);
+ _connection.Close();
}
+
+ _connection.Dispose();
+ _connection = null;
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
index 41d56d959..b7d9dd152 100644
--- a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
+++ b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
@@ -60,46 +60,61 @@ namespace MediaBrowser.Server.Implementations.Sync
return _fileSystem.GetValidFilename(filename);
}
- private async Task EnsureData(CancellationToken cancellationToken)
+ private async Task<List<LocalItem>> RetrieveItems(CancellationToken cancellationToken)
{
- if (_items == null)
- {
- _logger.Debug("Getting {0} from {1}", string.Join(MediaSync.PathSeparatorString, GetRemotePath().ToArray()), _provider.Name);
+ _logger.Debug("Getting {0} from {1}", string.Join(MediaSync.PathSeparatorString, GetRemotePath().ToArray()), _provider.Name);
- var fileResult = await _provider.GetFiles(new FileQuery
- {
- FullPath = GetRemotePath().ToArray()
+ var fileResult = await _provider.GetFiles(new FileQuery
+ {
+ FullPath = GetRemotePath().ToArray()
- }, _target, cancellationToken).ConfigureAwait(false);
+ }, _target, cancellationToken).ConfigureAwait(false);
- if (fileResult.Items.Length > 0)
- {
- using (var stream = await _provider.GetFile(fileResult.Items[0].Id, _target, new Progress<double>(), cancellationToken))
- {
- _items = _json.DeserializeFromStream<List<LocalItem>>(stream);
- }
- }
- else
+ if (fileResult.Items.Length > 0)
+ {
+ using (var stream = await _provider.GetFile(fileResult.Items[0].Id, _target, new Progress<double>(), cancellationToken))
{
- _items = new List<LocalItem>();
+ return _json.DeserializeFromStream<List<LocalItem>>(stream);
}
}
+
+ return new List<LocalItem>();
+ }
+
+ private async Task EnsureData(CancellationToken cancellationToken)
+ {
+ if (_items == null)
+ {
+ _items = await RetrieveItems(cancellationToken).ConfigureAwait(false);
+ }
}
- private async Task SaveData(CancellationToken cancellationToken)
+ private async Task SaveData(List<LocalItem> items, CancellationToken cancellationToken)
{
using (var stream = new MemoryStream())
{
- _json.SerializeToStream(_items, stream);
+ _json.SerializeToStream(items, stream);
// Save to sync provider
stream.Position = 0;
- await _provider.SendFile(stream, GetRemotePath(), _target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
+ var remotePath = GetRemotePath();
+ _logger.Debug("Saving data.json to {0}. Remote path: {1}", _provider.Name, string.Join("/", remotePath));
+
+ await _provider.SendFile(stream, remotePath, _target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
}
}
- private async Task<T> GetData<T>(Func<List<LocalItem>, T> dataFactory)
+ private async Task<T> GetData<T>(bool enableCache, Func<List<LocalItem>, T> dataFactory)
{
+ if (!enableCache)
+ {
+ var items = await RetrieveItems(CancellationToken.None).ConfigureAwait(false);
+ var newCache = items.ToList();
+ var result = dataFactory(items);
+ await UpdateCache(newCache).ConfigureAwait(false);
+ return result;
+ }
+
await _dataLock.WaitAsync().ConfigureAwait(false);
try
@@ -116,15 +131,20 @@ namespace MediaBrowser.Server.Implementations.Sync
private async Task UpdateData(Func<List<LocalItem>, List<LocalItem>> action)
{
+ var items = await RetrieveItems(CancellationToken.None).ConfigureAwait(false);
+ items = action(items);
+ await SaveData(items.ToList(), CancellationToken.None).ConfigureAwait(false);
+
+ await UpdateCache(null).ConfigureAwait(false);
+ }
+
+ private async Task UpdateCache(List<LocalItem> list)
+ {
await _dataLock.WaitAsync().ConfigureAwait(false);
try
{
- await EnsureData(CancellationToken.None).ConfigureAwait(false);
-
- _items = action(_items);
-
- await SaveData(CancellationToken.None).ConfigureAwait(false);
+ _items = list;
}
finally
{
@@ -134,7 +154,7 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task<List<LocalItem>> GetLocalItems(SyncTarget target, string serverId)
{
- return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)).ToList());
+ return GetData(false, items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)).ToList());
}
public Task AddOrUpdate(SyncTarget target, LocalItem item)
@@ -157,17 +177,17 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task<LocalItem> Get(SyncTarget target, string id)
{
- return GetData(items => items.FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase)));
+ return GetData(true, items => items.FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase)));
}
public Task<List<LocalItem>> GetItems(SyncTarget target, string serverId, string itemId)
{
- return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)).ToList());
+ return GetData(true, items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)).ToList());
}
public Task<List<LocalItem>> GetItemsBySyncJobItemId(SyncTarget target, string serverId, string syncJobItemId)
{
- return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.SyncJobItemId, syncJobItemId, StringComparison.OrdinalIgnoreCase)).ToList());
+ return GetData(false, items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.SyncJobItemId, syncJobItemId, StringComparison.OrdinalIgnoreCase)).ToList());
}
}
}