From e2562879d86aafc1063e37bfd353c22309e8e237 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 2 Apr 2013 15:25:16 -0400 Subject: Moved userdata to user manager to resolve concurrency issues. must delete userdata and displaypreferences db files. --- .../Sqlite/SQLiteUserDataRepository.cs | 109 ++++++++++++--------- 1 file changed, 63 insertions(+), 46 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs') diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs index dafdce798..f3dede889 100644 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs +++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs @@ -79,8 +79,8 @@ namespace MediaBrowser.Server.Implementations.Sqlite string[] queries = { - "create table if not exists user_data (item_id GUID, user_id GUID, data BLOB)", - "create unique index if not exists idx_user_data on user_data (item_id, user_id)", + "create table if not exists userdata (id GUID, userId GUID, data BLOB)", + "create unique index if not exists userdataindex on userdata (id, userId)", "create table if not exists schema_version (table_name primary key, version)", //pragmas "pragma temp_store = memory" @@ -90,84 +90,101 @@ namespace MediaBrowser.Server.Implementations.Sqlite } /// - /// Save the user specific data associated with an item in the repo + /// Saves the user data. /// - /// The item. + /// The user id. + /// The user data id. + /// The user data. /// The cancellation token. /// Task. - /// item - public Task SaveUserData(BaseItem item, CancellationToken cancellationToken) + /// + /// userData + /// or + /// cancellationToken + /// or + /// userId + /// or + /// userDataId + /// + public Task SaveUserData(Guid userId, Guid userDataId, UserItemData userData, CancellationToken cancellationToken) { - if (item == null) + if (userData == null) { - throw new ArgumentNullException("item"); + throw new ArgumentNullException("userData"); } - if (cancellationToken == null) { throw new ArgumentNullException("cancellationToken"); } - + if (userId == Guid.Empty) + { + throw new ArgumentNullException("userId"); + } + if (userDataId == Guid.Empty) + { + throw new ArgumentNullException("userDataId"); + } + + cancellationToken.ThrowIfCancellationRequested(); + return Task.Run(() => { + var serialized = _protobufSerializer.SerializeToBytes(userData); + cancellationToken.ThrowIfCancellationRequested(); var cmd = connection.CreateCommand(); - - cmd.CommandText = "delete from user_data where item_id = @guid"; - cmd.AddParam("@guid", item.UserDataId); - + cmd.CommandText = "replace into userdata (id, userId, data) values (@1, @2, @3)"; + cmd.AddParam("@1", userDataId); + cmd.AddParam("@2", userId); + cmd.AddParam("@3", serialized); QueueCommand(cmd); - - if (item.UserData != null) - { - foreach (var data in item.UserData) - { - cmd = connection.CreateCommand(); - cmd.CommandText = "insert into user_data (item_id, user_id, data) values (@1, @2, @3)"; - cmd.AddParam("@1", item.UserDataId); - cmd.AddParam("@2", data.UserId); - - cmd.AddParam("@3", _protobufSerializer.SerializeToBytes(data)); - - QueueCommand(cmd); - } - } }); } /// - /// Gets user data for an item + /// Gets the user data. /// - /// The item. - /// IEnumerable{UserItemData}. - /// item - public IEnumerable RetrieveUserData(BaseItem item) + /// The user id. + /// The user data id. + /// Task{UserItemData}. + /// + /// userId + /// or + /// userDataId + /// + public async Task GetUserData(Guid userId, Guid userDataId) { - if (item == null) + if (userId == Guid.Empty) { - throw new ArgumentNullException("item"); + throw new ArgumentNullException("userId"); + } + if (userDataId == Guid.Empty) + { + throw new ArgumentNullException("userDataId"); } var cmd = connection.CreateCommand(); - cmd.CommandText = "select data from user_data where item_id = @guid"; - var guidParam = cmd.Parameters.Add("@guid", DbType.Guid); - guidParam.Value = item.UserDataId; + cmd.CommandText = "select data from userdata where id = @id and userId=@userId"; + + var idParam = cmd.Parameters.Add("@id", DbType.Guid); + idParam.Value = userDataId; - using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) + var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid); + userIdParam.Value = userId; + + using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false)) { - while (reader.Read()) + if (reader.Read()) { using (var stream = GetStream(reader, 0)) { - var data = _protobufSerializer.DeserializeFromStream(stream); - if (data != null) - { - yield return data; - } + return _protobufSerializer.DeserializeFromStream(stream); } } } + + return null; } } } -- cgit v1.2.3