update userdata repository

This commit is contained in:
Luke Pulverenti 2016-11-19 15:10:59 -05:00
parent eef52bc70f
commit 9d1b4e1074

View File

@ -1,446 +1,331 @@
//using System; using System;
//using System.Collections.Generic; using System.Collections.Generic;
//using System.Globalization; using System.IO;
//using System.IO; using System.Linq;
//using System.Text; using System.Threading;
//using System.Threading; using System.Threading.Tasks;
//using System.Threading.Tasks; using MediaBrowser.Common.Configuration;
//using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Entities;
//using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Persistence;
//using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Logging;
//using MediaBrowser.Model.Logging; using SQLitePCL.pretty;
//using SQLitePCL.pretty;
namespace Emby.Server.Implementations.Data
//namespace Emby.Server.Implementations.Data {
//{ public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
// public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository {
// { private SQLiteDatabaseConnection _connection;
// private SQLiteDatabaseConnection _connection;
public SqliteUserDataRepository(ILogger logger, IApplicationPaths appPaths)
// public SqliteUserDataRepository(ILogger logger, IApplicationPaths appPaths) : base(logger)
// : base(logger) {
// { DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db");
// DbFilePath = Path.Combine(appPaths.DataPath, "userdata_v2.db"); }
// }
protected override bool EnableConnectionPooling
// protected override bool EnableConnectionPooling {
// { get { return false; }
// get { return false; } }
// }
/// <summary>
// /// <summary> /// Gets the name of the repository
// /// Gets the name of the repository /// </summary>
// /// </summary> /// <value>The name.</value>
// /// <value>The name.</value> public string Name
// public string Name {
// { get
// get {
// { return "SQLite";
// return "SQLite"; }
// } }
// }
/// <summary>
// /// <summary> /// Opens the connection to the database
// /// Opens the connection to the database /// </summary>
// /// </summary> /// <returns>Task.</returns>
// /// <returns>Task.</returns> public void Initialize(SQLiteDatabaseConnection connection, ReaderWriterLockSlim writeLock)
// public void Initialize(SQLiteDatabaseConnection connection, ReaderWriterLockSlim writeLock) {
// { WriteLock.Dispose();
// WriteLock.Dispose(); WriteLock = writeLock;
// WriteLock = writeLock; _connection = connection;
// _connection = connection;
string[] queries = {
// string[] queries = {
"create table if not exists UserDataDb.userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)",
// "create table if not exists UserDataDb.userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)",
"drop index if exists UserDataDb.idx_userdata",
// "drop index if exists UserDataDb.idx_userdata", "drop index if exists UserDataDb.idx_userdata1",
// "drop index if exists UserDataDb.idx_userdata1", "drop index if exists UserDataDb.idx_userdata2",
// "drop index if exists UserDataDb.idx_userdata2", "drop index if exists UserDataDb.userdataindex1",
// "drop index if exists UserDataDb.userdataindex1",
"create unique index if not exists UserDataDb.userdataindex on userdata (key, userId)",
// "create unique index if not exists UserDataDb.userdataindex on userdata (key, userId)", "create index if not exists UserDataDb.userdataindex2 on userdata (key, userId, played)",
// "create index if not exists UserDataDb.userdataindex2 on userdata (key, userId, played)", "create index if not exists UserDataDb.userdataindex3 on userdata (key, userId, playbackPositionTicks)",
// "create index if not exists UserDataDb.userdataindex3 on userdata (key, userId, playbackPositionTicks)", "create index if not exists UserDataDb.userdataindex4 on userdata (key, userId, isFavorite)",
// "create index if not exists UserDataDb.userdataindex4 on userdata (key, userId, isFavorite)",
//pragmas
// //pragmas "pragma temp_store = memory",
// "pragma temp_store = memory",
"pragma shrink_memory"
// "pragma shrink_memory" };
// };
_connection.RunQueries(queries);
// _connection.RunQueries(queries);
connection.RunInTransaction(db =>
// connection.RunInTransaction(db => {
// { var existingColumnNames = GetColumnNames(db, "userdata");
// var existingColumnNames = GetColumnNames(db, "userdata");
AddColumn(db, "userdata", "AudioStreamIndex", "int", existingColumnNames);
// AddColumn(db, "userdata", "AudioStreamIndex", "int", existingColumnNames); AddColumn(db, "userdata", "SubtitleStreamIndex", "int", existingColumnNames);
// AddColumn(db, "userdata", "SubtitleStreamIndex", "int", existingColumnNames); });
// }); }
// }
/// <summary>
// /// <summary> /// Saves the user data.
// /// Saves the user data. /// </summary>
// /// </summary> /// <param name="userId">The user id.</param>
// /// <param name="userId">The user id.</param> /// <param name="key">The key.</param>
// /// <param name="key">The key.</param> /// <param name="userData">The user data.</param>
// /// <param name="userData">The user data.</param> /// <param name="cancellationToken">The cancellation token.</param>
// /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns>
// /// <returns>Task.</returns> /// <exception cref="System.ArgumentNullException">userData
// /// <exception cref="System.ArgumentNullException">userData /// or
// /// or /// cancellationToken
// /// cancellationToken /// or
// /// or /// userId
// /// userId /// or
// /// or /// userDataId</exception>
// /// userDataId</exception> public Task SaveUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken)
// public Task SaveUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken) {
// { if (userData == null)
// if (userData == null) {
// { throw new ArgumentNullException("userData");
// throw new ArgumentNullException("userData"); }
// } if (userId == Guid.Empty)
// if (userId == Guid.Empty) {
// { throw new ArgumentNullException("userId");
// throw new ArgumentNullException("userId"); }
// } if (string.IsNullOrEmpty(key))
// if (string.IsNullOrEmpty(key)) {
// { throw new ArgumentNullException("key");
// throw new ArgumentNullException("key"); }
// }
return PersistUserData(userId, key, userData, cancellationToken);
// return PersistUserData(userId, key, userData, cancellationToken); }
// }
public Task SaveAllUserData(Guid userId, IEnumerable<UserItemData> userData, CancellationToken cancellationToken)
// public Task SaveAllUserData(Guid userId, IEnumerable<UserItemData> userData, CancellationToken cancellationToken) {
// { if (userData == null)
// if (userData == null) {
// { throw new ArgumentNullException("userData");
// throw new ArgumentNullException("userData"); }
// } if (userId == Guid.Empty)
// if (userId == Guid.Empty) {
// { throw new ArgumentNullException("userId");
// throw new ArgumentNullException("userId"); }
// }
return PersistAllUserData(userId, userData.ToList(), cancellationToken);
// return PersistAllUserData(userId, userData, cancellationToken); }
// }
/// <summary>
// /// <summary> /// Persists the user data.
// /// Persists the user data. /// </summary>
// /// </summary> /// <param name="userId">The user id.</param>
// /// <param name="userId">The user id.</param> /// <param name="key">The key.</param>
// /// <param name="key">The key.</param> /// <param name="userData">The user data.</param>
// /// <param name="userData">The user data.</param> /// <param name="cancellationToken">The cancellation token.</param>
// /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns>
// /// <returns>Task.</returns> public async Task PersistUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken)
// public async Task PersistUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken) {
// { cancellationToken.ThrowIfCancellationRequested();
// cancellationToken.ThrowIfCancellationRequested();
using (WriteLock.Write())
// await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); {
_connection.RunInTransaction(db =>
// IDbTransaction transaction = null; {
SaveUserData(db, userId, key, userData);
// try });
// { }
// transaction = _connection.BeginTransaction(); }
// using (var cmd = _connection.CreateCommand()) private void SaveUserData(IDatabaseConnection db, Guid userId, string key, UserItemData userData)
// { {
// cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"; var paramList = new List<object>();
var commandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (?, ?, ?,?,?,?,?,?,?,?)";
// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; paramList.Add(key);
// cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userData.Rating; paramList.Add(userId.ToGuidParamValue());
// cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userData.Played; paramList.Add(userData.Rating);
// cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userData.PlayCount; paramList.Add(userData.Played);
// cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userData.IsFavorite; paramList.Add(userData.PlayCount);
// cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userData.PlaybackPositionTicks; paramList.Add(userData.IsFavorite);
// cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userData.LastPlayedDate; paramList.Add(userData.PlaybackPositionTicks);
// cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userData.AudioStreamIndex;
// cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userData.SubtitleStreamIndex; if (userData.LastPlayedDate.HasValue)
{
// cmd.Transaction = transaction; paramList.Add(userData.LastPlayedDate.Value.ToDateTimeParamValue());
}
// cmd.ExecuteNonQuery(); else
// } {
paramList.Add(null);
// transaction.Commit(); }
// } paramList.Add(userData.AudioStreamIndex);
// catch (OperationCanceledException) paramList.Add(userData.SubtitleStreamIndex);
// {
// if (transaction != null) db.Execute(commandText, paramList.ToArray());
// { }
// transaction.Rollback();
// } /// <summary>
/// Persist all user data for the specified user
// throw; /// </summary>
// } private async Task PersistAllUserData(Guid userId, List<UserItemData> userDataList, CancellationToken cancellationToken)
// catch (Exception e) {
// { cancellationToken.ThrowIfCancellationRequested();
// Logger.ErrorException("Failed to save user data:", e);
using (WriteLock.Write())
// if (transaction != null) {
// { _connection.RunInTransaction(db =>
// transaction.Rollback(); {
// } foreach (var userItemData in userDataList)
{
// throw; SaveUserData(db, userId, userItemData.Key, userItemData);
// } }
// finally });
// { }
// if (transaction != null) }
// {
// transaction.Dispose(); /// <summary>
// } /// Gets the user data.
/// </summary>
// WriteLock.Release(); /// <param name="userId">The user id.</param>
// } /// <param name="key">The key.</param>
// } /// <returns>Task{UserItemData}.</returns>
/// <exception cref="System.ArgumentNullException">
// /// <summary> /// userId
// /// Persist all user data for the specified user /// or
// /// </summary> /// key
// /// <param name="userId"></param> /// </exception>
// /// <param name="userData"></param> public UserItemData GetUserData(Guid userId, string key)
// /// <param name="cancellationToken"></param> {
// /// <returns></returns> if (userId == Guid.Empty)
// private async Task PersistAllUserData(Guid userId, IEnumerable<UserItemData> userData, CancellationToken cancellationToken) {
// { throw new ArgumentNullException("userId");
// cancellationToken.ThrowIfCancellationRequested(); }
if (string.IsNullOrEmpty(key))
// await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false); {
throw new ArgumentNullException("key");
// IDbTransaction transaction = null; }
// try var commandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = ? and userId=?";
// {
// transaction = _connection.BeginTransaction(); var paramList = new List<object>();
paramList.Add(key);
// foreach (var userItemData in userData) paramList.Add(userId.ToGuidParamValue());
// {
// using (var cmd = _connection.CreateCommand()) foreach (var row in _connection.Query(commandText, paramList.ToArray()))
// { {
// cmd.CommandText = "replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)"; return ReadRow(row);
}
// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = userItemData.Key;
// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; return null;
// cmd.Parameters.Add(cmd, "@rating", DbType.Double).Value = userItemData.Rating; }
// cmd.Parameters.Add(cmd, "@played", DbType.Boolean).Value = userItemData.Played;
// cmd.Parameters.Add(cmd, "@playCount", DbType.Int32).Value = userItemData.PlayCount; public UserItemData GetUserData(Guid userId, List<string> keys)
// cmd.Parameters.Add(cmd, "@isFavorite", DbType.Boolean).Value = userItemData.IsFavorite; {
// cmd.Parameters.Add(cmd, "@playbackPositionTicks", DbType.Int64).Value = userItemData.PlaybackPositionTicks; if (userId == Guid.Empty)
// cmd.Parameters.Add(cmd, "@lastPlayedDate", DbType.DateTime).Value = userItemData.LastPlayedDate; {
// cmd.Parameters.Add(cmd, "@AudioStreamIndex", DbType.Int32).Value = userItemData.AudioStreamIndex; throw new ArgumentNullException("userId");
// cmd.Parameters.Add(cmd, "@SubtitleStreamIndex", DbType.Int32).Value = userItemData.SubtitleStreamIndex; }
if (keys == null)
// cmd.Transaction = transaction; {
throw new ArgumentNullException("keys");
// cmd.ExecuteNonQuery(); }
// }
if (keys.Count == 0)
// cancellationToken.ThrowIfCancellationRequested(); {
// } return null;
}
// transaction.Commit();
// } return GetUserData(userId, keys[0]);
// catch (OperationCanceledException) }
// {
// if (transaction != null) /// <summary>
// { /// Return all user-data associated with the given user
// transaction.Rollback(); /// </summary>
// } /// <param name="userId"></param>
/// <returns></returns>
// throw; public IEnumerable<UserItemData> GetAllUserData(Guid userId)
// } {
// catch (Exception e) if (userId == Guid.Empty)
// { {
// Logger.ErrorException("Failed to save user data:", e); throw new ArgumentNullException("userId");
}
// if (transaction != null)
// { var list = new List<UserItemData>();
// transaction.Rollback();
// } using (WriteLock.Read())
{
// throw; var commandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=?";
// }
// finally var paramList = new List<object>();
// { paramList.Add(userId.ToGuidParamValue());
// if (transaction != null)
// { foreach (var row in _connection.Query(commandText, paramList.ToArray()))
// transaction.Dispose(); {
// } list.Add(ReadRow(row));
}
// WriteLock.Release(); }
// }
// } return list;
}
// /// <summary>
// /// Gets the user data. /// <summary>
// /// </summary> /// Read a row from the specified reader into the provided userData object
// /// <param name="userId">The user id.</param> /// </summary>
// /// <param name="key">The key.</param> /// <param name="reader"></param>
// /// <returns>Task{UserItemData}.</returns> private UserItemData ReadRow(IReadOnlyList<IResultSetValue> reader)
// /// <exception cref="System.ArgumentNullException"> {
// /// userId var userData = new UserItemData();
// /// or
// /// key userData.Key = reader[0].ToString();
// /// </exception> userData.UserId = reader[1].ReadGuid();
// public UserItemData GetUserData(Guid userId, string key)
// { if (reader[2].SQLiteType != SQLiteType.Null)
// if (userId == Guid.Empty) {
// { userData.Rating = reader[2].ToDouble();
// throw new ArgumentNullException("userId"); }
// }
// if (string.IsNullOrEmpty(key)) userData.Played = reader[3].ToBool();
// { userData.PlayCount = reader[4].ToInt();
// throw new ArgumentNullException("key"); userData.IsFavorite = reader[5].ToBool();
// } userData.PlaybackPositionTicks = reader[6].ToInt64();
// using (var cmd = _connection.CreateCommand()) if (reader[7].SQLiteType != SQLiteType.Null)
// { {
// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where key = @key and userId=@userId"; userData.LastPlayedDate = reader[7].ReadDateTime();
}
// cmd.Parameters.Add(cmd, "@key", DbType.String).Value = key;
// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId; if (reader[8].SQLiteType != SQLiteType.Null)
{
// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) userData.AudioStreamIndex = reader[8].ToInt();
// { }
// if (reader.Read())
// { if (reader[9].SQLiteType != SQLiteType.Null)
// return ReadRow(reader); {
// } userData.SubtitleStreamIndex = reader[9].ToInt();
// } }
// return null; return userData;
// } }
// }
protected override void Dispose(bool dispose)
// public UserItemData GetUserData(Guid userId, List<string> keys) {
// { // handled by library database
// if (userId == Guid.Empty) }
// {
// throw new ArgumentNullException("userId"); protected override void CloseConnection()
// } {
// if (keys == null) // handled by library database
// { }
// throw new ArgumentNullException("keys"); }
// } }
// using (var cmd = _connection.CreateCommand())
// {
// var index = 0;
// var userdataKeys = new List<string>();
// var builder = new StringBuilder();
// foreach (var key in keys)
// {
// var paramName = "@Key" + index;
// userdataKeys.Add("Key =" + paramName);
// cmd.Parameters.Add(cmd, paramName, DbType.String).Value = key;
// builder.Append(" WHEN Key=" + paramName + " THEN " + index);
// index++;
// break;
// }
// var keyText = string.Join(" OR ", userdataKeys.ToArray());
// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId AND (" + keyText + ") ";
// cmd.CommandText += " ORDER BY (Case " + builder + " Else " + keys.Count.ToString(CultureInfo.InvariantCulture) + " End )";
// cmd.CommandText += " LIMIT 1";
// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
// {
// if (reader.Read())
// {
// return ReadRow(reader);
// }
// }
// return null;
// }
// }
// /// <summary>
// /// Return all user-data associated with the given user
// /// </summary>
// /// <param name="userId"></param>
// /// <returns></returns>
// public IEnumerable<UserItemData> GetAllUserData(Guid userId)
// {
// if (userId == Guid.Empty)
// {
// throw new ArgumentNullException("userId");
// }
// using (var cmd = _connection.CreateCommand())
// {
// cmd.CommandText = "select key,userid,rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex from userdata where userId=@userId";
// cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
// using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
// {
// while (reader.Read())
// {
// yield return ReadRow(reader);
// }
// }
// }
// }
// /// <summary>
// /// Read a row from the specified reader into the provided userData object
// /// </summary>
// /// <param name="reader"></param>
// private UserItemData ReadRow(IDataReader reader)
// {
// var userData = new UserItemData();
// userData.Key = reader.GetString(0);
// userData.UserId = reader.GetGuid(1);
// if (!reader.IsDBNull(2))
// {
// userData.Rating = reader.GetDouble(2);
// }
// userData.Played = reader.GetBoolean(3);
// userData.PlayCount = reader.GetInt32(4);
// userData.IsFavorite = reader.GetBoolean(5);
// userData.PlaybackPositionTicks = reader.GetInt64(6);
// if (!reader.IsDBNull(7))
// {
// userData.LastPlayedDate = reader.GetDateTime(7).ToUniversalTime();
// }
// if (!reader.IsDBNull(8))
// {
// userData.AudioStreamIndex = reader.GetInt32(8);
// }
// if (!reader.IsDBNull(9))
// {
// userData.SubtitleStreamIndex = reader.GetInt32(9);
// }
// return userData;
// }
// protected override void Dispose(bool dispose)
// {
// // handled by library database
// }
// protected override void CloseConnection()
// {
// // handled by library database
// }
// }
//}