浏览代码

schema-less user data

Luke Pulverenti 12 年之前
父节点
当前提交
f233f9c4e5
共有 1 个文件被更改,包括 16 次插入38 次删除
  1. 16 38
      MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs

+ 16 - 38
MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs

@@ -18,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
     public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository
     public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository
     {
     {
         private readonly ConcurrentDictionary<string, Task<UserItemData>> _userData = new ConcurrentDictionary<string, Task<UserItemData>>();
         private readonly ConcurrentDictionary<string, Task<UserItemData>> _userData = new ConcurrentDictionary<string, Task<UserItemData>>();
-        
+
         /// <summary>
         /// <summary>
         /// The repository name
         /// The repository name
         /// </summary>
         /// </summary>
@@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
                 return false;
                 return false;
             }
             }
         }
         }
-        
+
         private readonly IJsonSerializer _jsonSerializer;
         private readonly IJsonSerializer _jsonSerializer;
 
 
         /// <summary>
         /// <summary>
@@ -94,9 +94,8 @@ namespace MediaBrowser.Server.Implementations.Sqlite
 
 
             string[] queries = {
             string[] queries = {
 
 
-                                "create table if not exists useritemdata (key nvarchar, userId GUID, Rating float null, PlaybackPositionTicks bigint, PlayCount int, IsFavorite bit, Played bit, LastPlayedDate bigint null)",
-                                "create unique index if not exists useritemdataindex on useritemdata (key, userId)",
-                                
+                                "create table if not exists userdata (key nvarchar, userId GUID, data BLOB)",
+                                "create unique index if not exists userdataindex on userdata (key, userId)",
                                 "create table if not exists schema_version (table_name primary key, version)",
                                 "create table if not exists schema_version (table_name primary key, version)",
                                 //pragmas
                                 //pragmas
                                 "pragma temp_store = memory"
                                 "pragma temp_store = memory"
@@ -181,26 +180,16 @@ namespace MediaBrowser.Server.Implementations.Sqlite
         {
         {
             cancellationToken.ThrowIfCancellationRequested();
             cancellationToken.ThrowIfCancellationRequested();
 
 
+            var serialized = _jsonSerializer.SerializeToBytes(userData);
+
+            cancellationToken.ThrowIfCancellationRequested();
+
             using (var cmd = connection.CreateCommand())
             using (var cmd = connection.CreateCommand())
             {
             {
-                cmd.CommandText = "replace into useritemdata (key, userId, Rating,PlaybackPositionTicks,PlayCount,IsFavorite,Played,LastPlayedDate) values (@1, @2, @3, @4, @5, @6, @7, @8)";
+                cmd.CommandText = "replace into userdata (key, userId, data) values (@1, @2, @3)";
                 cmd.AddParam("@1", key);
                 cmd.AddParam("@1", key);
                 cmd.AddParam("@2", userId);
                 cmd.AddParam("@2", userId);
-
-                cmd.AddParam("@3", userData.Rating);
-                cmd.AddParam("@4", userData.PlaybackPositionTicks);
-                cmd.AddParam("@5", userData.PlayCount);
-                cmd.AddParam("@6", userData.IsFavorite);
-                cmd.AddParam("@7", userData.Played);
-
-                if (userData.LastPlayedDate.HasValue)
-                {
-                    cmd.AddParam("@8", userData.LastPlayedDate.Value.Ticks);
-                }
-                else
-                {
-                    cmd.AddParam("@8", null);
-                }
+                cmd.AddParam("@3", serialized);
 
 
                 using (var tran = connection.BeginTransaction())
                 using (var tran = connection.BeginTransaction())
                 {
                 {
@@ -246,7 +235,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
             {
             {
                 throw new ArgumentNullException("key");
                 throw new ArgumentNullException("key");
             }
             }
-            
+
             return _userData.GetOrAdd(GetInternalKey(userId, key), keyName => RetrieveUserData(userId, key));
             return _userData.GetOrAdd(GetInternalKey(userId, key), keyName => RetrieveUserData(userId, key));
         }
         }
 
 
@@ -260,7 +249,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
         {
         {
             using (var cmd = connection.CreateCommand())
             using (var cmd = connection.CreateCommand())
             {
             {
-                cmd.CommandText = "select Rating,PlaybackPositionTicks,PlayCount,IsFavorite,Played,LastPlayedDate from useritemdata where key = @key and userId=@userId";
+                cmd.CommandText = "select data from userdata where key = @key and userId=@userId";
 
 
                 var idParam = cmd.Parameters.Add("@key", DbType.String);
                 var idParam = cmd.Parameters.Add("@key", DbType.String);
                 idParam.Value = key;
                 idParam.Value = key;
@@ -268,30 +257,19 @@ namespace MediaBrowser.Server.Implementations.Sqlite
                 var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid);
                 var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid);
                 userIdParam.Value = userId;
                 userIdParam.Value = userId;
 
 
-                var userdata = new UserItemData();
-
                 using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false))
                 using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false))
                 {
                 {
                     if (reader.Read())
                     if (reader.Read())
                     {
                     {
-                        if (!reader.IsDBNull(0))
-                        {
-                            userdata.Rating = reader.GetDouble(0);
-                        }
-                        userdata.PlaybackPositionTicks = reader.GetInt64(1);
-                        userdata.PlayCount = reader.GetInt32(2);
-                        userdata.IsFavorite = reader.GetBoolean(3);
-                        userdata.Played = reader.GetBoolean(4);
-
-                        if (!reader.IsDBNull(5))
+                        using (var stream = GetStream(reader, 0))
                         {
                         {
-                            userdata.LastPlayedDate = new DateTime(reader.GetInt64(5));
+                            return _jsonSerializer.DeserializeFromStream<UserItemData>(stream);
                         }
                         }
                     }
                     }
                 }
                 }
 
 
-                return userdata;
+                return new UserItemData();
             }
             }
         }
         }
     }
     }
-}
+}