|
@@ -78,8 +78,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
private IDbCommand _saveAncestorCommand;
|
|
|
|
|
|
private IDbCommand _updateInheritedRatingCommand;
|
|
|
+ private IDbCommand _updateInheritedTagsCommand;
|
|
|
|
|
|
- private const int LatestSchemaVersion = 58;
|
|
|
+ private const int LatestSchemaVersion = 61;
|
|
|
|
|
|
/// <summary>
|
|
|
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
|
|
@@ -135,7 +136,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
"create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
|
|
|
"create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
|
|
|
"create index if not exists idx_AncestorIds2 on AncestorIds(AncestorIdText)",
|
|
|
-
|
|
|
+
|
|
|
"create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)",
|
|
|
"create index if not exists idxPeopleItemId on People(ItemId)",
|
|
|
"create index if not exists idxPeopleName on People(Name)",
|
|
@@ -224,6 +225,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
_connection.AddColumn(Logger, "TypedBaseItems", "CriticRating", "Float");
|
|
|
_connection.AddColumn(Logger, "TypedBaseItems", "CriticRatingSummary", "Text");
|
|
|
_connection.AddColumn(Logger, "TypedBaseItems", "DateModifiedDuringLastRefresh", "DATETIME");
|
|
|
+ _connection.AddColumn(Logger, "TypedBaseItems", "InheritedTags", "Text");
|
|
|
|
|
|
PrepareStatements();
|
|
|
|
|
@@ -402,7 +404,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
"guid",
|
|
|
"type",
|
|
|
"data",
|
|
|
- "Path",
|
|
|
+ "Path",
|
|
|
"StartDate",
|
|
|
"EndDate",
|
|
|
"ChannelId",
|
|
@@ -462,7 +464,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
"TrailerTypes",
|
|
|
"CriticRating",
|
|
|
"CriticRatingSummary",
|
|
|
- "DateModifiedDuringLastRefresh"
|
|
|
+ "DateModifiedDuringLastRefresh",
|
|
|
+ "InheritedTags"
|
|
|
};
|
|
|
_saveItemCommand = _connection.CreateCommand();
|
|
|
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
|
|
@@ -540,8 +543,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
|
|
|
_updateInheritedRatingCommand = _connection.CreateCommand();
|
|
|
_updateInheritedRatingCommand.CommandText = "Update TypedBaseItems set InheritedParentalRatingValue=@InheritedParentalRatingValue where Guid=@Guid";
|
|
|
- _updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@InheritedParentalRatingValue");
|
|
|
_updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@Guid");
|
|
|
+ _updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@InheritedParentalRatingValue");
|
|
|
+
|
|
|
+ _updateInheritedTagsCommand = _connection.CreateCommand();
|
|
|
+ _updateInheritedTagsCommand.CommandText = "Update TypedBaseItems set InheritedTags=@InheritedTags where Guid=@Guid";
|
|
|
+ _updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@Guid");
|
|
|
+ _updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@InheritedTags");
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -715,7 +723,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
|
|
|
_saveItemCommand.GetParameter(index++).Value = item.ServiceName;
|
|
|
|
|
|
- _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Tags.ToArray());
|
|
|
+ if (item.Tags.Count > 0)
|
|
|
+ {
|
|
|
+ _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Tags.ToArray());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _saveItemCommand.GetParameter(index++).Value = null;
|
|
|
+ }
|
|
|
+
|
|
|
_saveItemCommand.GetParameter(index++).Value = item.IsFolder;
|
|
|
|
|
|
_saveItemCommand.GetParameter(index++).Value = item.GetBlockUnratedType().ToString();
|
|
@@ -765,6 +781,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
_saveItemCommand.GetParameter(index++).Value = item.DateModifiedDuringLastRefresh.Value;
|
|
|
}
|
|
|
|
|
|
+ var inheritedTags = item.GetInheritedTags();
|
|
|
+ if (inheritedTags.Count > 0)
|
|
|
+ {
|
|
|
+ _saveItemCommand.GetParameter(index++).Value = string.Join("|", inheritedTags.ToArray());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _saveItemCommand.GetParameter(index++).Value = null;
|
|
|
+ }
|
|
|
+
|
|
|
_saveItemCommand.Transaction = transaction;
|
|
|
|
|
|
_saveItemCommand.ExecuteNonQuery();
|
|
@@ -2165,6 +2191,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
excludeTagIndex++;
|
|
|
}
|
|
|
|
|
|
+ excludeTagIndex = 0;
|
|
|
+ foreach (var excludeTag in query.ExcludeInheritedTags)
|
|
|
+ {
|
|
|
+ whereClauses.Add("InheritedTags not like @excludeInheritedTag" + excludeTagIndex);
|
|
|
+ cmd.Parameters.Add(cmd, "@excludeInheritedTag" + excludeTagIndex, DbType.String).Value = "%" + excludeTag + "%";
|
|
|
+ excludeTagIndex++;
|
|
|
+ }
|
|
|
+
|
|
|
if (addPaging)
|
|
|
{
|
|
|
if (query.StartIndex.HasValue && query.StartIndex.Value > 0)
|
|
@@ -2224,6 +2258,88 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
};
|
|
|
|
|
|
public async Task UpdateInheritedValues(CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ await UpdateInheritedParentalRating(cancellationToken).ConfigureAwait(false);
|
|
|
+ await UpdateInheritedTags(cancellationToken).ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateInheritedTags(CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var newValues = new List<Tuple<Guid, string>>();
|
|
|
+
|
|
|
+ using (var cmd = _connection.CreateCommand())
|
|
|
+ {
|
|
|
+ cmd.CommandText = "select Guid,InheritedTags,(select group_concat(Tags, '|') from TypedBaseItems where (guid=outer.guid) OR (guid in (Select AncestorId from AncestorIds where ItemId=Outer.guid))) as NewInheritedTags from typedbaseitems as Outer where NewInheritedTags <> InheritedTags";
|
|
|
+
|
|
|
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
|
|
|
+ {
|
|
|
+ while (reader.Read())
|
|
|
+ {
|
|
|
+ var id = reader.GetGuid(0);
|
|
|
+ string value = reader.IsDBNull(2) ? null : reader.GetString(2);
|
|
|
+
|
|
|
+ newValues.Add(new Tuple<Guid, string>(id, value));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Logger.Debug("UpdateInheritedTags - {0} rows", newValues.Count);
|
|
|
+ if (newValues.Count == 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
+
|
|
|
+ IDbTransaction transaction = null;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ transaction = _connection.BeginTransaction();
|
|
|
+
|
|
|
+ foreach (var item in newValues)
|
|
|
+ {
|
|
|
+ _updateInheritedTagsCommand.GetParameter(0).Value = item.Item1;
|
|
|
+ _updateInheritedTagsCommand.GetParameter(1).Value = item.Item2;
|
|
|
+
|
|
|
+ _updateInheritedTagsCommand.Transaction = transaction;
|
|
|
+ _updateInheritedTagsCommand.ExecuteNonQuery();
|
|
|
+ }
|
|
|
+
|
|
|
+ transaction.Commit();
|
|
|
+ }
|
|
|
+ catch (OperationCanceledException)
|
|
|
+ {
|
|
|
+ if (transaction != null)
|
|
|
+ {
|
|
|
+ transaction.Rollback();
|
|
|
+ }
|
|
|
+
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Logger.ErrorException("Error running query:", e);
|
|
|
+
|
|
|
+ if (transaction != null)
|
|
|
+ {
|
|
|
+ transaction.Rollback();
|
|
|
+ }
|
|
|
+
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ if (transaction != null)
|
|
|
+ {
|
|
|
+ transaction.Dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ WriteLock.Release();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task UpdateInheritedParentalRating(CancellationToken cancellationToken)
|
|
|
{
|
|
|
var newValues = new List<Tuple<Guid, int>>();
|
|
|
|
|
@@ -2243,6 +2359,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ Logger.Debug("UpdateInheritedParentalRatings - {0} rows", newValues.Count);
|
|
|
if (newValues.Count == 0)
|
|
|
{
|
|
|
return;
|