|
@@ -123,17 +123,10 @@ namespace Emby.Server.Implementations.Data
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private SQLiteDatabaseConnection _backgroundConnection;
|
|
|
protected override void CloseConnection()
|
|
|
{
|
|
|
base.CloseConnection();
|
|
|
|
|
|
- if (_backgroundConnection != null)
|
|
|
- {
|
|
|
- _backgroundConnection.Dispose();
|
|
|
- _backgroundConnection = null;
|
|
|
- }
|
|
|
-
|
|
|
if (_shrinkMemoryTimer != null)
|
|
|
{
|
|
|
_shrinkMemoryTimer.Dispose();
|
|
@@ -379,8 +372,6 @@ namespace Emby.Server.Implementations.Data
|
|
|
|
|
|
userDataRepo.Initialize(WriteLock);
|
|
|
|
|
|
- //_backgroundConnection = CreateConnection(true);
|
|
|
-
|
|
|
_shrinkMemoryTimer = _timerFactory.Create(OnShrinkMemoryTimerCallback, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(30));
|
|
|
}
|
|
|
|
|
@@ -1370,6 +1361,10 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
+ if (type == typeof(AudioBook))
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
if (type == typeof(MusicAlbum))
|
|
|
{
|
|
|
return false;
|
|
@@ -2691,51 +2686,55 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- var statements = PrepareAllSafe(connection, string.Join(";", statementTexts.ToArray()))
|
|
|
- .ToList();
|
|
|
-
|
|
|
- if (!isReturningZeroItems)
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- using (var statement = statements[0])
|
|
|
+ var statements = PrepareAllSafe(db, string.Join(";", statementTexts.ToArray()))
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ if (!isReturningZeroItems)
|
|
|
{
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ using (var statement = statements[0])
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- BindSimilarParams(query, statement);
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
|
|
|
- // Running this again will bind the params
|
|
|
- GetWhereClauses(query, statement);
|
|
|
+ // Running this again will bind the params
|
|
|
+ GetWhereClauses(query, statement);
|
|
|
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
- {
|
|
|
- var item = GetItem(row, query);
|
|
|
- if (item != null)
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
{
|
|
|
- list.Add(item);
|
|
|
+ var item = GetItem(row, query);
|
|
|
+ if (item != null)
|
|
|
+ {
|
|
|
+ list.Add(item);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
- {
|
|
|
- using (var statement = statements[statements.Count - 1])
|
|
|
- {
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ using (var statement = statements[statements.Count - 1])
|
|
|
+ {
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- BindSimilarParams(query, statement);
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
|
|
|
- // Running this again will bind the params
|
|
|
- GetWhereClauses(query, statement);
|
|
|
+ // Running this again will bind the params
|
|
|
+ GetWhereClauses(query, statement);
|
|
|
|
|
|
- totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
+ totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ }, ReadTransactionMode);
|
|
|
|
|
|
LogQueryTime("GetItems", commandText, now);
|
|
|
|
|
@@ -3095,49 +3094,53 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- var statements = PrepareAllSafe(connection, string.Join(";", statementTexts.ToArray()))
|
|
|
- .ToList();
|
|
|
-
|
|
|
var totalRecordCount = 0;
|
|
|
|
|
|
- if (!isReturningZeroItems)
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- using (var statement = statements[0])
|
|
|
+ var statements = PrepareAllSafe(db, string.Join(";", statementTexts.ToArray()))
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ if (!isReturningZeroItems)
|
|
|
{
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ using (var statement = statements[0])
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- BindSimilarParams(query, statement);
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
|
|
|
- // Running this again will bind the params
|
|
|
- GetWhereClauses(query, statement);
|
|
|
+ // Running this again will bind the params
|
|
|
+ GetWhereClauses(query, statement);
|
|
|
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
- {
|
|
|
- list.Add(row[0].ReadGuid());
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
+ {
|
|
|
+ list.Add(row[0].ReadGuid());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
- {
|
|
|
- using (var statement = statements[statements.Count - 1])
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
{
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ using (var statement = statements[statements.Count - 1])
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- BindSimilarParams(query, statement);
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
|
|
|
- // Running this again will bind the params
|
|
|
- GetWhereClauses(query, statement);
|
|
|
+ // Running this again will bind the params
|
|
|
+ GetWhereClauses(query, statement);
|
|
|
|
|
|
- totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
+ totalRecordCount = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ }, ReadTransactionMode);
|
|
|
|
|
|
LogQueryTime("GetItemIds", commandText, now);
|
|
|
|
|
@@ -4426,6 +4429,7 @@ namespace Emby.Server.Implementations.Data
|
|
|
typeof(Movie),
|
|
|
typeof(Playlist),
|
|
|
typeof(AudioPodcast),
|
|
|
+ typeof(AudioBook),
|
|
|
typeof(Trailer),
|
|
|
typeof(BoxSet),
|
|
|
typeof(Episode),
|
|
@@ -4594,21 +4598,23 @@ namespace Emby.Server.Implementations.Data
|
|
|
commandText += " order by ListOrder";
|
|
|
|
|
|
var list = new List<string>();
|
|
|
-
|
|
|
using (WriteLock.Read())
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- using (var statement = PrepareStatementSafe(connection, commandText))
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- // Run this again to bind the params
|
|
|
- GetPeopleWhereClauses(query, statement);
|
|
|
-
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
+ using (var statement = PrepareStatementSafe(db, commandText))
|
|
|
{
|
|
|
- list.Add(row.GetString(0));
|
|
|
+ // Run this again to bind the params
|
|
|
+ GetPeopleWhereClauses(query, statement);
|
|
|
+
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
+ {
|
|
|
+ list.Add(row.GetString(0));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ }, ReadTransactionMode);
|
|
|
}
|
|
|
return list;
|
|
|
}
|
|
@@ -4640,16 +4646,19 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- using (var statement = PrepareStatementSafe(connection, commandText))
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- // Run this again to bind the params
|
|
|
- GetPeopleWhereClauses(query, statement);
|
|
|
-
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
+ using (var statement = PrepareStatementSafe(db, commandText))
|
|
|
{
|
|
|
- list.Add(GetPerson(row));
|
|
|
+ // Run this again to bind the params
|
|
|
+ GetPeopleWhereClauses(query, statement);
|
|
|
+
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
+ {
|
|
|
+ list.Add(GetPerson(row));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ }, ReadTransactionMode);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4855,16 +4864,19 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- using (var statement = PrepareStatementSafe(connection, commandText))
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
+ using (var statement = PrepareStatementSafe(db, commandText))
|
|
|
{
|
|
|
- if (!row.IsDBNull(0))
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
{
|
|
|
- list.Add(row.GetString(0));
|
|
|
+ if (!row.IsDBNull(0))
|
|
|
+ {
|
|
|
+ list.Add(row.GetString(0));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }, ReadTransactionMode);
|
|
|
}
|
|
|
}
|
|
|
LogQueryTime("GetItemValueNames", commandText, now);
|
|
@@ -5034,69 +5046,72 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- var statements = PrepareAllSafe(connection, string.Join(";", statementTexts.ToArray())).ToList();
|
|
|
-
|
|
|
- if (!isReturningZeroItems)
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- using (var statement = statements[0])
|
|
|
+ var statements = PrepareAllSafe(db, string.Join(";", statementTexts.ToArray())).ToList();
|
|
|
+
|
|
|
+ if (!isReturningZeroItems)
|
|
|
{
|
|
|
- statement.TryBind("@SelectType", returnType);
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ using (var statement = statements[0])
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ statement.TryBind("@SelectType", returnType);
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- if (typeSubQuery != null)
|
|
|
- {
|
|
|
- GetWhereClauses(typeSubQuery, null, "itemTypes");
|
|
|
- }
|
|
|
- BindSimilarParams(query, statement);
|
|
|
- GetWhereClauses(innerQuery, statement);
|
|
|
- GetWhereClauses(outerQuery, statement);
|
|
|
+ if (typeSubQuery != null)
|
|
|
+ {
|
|
|
+ GetWhereClauses(typeSubQuery, null, "itemTypes");
|
|
|
+ }
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
+ GetWhereClauses(innerQuery, statement);
|
|
|
+ GetWhereClauses(outerQuery, statement);
|
|
|
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
- {
|
|
|
- var item = GetItem(row);
|
|
|
- if (item != null)
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
{
|
|
|
- var countStartColumn = columns.Count - 1;
|
|
|
+ var item = GetItem(row);
|
|
|
+ if (item != null)
|
|
|
+ {
|
|
|
+ var countStartColumn = columns.Count - 1;
|
|
|
|
|
|
- list.Add(new Tuple<BaseItem, ItemCounts>(item, GetItemCounts(row, countStartColumn, typesToCount)));
|
|
|
+ list.Add(new Tuple<BaseItem, ItemCounts>(item, GetItemCounts(row, countStartColumn, typesToCount)));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- LogQueryTime("GetItemValues", commandText, now);
|
|
|
+ LogQueryTime("GetItemValues", commandText, now);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (query.EnableTotalRecordCount)
|
|
|
- {
|
|
|
- commandText = "select count (distinct PresentationUniqueKey)" + GetFromText();
|
|
|
+ if (query.EnableTotalRecordCount)
|
|
|
+ {
|
|
|
+ commandText = "select count (distinct PresentationUniqueKey)" + GetFromText();
|
|
|
|
|
|
- commandText += GetJoinUserDataText(query);
|
|
|
- commandText += whereText;
|
|
|
+ commandText += GetJoinUserDataText(query);
|
|
|
+ commandText += whereText;
|
|
|
|
|
|
- using (var statement = statements[statements.Count - 1])
|
|
|
- {
|
|
|
- statement.TryBind("@SelectType", returnType);
|
|
|
- if (EnableJoinUserData(query))
|
|
|
+ using (var statement = statements[statements.Count - 1])
|
|
|
{
|
|
|
- statement.TryBind("@UserId", query.User.Id);
|
|
|
- }
|
|
|
+ statement.TryBind("@SelectType", returnType);
|
|
|
+ if (EnableJoinUserData(query))
|
|
|
+ {
|
|
|
+ statement.TryBind("@UserId", query.User.Id);
|
|
|
+ }
|
|
|
|
|
|
- if (typeSubQuery != null)
|
|
|
- {
|
|
|
- GetWhereClauses(typeSubQuery, null, "itemTypes");
|
|
|
- }
|
|
|
- BindSimilarParams(query, statement);
|
|
|
- GetWhereClauses(innerQuery, statement);
|
|
|
- GetWhereClauses(outerQuery, statement);
|
|
|
+ if (typeSubQuery != null)
|
|
|
+ {
|
|
|
+ GetWhereClauses(typeSubQuery, null, "itemTypes");
|
|
|
+ }
|
|
|
+ BindSimilarParams(query, statement);
|
|
|
+ GetWhereClauses(innerQuery, statement);
|
|
|
+ GetWhereClauses(outerQuery, statement);
|
|
|
|
|
|
- count = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
+ count = statement.ExecuteQuery().SelectScalarInt().First();
|
|
|
|
|
|
- LogQueryTime("GetItemValues", commandText, now);
|
|
|
+ LogQueryTime("GetItemValues", commandText, now);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ }, ReadTransactionMode);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5344,25 +5359,28 @@ namespace Emby.Server.Implementations.Data
|
|
|
{
|
|
|
using (var connection = CreateConnection(true))
|
|
|
{
|
|
|
- using (var statement = PrepareStatementSafe(connection, cmdText))
|
|
|
+ connection.RunInTransaction(db =>
|
|
|
{
|
|
|
- statement.TryBind("@ItemId", query.ItemId.ToGuidParamValue());
|
|
|
-
|
|
|
- if (query.Type.HasValue)
|
|
|
+ using (var statement = PrepareStatementSafe(db, cmdText))
|
|
|
{
|
|
|
- statement.TryBind("@StreamType", query.Type.Value.ToString());
|
|
|
- }
|
|
|
+ statement.TryBind("@ItemId", query.ItemId.ToGuidParamValue());
|
|
|
|
|
|
- if (query.Index.HasValue)
|
|
|
- {
|
|
|
- statement.TryBind("@StreamIndex", query.Index.Value);
|
|
|
- }
|
|
|
+ if (query.Type.HasValue)
|
|
|
+ {
|
|
|
+ statement.TryBind("@StreamType", query.Type.Value.ToString());
|
|
|
+ }
|
|
|
|
|
|
- foreach (var row in statement.ExecuteQuery())
|
|
|
- {
|
|
|
- list.Add(GetMediaStream(row));
|
|
|
+ if (query.Index.HasValue)
|
|
|
+ {
|
|
|
+ statement.TryBind("@StreamIndex", query.Index.Value);
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var row in statement.ExecuteQuery())
|
|
|
+ {
|
|
|
+ list.Add(GetMediaStream(row));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ }, ReadTransactionMode);
|
|
|
}
|
|
|
}
|
|
|
|