aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sync/SyncRepository.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs336
1 files changed, 235 insertions, 101 deletions
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index 151860d84..05d804cbb 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -1,7 +1,9 @@
using MediaBrowser.Controller;
using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Sync;
using MediaBrowser.Server.Implementations.Persistence;
using System;
@@ -23,20 +25,26 @@ namespace MediaBrowser.Server.Implementations.Sync
private readonly IServerApplicationPaths _appPaths;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+ private IDbCommand _insertJobCommand;
+ private IDbCommand _updateJobCommand;
private IDbCommand _deleteJobCommand;
+
private IDbCommand _deleteJobItemsCommand;
- private IDbCommand _saveJobCommand;
- private IDbCommand _saveJobItemCommand;
+ private IDbCommand _insertJobItemCommand;
+ private IDbCommand _updateJobItemCommand;
+
+ private readonly IJsonSerializer _json;
- public SyncRepository(ILogger logger, IServerApplicationPaths appPaths)
+ public SyncRepository(ILogger logger, IServerApplicationPaths appPaths, IJsonSerializer json)
{
_logger = logger;
_appPaths = appPaths;
+ _json = json;
}
public async Task Initialize()
{
- var dbFile = Path.Combine(_appPaths.DataPath, "sync11.db");
+ var dbFile = Path.Combine(_appPaths.DataPath, "sync14.db");
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
@@ -45,7 +53,7 @@ namespace MediaBrowser.Server.Implementations.Sync
"create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)",
"create index if not exists idx_SyncJobs on SyncJobs(Id)",
- "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, RequiresConversion BIT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)",
+ "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, TemporaryPath TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT, AdditionalFiles TEXT, MediaSource TEXT, IsMarkedForRemoval BIT, JobItemIndex INT)",
"create index if not exists idx_SyncJobItems on SyncJobs(Id)",
//pragmas
@@ -61,52 +69,101 @@ namespace MediaBrowser.Server.Implementations.Sync
private void PrepareStatements()
{
+ // _deleteJobCommand
_deleteJobCommand = _connection.CreateCommand();
_deleteJobCommand.CommandText = "delete from SyncJobs where Id=@Id";
_deleteJobCommand.Parameters.Add(_deleteJobCommand, "@Id");
+ // _deleteJobItemsCommand
_deleteJobItemsCommand = _connection.CreateCommand();
_deleteJobItemsCommand.CommandText = "delete from SyncJobItems where JobId=@JobId";
_deleteJobItemsCommand.Parameters.Add(_deleteJobItemsCommand, "@JobId");
- _saveJobCommand = _connection.CreateCommand();
- _saveJobCommand.CommandText = "replace into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)";
-
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Id");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@TargetId");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Name");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Quality");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Status");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Progress");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@UserId");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemIds");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@Category");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@ParentId");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@UnwatchedOnly");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemLimit");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@SyncNewContent");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateCreated");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@DateLastModified");
- _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount");
-
- _saveJobItemCommand = _connection.CreateCommand();
- _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, RequiresConversion, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @RequiresConversion, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)";
-
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Id");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemId");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemName");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@MediaSourceId");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@JobId");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@RequiresConversion");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@OutputPath");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Status");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@TargetId");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@DateCreated");
- _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Progress");
+ // _insertJobCommand
+ _insertJobCommand = _connection.CreateCommand();
+ _insertJobCommand.CommandText = "insert into SyncJobs (Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount) values (@Id, @TargetId, @Name, @Quality, @Status, @Progress, @UserId, @ItemIds, @Category, @ParentId, @UnwatchedOnly, @ItemLimit, @SyncNewContent, @DateCreated, @DateLastModified, @ItemCount)";
+
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Id");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@TargetId");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Name");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Quality");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Status");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Progress");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@UserId");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@ItemIds");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@Category");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@ParentId");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@UnwatchedOnly");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@ItemLimit");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@SyncNewContent");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@DateCreated");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@DateLastModified");
+ _insertJobCommand.Parameters.Add(_insertJobCommand, "@ItemCount");
+
+ // _updateJobCommand
+ _updateJobCommand = _connection.CreateCommand();
+ _updateJobCommand.CommandText = "update SyncJobs set TargetId=@TargetId,Name=@Name,Quality=@Quality,Status=@Status,Progress=@Progress,UserId=@UserId,ItemIds=@ItemIds,Category=@Category,ParentId=@ParentId,UnwatchedOnly=@UnwatchedOnly,ItemLimit=@ItemLimit,SyncNewContent=@SyncNewContent,DateCreated=@DateCreated,DateLastModified=@DateLastModified,ItemCount=@ItemCount where Id=@ID";
+
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Id");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@TargetId");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Name");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Quality");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Status");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Progress");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@UserId");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@ItemIds");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@Category");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@ParentId");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@UnwatchedOnly");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@ItemLimit");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@SyncNewContent");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@DateCreated");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@DateLastModified");
+ _updateJobCommand.Parameters.Add(_updateJobCommand, "@ItemCount");
+
+ // _insertJobItemCommand
+ _insertJobItemCommand = _connection.CreateCommand();
+ _insertJobItemCommand.CommandText = "insert into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource, IsMarkedForRemoval, JobItemIndex) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @TemporaryPath, @OutputPath, @Status, @TargetId, @DateCreated, @Progress, @AdditionalFiles, @MediaSource, @IsMarkedForRemoval, @JobItemIndex)";
+
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@Id");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@ItemId");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@ItemName");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@MediaSourceId");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@JobId");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@TemporaryPath");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@OutputPath");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@Status");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@TargetId");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@DateCreated");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@Progress");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@AdditionalFiles");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@MediaSource");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@IsMarkedForRemoval");
+ _insertJobItemCommand.Parameters.Add(_insertJobItemCommand, "@JobItemIndex");
+
+ // _updateJobItemCommand
+ _updateJobItemCommand = _connection.CreateCommand();
+ _updateJobItemCommand.CommandText = "update SyncJobItems set ItemId=@ItemId,ItemName=@ItemName,MediaSourceId=@MediaSourceId,JobId=@JobId,TemporaryPath=@TemporaryPath,OutputPath=@OutputPath,Status=@Status,TargetId=@TargetId,DateCreated=@DateCreated,Progress=@Progress,AdditionalFiles=@AdditionalFiles,MediaSource=@MediaSource,IsMarkedForRemoval=@IsMarkedForRemoval,JobItemIndex=@JobItemIndex where Id=@Id";
+
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@Id");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@ItemId");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@ItemName");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@MediaSourceId");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@JobId");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@TemporaryPath");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@OutputPath");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@Status");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@TargetId");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@DateCreated");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@Progress");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@AdditionalFiles");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@MediaSource");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@IsMarkedForRemoval");
+ _updateJobItemCommand.Parameters.Add(_updateJobItemCommand, "@JobItemIndex");
}
private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs";
- private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, RequiresConversion, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems";
+ private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, TemporaryPath, OutputPath, Status, TargetId, DateCreated, Progress, AdditionalFiles, MediaSource, IsMarkedForRemoval, JobItemIndex from SyncJobItems";
public SyncJob GetJob(string id)
{
@@ -115,6 +172,8 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentNullException("id");
}
+ CheckDisposed();
+
var guid = new Guid(id);
if (guid == Guid.Empty)
@@ -205,16 +264,23 @@ namespace MediaBrowser.Server.Implementations.Sync
public Task Create(SyncJob job)
{
- return Update(job);
+ return InsertOrUpdate(job, _insertJobCommand);
}
- public async Task Update(SyncJob job)
+ public Task Update(SyncJob job)
+ {
+ return InsertOrUpdate(job, _updateJobCommand);
+ }
+
+ private async Task InsertOrUpdate(SyncJob job, IDbCommand cmd)
{
if (job == null)
{
throw new ArgumentNullException("job");
}
+ CheckDisposed();
+
await _writeLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -225,26 +291,26 @@ namespace MediaBrowser.Server.Implementations.Sync
var index = 0;
- _saveJobCommand.GetParameter(index++).Value = new Guid(job.Id);
- _saveJobCommand.GetParameter(index++).Value = job.TargetId;
- _saveJobCommand.GetParameter(index++).Value = job.Name;
- _saveJobCommand.GetParameter(index++).Value = job.Quality;
- _saveJobCommand.GetParameter(index++).Value = job.Status.ToString();
- _saveJobCommand.GetParameter(index++).Value = job.Progress;
- _saveJobCommand.GetParameter(index++).Value = job.UserId;
- _saveJobCommand.GetParameter(index++).Value = string.Join(",", job.RequestedItemIds.ToArray());
- _saveJobCommand.GetParameter(index++).Value = job.Category;
- _saveJobCommand.GetParameter(index++).Value = job.ParentId;
- _saveJobCommand.GetParameter(index++).Value = job.UnwatchedOnly;
- _saveJobCommand.GetParameter(index++).Value = job.ItemLimit;
- _saveJobCommand.GetParameter(index++).Value = job.SyncNewContent;
- _saveJobCommand.GetParameter(index++).Value = job.DateCreated;
- _saveJobCommand.GetParameter(index++).Value = job.DateLastModified;
- _saveJobCommand.GetParameter(index++).Value = job.ItemCount;
-
- _saveJobCommand.Transaction = transaction;
-
- _saveJobCommand.ExecuteNonQuery();
+ cmd.GetParameter(index++).Value = new Guid(job.Id);
+ cmd.GetParameter(index++).Value = job.TargetId;
+ cmd.GetParameter(index++).Value = job.Name;
+ cmd.GetParameter(index++).Value = job.Quality;
+ cmd.GetParameter(index++).Value = job.Status.ToString();
+ cmd.GetParameter(index++).Value = job.Progress;
+ cmd.GetParameter(index++).Value = job.UserId;
+ cmd.GetParameter(index++).Value = string.Join(",", job.RequestedItemIds.ToArray());
+ cmd.GetParameter(index++).Value = job.Category;
+ cmd.GetParameter(index++).Value = job.ParentId;
+ cmd.GetParameter(index++).Value = job.UnwatchedOnly;
+ cmd.GetParameter(index++).Value = job.ItemLimit;
+ cmd.GetParameter(index++).Value = job.SyncNewContent;
+ cmd.GetParameter(index++).Value = job.DateCreated;
+ cmd.GetParameter(index++).Value = job.DateLastModified;
+ cmd.GetParameter(index++).Value = job.ItemCount;
+
+ cmd.Transaction = transaction;
+
+ cmd.ExecuteNonQuery();
transaction.Commit();
}
@@ -286,6 +352,8 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentNullException("id");
}
+ CheckDisposed();
+
await _writeLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -345,34 +413,34 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentNullException("query");
}
+ CheckDisposed();
+
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = BaseJobSelectText;
var whereClauses = new List<string>();
- if (query.IsCompleted.HasValue)
+ if (query.Statuses.Count > 0)
{
- if (query.IsCompleted.Value)
- {
- whereClauses.Add("Status=@Status");
- }
- else
- {
- whereClauses.Add("Status<>@Status");
- }
- cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString();
+ var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());
+
+ whereClauses.Add(string.Format("Status in ({0})", statuses));
}
if (!string.IsNullOrWhiteSpace(query.TargetId))
{
whereClauses.Add("TargetId=@TargetId");
- cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
}
if (!string.IsNullOrWhiteSpace(query.UserId))
{
whereClauses.Add("UserId=@UserId");
cmd.Parameters.Add(cmd, "@UserId", DbType.String).Value = query.UserId;
}
+ if (query.SyncNewContent.HasValue)
+ {
+ whereClauses.Add("SyncNewContent=@SyncNewContent");
+ cmd.Parameters.Add(cmd, "@SyncNewContent", DbType.Boolean).Value = query.SyncNewContent.Value;
+ }
var whereTextWithoutPaging = whereClauses.Count == 0 ?
string.Empty :
@@ -381,7 +449,7 @@ namespace MediaBrowser.Server.Implementations.Sync
var startIndex = query.StartIndex ?? 0;
if (startIndex > 0)
{
- whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY DateLastModified DESC LIMIT {0})",
+ whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC LIMIT {0})",
startIndex.ToString(_usCulture)));
}
@@ -390,7 +458,8 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
}
- cmd.CommandText += " ORDER BY DateLastModified DESC";
+ cmd.CommandText += " ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC";
+ cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
if (query.Limit.HasValue)
{
@@ -430,6 +499,8 @@ namespace MediaBrowser.Server.Implementations.Sync
throw new ArgumentNullException("id");
}
+ CheckDisposed();
+
var guid = new Guid(id);
using (var cmd = _connection.CreateCommand())
@@ -450,7 +521,7 @@ namespace MediaBrowser.Server.Implementations.Sync
return null;
}
- public QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query)
+ private QueryResult<T> GetJobItemReader<T>(SyncJobItemQuery query, string baseSelectText, Func<IDataReader, T> itemFactory)
{
if (query == null)
{
@@ -459,7 +530,7 @@ namespace MediaBrowser.Server.Implementations.Sync
using (var cmd = _connection.CreateCommand())
{
- cmd.CommandText = BaseJobItemSelectText;
+ cmd.CommandText = baseSelectText;
var whereClauses = new List<string>();
@@ -488,7 +559,7 @@ namespace MediaBrowser.Server.Implementations.Sync
var startIndex = query.StartIndex ?? 0;
if (startIndex > 0)
{
- whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobItems ORDER BY DateCreated LIMIT {0})",
+ whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobItems ORDER BY JobItemIndex, DateCreated LIMIT {0})",
startIndex.ToString(_usCulture)));
}
@@ -497,7 +568,7 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
}
- cmd.CommandText += " ORDER BY DateCreated";
+ cmd.CommandText += " ORDER BY JobItemIndex, DateCreated";
if (query.Limit.HasValue)
{
@@ -506,14 +577,14 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.CommandText += "; select count (Id) from SyncJobItems" + whereTextWithoutPaging;
- var list = new List<SyncJobItem>();
+ var list = new List<T>();
var count = 0;
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
- list.Add(GetJobItem(reader));
+ list.Add(itemFactory(reader));
}
if (reader.NextResult() && reader.Read())
@@ -522,7 +593,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- return new QueryResult<SyncJobItem>()
+ return new QueryResult<T>()
{
Items = list.ToArray(),
TotalRecordCount = count
@@ -530,18 +601,35 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
+ public QueryResult<string> GetLibraryItemIds(SyncJobItemQuery query)
+ {
+ return GetJobItemReader(query, "select ItemId from SyncJobItems", GetItemId);
+ }
+
+ public QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query)
+ {
+ return GetJobItemReader(query, BaseJobItemSelectText, GetJobItem);
+ }
+
public Task Create(SyncJobItem jobItem)
{
- return Update(jobItem);
+ return InsertOrUpdate(jobItem, _insertJobItemCommand);
}
- public async Task Update(SyncJobItem jobItem)
+ public Task Update(SyncJobItem jobItem)
+ {
+ return InsertOrUpdate(jobItem, _updateJobItemCommand);
+ }
+
+ private async Task InsertOrUpdate(SyncJobItem jobItem, IDbCommand cmd)
{
if (jobItem == null)
{
throw new ArgumentNullException("jobItem");
}
+ CheckDisposed();
+
await _writeLock.WaitAsync().ConfigureAwait(false);
IDbTransaction transaction = null;
@@ -552,21 +640,25 @@ namespace MediaBrowser.Server.Implementations.Sync
var index = 0;
- _saveJobItemCommand.GetParameter(index++).Value = new Guid(jobItem.Id);
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemId;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemName;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.MediaSourceId;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.JobId;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.RequiresConversion;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.Status.ToString();
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.TargetId;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.DateCreated;
- _saveJobItemCommand.GetParameter(index++).Value = jobItem.Progress;
-
- _saveJobItemCommand.Transaction = transaction;
-
- _saveJobItemCommand.ExecuteNonQuery();
+ cmd.GetParameter(index++).Value = new Guid(jobItem.Id);
+ cmd.GetParameter(index++).Value = jobItem.ItemId;
+ cmd.GetParameter(index++).Value = jobItem.ItemName;
+ cmd.GetParameter(index++).Value = jobItem.MediaSourceId;
+ cmd.GetParameter(index++).Value = jobItem.JobId;
+ cmd.GetParameter(index++).Value = jobItem.TemporaryPath;
+ cmd.GetParameter(index++).Value = jobItem.OutputPath;
+ cmd.GetParameter(index++).Value = jobItem.Status.ToString();
+ cmd.GetParameter(index++).Value = jobItem.TargetId;
+ cmd.GetParameter(index++).Value = jobItem.DateCreated;
+ cmd.GetParameter(index++).Value = jobItem.Progress;
+ cmd.GetParameter(index++).Value = _json.SerializeToString(jobItem.AdditionalFiles);
+ cmd.GetParameter(index++).Value = jobItem.MediaSource == null ? null : _json.SerializeToString(jobItem.MediaSource);
+ cmd.GetParameter(index++).Value = jobItem.IsMarkedForRemoval;
+ cmd.GetParameter(index++).Value = jobItem.JobItemIndex;
+
+ cmd.Transaction = transaction;
+
+ cmd.ExecuteNonQuery();
transaction.Commit();
}
@@ -620,8 +712,11 @@ namespace MediaBrowser.Server.Implementations.Sync
}
info.JobId = reader.GetString(4);
- info.RequiresConversion = reader.GetBoolean(5);
+ if (!reader.IsDBNull(5))
+ {
+ info.TemporaryPath = reader.GetString(5);
+ }
if (!reader.IsDBNull(6))
{
info.OutputPath = reader.GetString(6);
@@ -634,16 +729,44 @@ namespace MediaBrowser.Server.Implementations.Sync
info.TargetId = reader.GetString(8);
- info.DateCreated = reader.GetDateTime(9);
+ info.DateCreated = reader.GetDateTime(9).ToUniversalTime();
if (!reader.IsDBNull(10))
{
info.Progress = reader.GetDouble(10);
}
+ if (!reader.IsDBNull(11))
+ {
+ var json = reader.GetString(11);
+
+ if (!string.IsNullOrWhiteSpace(json))
+ {
+ info.AdditionalFiles = _json.DeserializeFromString<List<ItemFileInfo>>(json);
+ }
+ }
+
+ if (!reader.IsDBNull(12))
+ {
+ var json = reader.GetString(12);
+
+ if (!string.IsNullOrWhiteSpace(json))
+ {
+ info.MediaSource = _json.DeserializeFromString<MediaSourceInfo>(json);
+ }
+ }
+
+ info.IsMarkedForRemoval = reader.GetBoolean(13);
+ info.JobItemIndex = reader.GetInt32(14);
+
return info;
}
+ private string GetItemId(IDataReader reader)
+ {
+ return reader.GetString(0);
+ }
+
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
@@ -653,6 +776,15 @@ namespace MediaBrowser.Server.Implementations.Sync
GC.SuppressFinalize(this);
}
+ private bool _disposed;
+ private void CheckDisposed()
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException(GetType().Name + " has been disposed and cannot be accessed.");
+ }
+ }
+
private readonly object _disposeLock = new object();
/// <summary>
@@ -663,6 +795,8 @@ namespace MediaBrowser.Server.Implementations.Sync
{
if (dispose)
{
+ _disposed = true;
+
try
{
lock (_disposeLock)